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 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
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);
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
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.
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
@+
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
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;
}

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
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
29 nov. 2008 à 11:49
Je vais faire un test chez moi.
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 ?
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
29 nov. 2008 à 12:34
précision:
GetWindowLong() marche avec les boites de dialogue sauf pour GWL_ID.
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
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
Rejoignez-nous