SetDlgItemInt à la suite

Signaler
Messages postés
13
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
25 avril 2004
-
Messages postés
13
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
25 avril 2004
-
Bonjour,

Après avoir déclaré et affecté une valeur à 2 variables globales,
je crée 1 boites de dialogues avec 2 fenetres edit dans lesquelles j'envoie les valeurs grâce à un SetDlgItemInt.

Pour remplir les 2 boites de dialogues, je fais 2 appels SetDlgItemInt à la suite avec les variables et WM_ID correspondant.
Le 1er appel SetDlgItemInt se passe sans problème : la valeur s'affiche dans la fenetre edit qui lui correspond.
Par contre, jamais la 2ème (valeur qui s'affiche est un zéro).

Pourriez-vous m'expliquer se qui s'est passé et comment y remédier ?
Merci
sacksith

9 réponses

Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
Bonjour,

Se serai cool de pouvoir voir le source poru voir si il y a une erreur de convertion par exemple, ...

@+
Arnotic
Admin CS, MVP Visual C++
Messages postés
13
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
25 avril 2004

Bonjour,
voilà en gros le code :
//Debut code

//variables globales
int var1=5;
int var2=7;
HWND B2;
LRESULT CALLBACK LCB2(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);

//Window procedure
LRESULT CALLBACK WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
//...
case WM_PAINT:
B2=CreateDialog(hInst, MAKEINTRESOURCE(B2BOX), CadreD, (DLGPROC)LCB2);
ShowWindow(B2, 1);
}

LRESULT CALLBACK LCB2(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch( uMsg )
{
case WM_INITDIALOG :
SetDlgItemInt(hDlg, IDC_VAR1, var1, false);
SetDlgItemInt(hDlg, IDC_VAR2, var2, false);

// C'est là que ça me pose problème : le 2e SetDlgItemInt, celui avec var2, ne s'affiche pas dans la fenetre edit.
// Et quand j'inverse, que je met var2 en premier, c'est var1 qui ne s'affiche plus. Il doit y avoir un problème de réinitialisation de SetDlgItemInt, plus qu'un problème de d'erreur de conversion.
//Fin code

@+
sacksith
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
Bonjour,

Si tu veux mettre des les valeurs 5 et 7 n'utilise pas SetDlgItemInt car il va prendre la correspondance en ascii.

Utilise plutôt :

char szbuff[]='5';
SetWindowText(GetDlgItem(hDlg, IDC_VAR1), (char*)&szbuff);

szbuff = '7';
SetWindowText(GetDlgItem(hDlg, IDC_VAR2), (char*)&szbuff);

De cette manière c'est plus juste. Tu mets réellement la chaine 5, et 7 dans des textbox.

@+
Arnotic
Admin CS, MVP Visual C++
Messages postés
13
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
25 avril 2004

Salut,
et tout d'abord merci pour la rapidité de tes réponses !

[...]
Oui mais voilà, si je veux justement afficher des valeurs entières.
En fait 5 et 7 sont des valeurs par défaut qui doivent s'afficher à l'ouverture de la fenetre mais l'utilisateur doit pouvoir les modifier.
d'où l'utilisation d'une fenetre edit.

dom
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
Bonjour,

Mais l'utilisateur peut modifier les valeurs même en utilisant SetWindowText.

Si tu veux récupérer les valeurs tu peux faire :

GetWindowText(GetDlgItem(hDlg, IDC_VAR1), (char*)&szbuff);
int var1 = atoi((char*)&szbuff);

Tu vois le truc ?
@+
Arnotic
Admin CS, MVP Visual C++
Messages postés
13
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
25 avril 2004

Hi,

>>GetWindowText(GetDlgItem(hDlg, IDC_VAR1), (char*)&szbuff);
>>int var1 = atoi((char*)&szbuff);

Ok, je vois. Et je vais probablement garder cette solution.
Mais quand même, saurais-tu pourquoi on ne peut pas utiliser 2 appel à SetDlgItemInt à la suite ?

Dans le MS W32 reference, il est question de WM_SETTEXT.
Mais j'ignore comment l'utiliser. Si tu peux m'éclaircir.

@+
dom
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
Bonjour,

Pour WM_SETTEXT c'est la même chose sauf que tu utilises

SendMessage(handle, WM_SETTEXT, NULL, (char*)&szbuff);

et pour récupérer

SendMessage(handle, WM_GETTEXT, 1024, (char*)&szbuff); et szbuff contient ta chaine.

(1024 = nombre maximum d'octects à copier)

Bref, SetWindowText et GetWindowText sont des macro de SendMessage et sont plus direct à utiliser comme tu veux c'est la même chose :)

@+
Arnotic
Admin CS, MVP Visual C++
Messages postés
13
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
25 avril 2004

Salut,
Merci Arnotic pour tes éclaircissements. Je vais pouvoir continuer avec ce que j'ai.
dom
Messages postés
13
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
25 avril 2004

Salut,

Après modifications et tests, voilà ce que je dois écrire pour pouvoir utiliser SetDlgItemInt.

//debut code
// Je garde tout ce qui précède, cf. posts précédents

LRESULT CALLBACK LCB2(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
unsigned var11=var1;
unsigned var22=var2;

switch(uMsg)
{
case WM_INITDIALOG :
SetDlgItemInt(hDlg, IDC_EVAPEDIT, var11, false);
SetDlgItemInt(hDlg, IDC_DIFFEDIT, var22, false);

//fin code
En gros, je dois créer des variables locales (var11 et var22) que j'initialise avec la valeur des variables globales var1 et var2.

C'est marrant de ne pouvoir utiliser 2 variables globales dans des SetDlgItemInt à la suite.

dom
PS je me demande toujours s'il n'existe pas une sorte de réinitialisation de SetDlgItemInt de manière à y appeler non pas des variables locales mais globales.