DROPDOWN LISTBOX (WIN32)

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 4 mai 2006 à 14:31
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 5 mai 2006 à 10:38
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/37430-dropdown-listbox-win32

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 mai 2006 à 10:38
push ebx
met sa valeur sur la pile pour restituer en sortie de fonction.
Aller dur forum asmfr pour le reste, ça évitera de flooder cette source avec des questions sans rapport au sujet principal.
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
5 mai 2006 à 00:28
Lol je veux bien mais bon je voulais juste savoir pourquoi ces registres et les réponses aux questions que j'ai posé dans les commentaires sur ta fonction lol :)

J'suis chiant je sais ;)
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 mai 2006 à 17:37
Allez, pour Joky (quelques cycles en moins):

__declspec(naked) int __fastcall bnatoi(char *szsrc)
{ // ECX = szsrc
__asm {
xor edx, edx
mov [esp-4], ebx
mov dl, [ecx]
xor eax, eax
xor ebx, ebx
cmp dl, '-'
jb short nbrEXIT
jne short noPOINT
inc ecx
dec ebx
nbrLOOP:
mov dl, [ecx]
noPOINT:
cmp dl, '0'
jb short nbrSTOP
cmp dl, '9'
ja short nbrSTOP
lea eax, [eax+eax*4]
sub dl, '0'
add eax, eax
inc ecx
add eax, edx
jmp short nbrLOOP
nbrSTOP:
add eax, ebx
xor eax, ebx
nbrEXIT:
mov ebx, [esp-4]
ret 0
}
}

lea peut faire addition, soustraction et multiplication en 1 passe.
donc: lea eax, [eax+eax*4]
fait: eax = eax * 5;
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 mai 2006 à 17:26
WM_MOUSEMOVE et les autres messages de la souris sont effectivement recus automatiquement car la Listbox à la capture de la souris (je fais un SetCapture).
WM_KEYDOWN & WM_MOUSEWHEEL sont deux messages utiles qui ne sont pas envoyés à la ListBox car elle n'a pas le focus, et on ne peut pas le lui donner
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 mai 2006 à 17:22
Mon dieu, voila ce qui arrive quand on commente de l'assembleur!
Je me doute que ecx contient le param, qu'est ce que ca pourrait être d'autre...
Je précise que c'est BruNews qui a écrit cette fonction, pas moi
Maintenant que tu sais ce que contient ecx, tu va peut être mieux comprendre
Taron31 Messages postés 199 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 28 février 2008
4 mai 2006 à 17:21
OK merci, autre chose : en réalité tu fait passer les messages WM_KEYDOWN & WM_MOUSEWHEEL à la ListboxProc et les autres y sont capturés directement sans passer par la WndProc principale ?
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
4 mai 2006 à 17:17
Bon allez dites moi si j'me trompe

xor eax, eax //Mettre eax à 0, pourquoi pas mov eax, 0 ???
push ebx //Placer ebx sur la pile. à quoi correspond ebx ?
xor edx, edx //Mettre edx et ebx à 0
xor ebx, ebx //...

cmp byte ptr[ecx], '-' //On compare le ??? de ecx avec '-'
jne short L1 //On va à L1 si ce n'est pas égal
inc ecx //On incrément ecx qui correspond au compteur je crois ?
mov edx, 0xFFFFFFFF //On place 0xFFFFFFFF dans edx ? pourquoi ?

L1: //étiquette L1
mov bl, byte ptr[ecx] //On place le premier bit de ecx ? dans bl
cmp bl, '0' //On le compare à '0'
jb short L2 //On saute à L2 si en dessous de '0'
cmp bl, '9' //On le compare à '9'
ja short L2 //On saute à L2 si au dessus de '0'
lea eax, dword ptr[eax + 4 * eax] //???
sub bl, '0' //On soustrait '0' à bl
add eax, eax //On ajoute eax dans eax
inc ecx //Incrémente le compteur ?
add eax, ebx //ajouter eax et ebx dans eax, pk ? que contient ebx
jmp short L1 //On fait en boucle

L2:
add eax, edx //ajouter eax et edx placé dans eax
pop ebx //On enlève de la pile et on met dan ebx
xor eax, edx //???
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 mai 2006 à 16:42
Si on ne le fait pas, ca pose des problèmes quand on a des fenêtres filles que se chevauchent (ici ca ne se voit pas car il n'y a pas déja de fenêtre fille à l'endroit ou on crée la listbox).
En gros si tu crée deux fenêtres filles au même endroit, elles vont se bagarrer pour être au premier plan et en général, on a des résultats étonnants
Taron31 Messages postés 199 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 28 février 2008
4 mai 2006 à 16:38
Vecchio56 : pourquoi doit-on placer le bureau comme Parent (HWND_DESKTOP) à la ListBox ?
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 mai 2006 à 14:50
Effectivement, c'est corrigé
Coup de bol (?), il se déchargeait quand même
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 mai 2006 à 14:31
Gaffe si tu es en entrypoint perso, entoure le return final dans un #ifdef pour y mettre un ExitProcess() au lieu du return sinon deans de nombreuses situations ton exe ne déchargera pas.
Rejoignez-nous