Un rectangle dans IDD_DIALOG2 ?

Résolu
F0ra
Messages postés
111
Date d'inscription
mardi 18 septembre 2007
Statut
Membre
Dernière intervention
29 décembre 2008
- 27 nov. 2008 à 18:05
F0ra
Messages postés
111
Date d'inscription
mardi 18 septembre 2007
Statut
Membre
Dernière intervention
29 décembre 2008
- 29 nov. 2008 à 13:04
Bonjour,<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>












Pourquoi quand je dessine un rectangle, il apparaît aussi dans l’autre fenêtre IDD_DIALOG2 ?













case
WM_PAINT:









{    









PAINTSTRUCT ps;









HDC hdc;









hdc = BeginPaint(hwnd, &ps);









 








Rectangle(hdc, 000, 400, 800, 500);









EndPaint(hwnd, &ps);









break
;












}













merci












@+

10 réponses

racpp
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
14
29 nov. 2008 à 12:20
Tu as raison, il parait que GetWindowLong() ne marche pas avec les boites de dialogue. Je vais voir comment obtenir l'identificateur autrement.
Pour le 2e CALLBACK, copie el code de la procédure DlgProc et colle le quelque part puis renomme en DlgProc2. Puis tu fais:
DialogBox(0,MAKEINTRESOURCE(IDD_DIALOG2), hdlg, DlgProc2);
3
racpp
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
14
27 nov. 2008 à 21:56
Salut,
Normalement, cela ne peut arriver que si les deux fenêtres ont la même procédure. Si c'est voulu, il ne faudra dessiner le rectangle que pour celle ayant comme identificateur IDD_DIALOG1. Tu peux récupérer ce dernier grâce à GetWindowLong(hwnd,GWL_ID). Sinon, chaque fenêtre doit avoir sa propre procédure. Ainsi, le message WM_PAINT sera traité différemment dans chaque procédure.
0
F0ra
Messages postés
111
Date d'inscription
mardi 18 septembre 2007
Statut
Membre
Dernière intervention
29 décembre 2008

29 nov. 2008 à 09:28
salut,
je je n’y arrive pas
voici le code complet :

#include

"code.h"

#include <Commctrl.h>

#include <string.h>HINSTANCE hInst;
HWND hdlg,hactive;

//************************
BOOL CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

hdlg=hwnd;

switch(msg)
{

case WM_COMMAND:
{

switch (LOWORD(wParam))
{

case IDOK:
DialogBox(0,MAKEINTRESOURCE(IDD_DIALOG2), hdlg, DlgProc);

break;
}

break;
}

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc;
hdc = BeginPaint(hwnd, &ps);
HBRUSH BrushBlack = CreateSolidBrush(RGB(0, 0, 0));
SelectObject(hdc, BrushBlack);
Rectangle(hdc, 000, 100, 400, 200);
Ellipse(hdc, 300, 20, 400, 120);
EndPaint(hwnd, &ps);

break;
}

case WM_CLOSE:
{
EndDialog(hwnd,0);

break;
}

default:

return FALSE;
}

return TRUE;
}
//************************

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,
int nShowCmd)
{
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgProc);

return 0;
}

//************************

Merci Beaucoup
@+
0
racpp
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
14
29 nov. 2008 à 10:50
Tu utilises effectivement une seule procédure (DlgProc) pour les deux boites de dialogue. Tu peux faire comme ceci:
case WM_PAINT:
{
    ULONG id=GetWindowLong(hdlg, GWL_ID);
    if(id==IDD_DIALOG1) break;
    //....
    DeleteObject(BrushBlack); // Pour détruire le BRUSH
    break;
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
F0ra
Messages postés
111
Date d'inscription
mardi 18 septembre 2007
Statut
Membre
Dernière intervention
29 décembre 2008

29 nov. 2008 à 11:22
Je te remercie de m'avoir répondu.
Il y a toujours le rectangle qui s'affiche dans les 2 Forms.<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>










Certainement un petit truc qui ne va pas.









J'ai essayé plusieurs chose comme changer:
if(id==IDD_DIALOG1) break; par  if(id==IDD_DIALOG2) break;
if(id==IDD_DIALOG1) break; par  if(id==IDD_DIALOG1) { Rectangle(hdc, ...}
etc..









Et je ne vois pas d'ou vient le problème. Le paramétrage de GetWindowLong ?

case
WM_PAINT:
{
ULONG id=GetWindowLong(hdlg, GWL_ID);

if(id==IDD_DIALOG1)
break;

PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
Rectangle(hdc, 000, 100, 400, 200);
EndPaint(hwnd, &ps);

break;
}













Merci encore
0
racpp
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
14
29 nov. 2008 à 11:49
Je vais faire un test chez moi.
0
F0ra
Messages postés
111
Date d'inscription
mardi 18 septembre 2007
Statut
Membre
Dernière intervention
29 décembre 2008

29 nov. 2008 à 11:51
sinon, comment je paramétre le 2eme CALLBACK ?
0
racpp
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
14
29 nov. 2008 à 12:34
précision:
GetWindowLong() marche avec les boites de dialogue sauf pour GWL_ID.
0
F0ra
Messages postés
111
Date d'inscription
mardi 18 septembre 2007
Statut
Membre
Dernière intervention
29 décembre 2008

29 nov. 2008 à 12:53
Merci,
je vais essayer
0
F0ra
Messages postés
111
Date d'inscription
mardi 18 septembre 2007
Statut
Membre
Dernière intervention
29 décembre 2008

29 nov. 2008 à 13:04
cool, ça fonctionne avec un 2eme CALLBACK
0