Application MDI [Résolu]

Signaler
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
-
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
-
Bonjour a tous,
voila j'essaie de créé ma première application MDI, mais j'ai beaucoup de mal, surtout que je n'ai pas trouvé de tutorial sur le net, et que les quelques codes que j'ai vu ne m'ont pas trop aidé .
Bref j'ai donc ecrit ce code:

LRESULT CALLBACK ChildProc(HWND hWnd, UINT mes, WPARAM wParam, LPARAM lParam)
{
switch(mes)
{
case WM_CREATE:
CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD|WS_VSCROLL|ES_MULTILINE|WS_VISIBLE|ES_AUTOVSCROLL|ES_WANTRETURN, 0, 0, 0, 0, hWnd, NULL, hInst, NULL);
ShowWindow(hWnd, SW_SHOWNORMAL);
SetFocus(hWnd);
return TRUE;

default:
return DefWindowProc(hWnd, mes, wParam, lParam);
}
}

// fonction de la fenetre
LRESULT CALLBACK MainProc(HWND hWnd, UINT mes, WPARAM wParam, LPARAM lParam)
{
switch(mes)
{
// creation de la fenetre
case WM_CREATE:
// configuration fils
CLIENTCREATESTRUCT ccs;
ccs.hWindowMenu = NULL;
ccs.idFirstChild = 200;
clientHwnd = CreateWindowEx(0, "MDICLIENT", NULL, WS_CHILD|WS_CLIPCHILDREN|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, (HMENU)NULL, hInst, (void*)&ccs);

// definition classe du fils
WNDCLASSEX clientWnd;
clientWnd.cbClsExtra = 0;
clientWnd.cbSize = sizeof(WNDCLASSEX);
clientWnd.cbWndExtra = 0;
clientWnd.hbrBackground = GetSysColorBrush(COLOR_BACKGROUND);
clientWnd.hCursor = LoadCursor(NULL, IDC_ARROW);
clientWnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
clientWnd.hIconSm = clientWnd.hIcon;
clientWnd.hInstance = hInst;
clientWnd.lpfnWndProc = ChildProc;
clientWnd.lpszClassName = "Editor";
clientWnd.lpszMenuName = NULL;
clientWnd.style = CS_DBLCLKS|CS_PARENTDC;
RegisterClassEx(&clientWnd);
return TRUE;

// demande de fermeture application
case WM_CLOSE:
if(MessageBox(hWnd, "Etes-vous sur de vouloir quitter ?", "Quitter ?", MB_ICONINFORMATION|MB_YESNO) == IDYES)
PostQuitMessage(0);
return 0;

// selection item
case WM_COMMAND:
{
switch(wParam)
{
// Quitter
case ID_MAIN_QUITTER:
// demande confirmation
if(MessageBox(hWnd, "Etes-vous sur de vouloir quitter le programme ?", "Quitter ?", MB_ICONINFORMATION|MB_YESNO) == IDYES)
PostQuitMessage(0); // fin du programme
return TRUE;

// ancien prog
case ID_MAIN_OPEN:
DialogBox(hInst, MAKEINTRESOURCE(IDD_MAIN), hWnd, OpenProc);
return TRUE;

// menu "A propos"
case ID_MAIN_INFO:
DialogBox(hInst, MAKEINTRESOURCE(IDD_INFO), hWnd, NULL);
return TRUE;

// nouveau projet
case ID_MAIN_NEW:
if(!CreateMDIWindow("Editor", "Untitled*", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, clientHwnd, hInst, NULL))
MessageBox(hWnd, "Erreur", "Erreur", MB_OK);
return TRUE;
}
}

default:
return DefWindowProc(hWnd, mes, wParam, lParam);
}
}

// fonction WinMain (point d'entrée du programme)
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// definition variable
WNDCLASSEX fenetre; // class de notre fenetre
HWND f_hWnd; // HWND de la fenetre
MSG msg; // variable de message

hInst = hInstance; // hinstance

// definition de notre class fenetre
fenetre.cbSize = sizeof(WNDCLASSEX);
fenetre.style = CS_HREDRAW | CS_VREDRAW;
fenetre.lpfnWndProc = MainProc;
fenetre.cbClsExtra = 0;
fenetre.cbWndExtra = 0;
fenetre.hInstance = hInstance;
fenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION);
fenetre.hCursor = LoadCursor(NULL, IDC_ARROW);
fenetre.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW+2);
fenetre.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);
fenetre.lpszClassName = "std";
fenetre.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&fenetre); // enregistrement de la class

// creation de la fenetre
f_hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "std", "AccessGen", WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL, hInstance, NULL);
ShowWindow(f_hWnd, SW_SHOW);

SetFocus(f_hWnd); // donne focus

// reception des messages
while(GetMessage(&msg, NULL, 0, 0) == TRUE)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0; // fin app
}

cela m'inidque que la fenetre fils est créé, mais je ne vois rien !
est-ce que quelqu'un peut me dire pourquoi?
Merci par avance
Bob...

"La chance accorde ses faveur aux esprits avertis..."

4 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Tu ne donne pas de taille pour clientHwnd, le système lui met sans doute 0. Ajoute ces lignes dans MainProc:

case WM_SIZE:

SetWindowPos(clientHwnd, 0, 0, 0, LOWORD(lParam), HIWORD(lParam), SWP_NOMOVE);

return 0;

(WM_SIZE est envoyé aussi à la création, donc ne change que ca)



Et puis ajoute le style WS_CLIPCHILDREN à ta fenêtre principale
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
10
effectivement ca marche maintenant ! merci à toi.
par contre quand je met le style WS_CLIPCHILDREN bah la fenetre fils ne s'affiche pas !
Bob...

"La chance accorde ses faveur aux esprits avertis..."
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
WS_CLIPCHILDREN pour la fenêtre principale (f_hWnd). Ca évitera juste le clignotement lors du redimentionnement
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
10
oui mais ca me ne m'affiche pas le fils !
bref on s'en fou, vu que ta répondu a ma question et que tout marche comme je veux ! merci a toi !
Bob...

"La chance accorde ses faveur aux esprits avertis..."