Parcours tableau de HWND [Résolu]

Signaler
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
-
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
-
Bonjour,

Voila mon pb :
Je declare un tableau de HWND comme suit :

hwndCmd HWND 10 dup (?)

Ensuite, je veux créer 10 boutons et stocker leur handle ds chak element de ce tableau, voici le code :

;Creation des controles en faisant une boucle;
mov y, 0
xor edx, edx
mov esi, hwndCmd
Create:
cmp edx, 10
je Fini
mov eax, edx
add y, eax
add y, 50
INVOKE CreateWindowEx, NULL, ADDR ClassButton, ADDR AppName, \
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 0, y, 50, 40, \
hwnd, NULL, hInst, NULL
mov esi, eax
inc edx
add esi, 4
jmp Create
Fini:

Voila, le code passe a la compilation mais pas a l'execution, si kelkun pouvait m'aider..

Merci d'avance !

++

Alhexman

12 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
ou comments sont tronques mais on peut les avoir par copier/coller. Nix va s'en occuper des que possible.
On stocke ce qu'on veut dans EDI ou nimporte quel autre registre pendant l'execution du bloc mais TOUS registres autres que EAX,ECX et EDX doivent etre restitues en sortie comme tu les as trouves en entree.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
mov [esi], eax ; adresse de

vire ce 'invoke' et sers toi des registres dans une boucle pour faire une boucle optimisee.

cmp edx, 10
en haut de boucle alors que tu viens de le mettre a 0, non coherent.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
ah oui, oublie de preciser que l'adresse d'un tableau ou autre est 'offset mnemo'.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Ok merci, ca marche maintenant, mais est ce que c necessaire que je garde le handle de tous les controles ? Je pense pas, si ?
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Enfin, regarde le code, rien que pour créer les controles, jtrouve ca enorme (c de l'asm mais bon), j'ai pas encore remplacé l'invoke par un call, ca va se faire :

;Creation des controles en faisant une boucle;
mov x, 50
mov i, 0
mov esi, offset hwndNum
;mov edi, offset hwndOp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
prem:
invoke dwtoa, i, addr buf
INVOKE CreateWindowEx, NULL, ADDR ClassButton, ADDR buf, \
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, x, 50, 30, 30, \
hwnd, NULL, hInst, NULL

mov [esi], eax
add esi, 4
add x, 30
inc i
cmp i, 3
jb prem
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INVOKE CreateWindowEx, NULL, ADDR ClassButton, ADDR Plus, \
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, x, 50, 30, 30, \
hwnd, NULL, hInst, NULL

;mov [edi], eax
;add edi, 4


mov x, 50
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
sec:
invoke dwtoa, i, addr buf
INVOKE CreateWindowEx, NULL, ADDR ClassButton, ADDR buf, \
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, x, 80, 30, 30, \
hwnd, NULL, hInst, NULL

mov [esi], eax
add esi, 4
add x, 30
inc i
cmp i, 6
jb sec
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INVOKE CreateWindowEx, NULL, ADDR ClassButton, ADDR Moins, \
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, x, 80, 30, 30, \
hwnd, NULL, hInst, NULL

;mov [edi], eax
;add edi, 4

mov x, 50
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
trois:
invoke dwtoa, i, addr buf
INVOKE CreateWindowEx, NULL, ADDR ClassButton, ADDR buf, \
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, x, 110, 30, 30, \
hwnd, NULL, hInst, NULL

mov [esi], eax
add esi, 4
add x, 30
inc i
cmp i, 9
jb trois
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INVOKE CreateWindowEx, NULL, ADDR ClassButton, ADDR Divi, \
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 140, 110, 30, 30, \
hwnd, NULL, hInst, NULL

;mov [edi], eax
;add edi, 4

mov i, 0
invoke dwtoa, i, addr buf
INVOKE CreateWindowEx, NULL, ADDR ClassButton, ADDR buf , \
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 80, 140, 30, 30, \
hwnd, NULL, hInst, NULL

mov [esi], eax

INVOKE CreateWindowEx, NULL, ADDR ClassButton, ADDR Mult, \
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 140, 140, 30, 30, \
hwnd, NULL, hInst, NULL

;mov [edi], eax

Je voulais me servir de edi pour stocker l'adresse de mon 2eme tableau, mais ya erreur, kel registre (otre ke esi) je peu utiliser pour faire ca ?
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Oula, ya un pb la ! c pa la premiere fois que je le remark ! Les commentaires sont troqué sur la droite !
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Et voila deja servi, Nix vient de faire la rustine anti tronquage.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Ptite kestion encore, pour conserver la valeur des registres au debut du prog, c "pushad", "pusha" ? et pour depiler "popad", "popa" ? Ou je dois "pusher" chak registre, et les depiler en sortant ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
non pas au debut du prog mais de chaque bloc (fonction en C).
push esi
push edi
voila par exemple.

en sortie:
pop edi
pop esi

fais bien gaffe a l'ordre des POPs, juste question de pure logique, le dernier push sera le 1er pop.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
J'ai encore un pb (decidement !) : j'utilise une boite de dialogue, enfin j'aimerais car c'est plus simple que la creation d'une fenetre, des boutons...Mais le pb, c'est que je n'arrive pas a lier mon fichier resssource a mon prog asm, je pense (pas sur) kil doit exister une option au linkage, mais connais po, si tu pouvais m'eclairer BruNews... Merci

++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Si tu bosses avec MASM32 regarde ma source Mastermind.
Il y a boite de dialog etc... bien sur le .bat pour linker.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut,

plutot que d'utiliser un tableau de handle, tu pourrais avoir une gestion + simple avec les identifiants car tu pourra faire une enumeration:

IDC_BASE EQU 1000h
IDC_EDIT1 EQU IDC_BASE + 0
IDC_EDIT2 EQU IDC_BASE + 1
IDC_EDIT2 EQU IDC_BASE + 2
...

mov ecx,index
invoke GetDlgItem,hMain,ADDR [IDC_BASE+ecx]
ou
SendDlgItemMessage,hMain,ADDR[IDC_BASE+ecx],WM_XX,wP,lP

@++