Salut!
Je voudrais savoir s'il est possible de coder une
application MDI en C++ (en mettant presque tout le code
dans la classe):
#include <windows.h>
//Code de la classe
class CMDIApp
{
HWND hMain;
HWND hMDIClient; //Client MDI
HINSTANCE hInst;
static LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CMDIApp * MDIApp = (CMDIApp *)GetWindowLong (hWnd, GWL_USERDATA);
switch (uMsg)
{
case WM_CREATE:
SetWindowLong (hWnd, GWL_USERDATA, (LONG) ((LPCREATESTRUCT) lParam) -> lpCreateParams);
MDIApp = (CMDIApp*) GetWindowLong (hWnd, GWL_USERDATA); //On obtient la classe à nouveau (car avant, le pointeur n'était pas valide)
CLIENTCREATESTRUCT ccs;
ccs.hWindowMenu = NULL;
ccs.idFirstChild = 500;
MDIApp -> hMDIClient = CreateWindow ("MDIClient", NULL,
WS_CHILD | WS_CLIPCHILDREN |WS_VSCROLL | WS_HSCROLL, 0, 0, 0, 0,
MDIApp -> hMain, (HMENU) 1, MDIApp -> hInst, (PVOID) &ccs);
return0;
}
return DefFrameProc (hWnd, MDIApp -> hMDIClient, uMsg, wParam, lParam); //Je pense que l'erreur se produit ici
}
public:
CMDIApp (HINSTANCE hInstance){hInst = hInstance;}
BOOL CreateWnd ()
{
WNDCLASS wc; //Classe
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = GetSysColorBrush (COLOR_BTNFACE);
wc.lpszMenuName = NULL;
wc.lpszClassName = "WndClass";
if (!RegisterClass (&wc)) //Enregistrement de la classe
return FALSE;
//Création de la fenêtre
hMain = CreateWindow ("WndClass", "Titre", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
HWND_DESKTOP, NULL, hInst, this);
if (hMain == NULL)
return FALSE;
ShowWindow (hMain, SW_SHOW); //Affichage de la fenêtre
MSG msg;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return TRUE;
}
};
//WinMain
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hprevInstance, LPSTR lpCmdLine, int nCmdShow)
{
CMDIApp MDIApp (hInstance);
MDIApp.CreateWnd ();
return0;
}
Je compile, aucune erreur, aucun warning; cependant, au lancement du programme, erreur!
L'erreur se produit ici (je pense):
return DefFrameProc (hWnd, MDIApp -> hMDIClient, uMsg, wParam, lParam); //Dans WndProc
Supposition : Comme la fenêtre n'a pas encore reçu le message WM_CREATE,
GetWindowLong (hWnd, GWL_USERDATA) ne retourne pas un pointeur valide.
Ai-je tort ou raison ? Dans ce cas aidez-moi, s'il vous plaît !!!
PS: Je n'ai pas codé la création des fenêtres enfants,
je pense que c'est inutil, car il y a déjà l'erreur.