Application MDI

Résolu
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 - 6 juil. 2005 à 13:03
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 - 6 juil. 2005 à 20:48
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
6 juil. 2005 à 18:54
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
3
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
6 juil. 2005 à 19:21
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..."
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
6 juil. 2005 à 19:33
WS_CLIPCHILDREN pour la fenêtre principale (f_hWnd). Ca évitera juste le clignotement lors du redimentionnement
0
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
6 juil. 2005 à 20:48
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..."
0
Rejoignez-nous