Всем здравствуйте. Не получается написать простое MDI приложение на C++. Вот перепеписаный на C++ исходник из туториала Икзелиона. Код (Text): #include <windows.h> // ресурс MDI.rc из туториала Икзелиона #define IDR_MAINMENU 101 #define IDR_CHILDMENU 102 #define IDM_EXIT 40001 #define IDM_TILEHORZ 40002 #define IDM_TILEVERT 40003 #define IDM_CASCADE 40004 #define IDM_NEW 40005 #define IDM_CLOSE 40006 #define CHILDS_SUBMENU 1 #define ID_FIRST_CHILD 100000 LRESULT CALLBACK MainWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); LRESULT CALLBACK ChildProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); HMODULE hInstance; ATOM MainClass; ATOM ChildClass; char szChildClass[]="ChildWndClass"; HWND hFrame; HWND hMainWnd; HWND hClient; HMENU hMainMenu; HMENU hChildMenu; HICON hIcon; MDICREATESTRUCT mcs; VOID main(char *lpRet,int UnkArg1,char *InitialRsp,int UnkArg3){ MSG msg; WNDCLASSEX wc; hInstance=GetModuleHandle(0); hIcon=LoadIcon(0,(LPSTR) IDI_APPLICATION); wc.cbSize=sizeof(WNDCLASSEX); wc.style=CS_HREDRAW+CS_VREDRAW; wc.lpfnWndProc=&MainWndProc; wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hInstance=hInstance; wc.hIcon=hIcon; wc.hCursor=LoadCursor(0,IDC_ARROW); wc.hbrBackground=(HBRUSH) COLOR_APPWORKSPACE; wc.lpszMenuName=(LPSTR) IDR_MAINMENU; wc.lpszClassName="MainWndClass"; wc.hIconSm=hIcon; MainClass=RegisterClassEx(&wc); wc.lpfnWndProc=&ChildProc; wc.hbrBackground=(HBRUSH) COLOR_WINDOW+1; wc.lpszClassName=(LPSTR) &szChildClass; ChildClass=RegisterClassEx(&wc); hFrame=CreateWindowEx(0,(LPSTR) MainClass,"MDI", WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,hInstance,0); ShowWindow(hFrame,SW_SHOWNORMAL); UpdateWindow(hFrame); hChildMenu=LoadMenu(hInstance,(LPSTR) IDR_CHILDMENU); while (GetMessage(&msg,0,0,0)!=0){ if (TranslateMDISysAccel(hClient,&msg)) continue; TranslateMessage(&msg); DispatchMessage(&msg); }; ExitProcess(msg.wParam); }; LRESULT CALLBACK MainWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam){ if (uMsg==WM_CREATE){ hMainWnd=hwnd; CLIENTCREATESTRUCT ClientStruc; hMainMenu=GetMenu(hMainWnd); ClientStruc.hWindowMenu=GetSubMenu(hMainMenu,CHILDS_SUBMENU); ClientStruc.idFirstChild=ID_FIRST_CHILD; hClient=CreateWindowEx(0,"MDICLIENT",0,WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, hMainWnd,0,hInstance,&ClientStruc); mcs.hOwner=hInstance; mcs.szClass=(LPSTR) &szChildClass; mcs.szTitle="ChildWindow"; mcs.style=0; mcs.lParam=0; mcs.x=CW_USEDEFAULT; mcs.y=CW_USEDEFAULT; mcs.cx=CW_USEDEFAULT; mcs.cy=CW_USEDEFAULT; }else if (uMsg==WM_COMMAND){ if (lParam==0){ if (LOWORD(wParam)==IDM_EXIT){ DestroyWindow(hwnd); }else if (LOWORD(wParam)==IDM_TILEHORZ){ SendMessage(hClient,WM_MDITILE,MDITILE_HORIZONTAL,0); }else if (LOWORD(wParam)==IDM_TILEVERT){ SendMessage(hClient,WM_MDITILE,MDITILE_VERTICAL,0); }else if (LOWORD(wParam)==IDM_CASCADE){ SendMessage(hClient,WM_MDICASCADE,MDITILE_SKIPDISABLED,0); }else if (LOWORD(wParam)==IDM_CLOSE){ SendMessage((HWND) SendMessage(hClient,WM_MDIGETACTIVE,0,0),WM_CLOSE,0,0); }else if (LOWORD(wParam)==IDM_NEW){ //CreateMDIWindow((LPSTR) &szChildClass, // "ChildWindow",0,CW_USEDEFAULT, // CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hClient,hInstance,0); SendMessage(hClient,WM_MDICREATE,0,(LPARAM) &mcs); }else{ return(DefFrameProc(hwnd,hClient,uMsg,wParam,lParam)); }; }; }else if (uMsg==WM_DESTROY){ PostQuitMessage(0); }else{ return(DefFrameProc(hwnd,hClient,uMsg,wParam,lParam)); }; return(0); }; LRESULT CALLBACK ChildProc(HWND hChild,UINT uMsg,WPARAM wParam,LPARAM lParam){ if (uMsg==WM_CLOSE){ SendMessage(hClient,WM_MDIDESTROY,(WPARAM) hChild,0); }else if (uMsg==WM_MDIACTIVATE){ if (hChild==(HWND) lParam){ SendMessage(hClient,WM_MDISETMENU,(WPARAM) hChildMenu,(LPARAM) GetSubMenu(hChildMenu,CHILDS_SUBMENU)); }else{ SendMessage(hClient,WM_MDISETMENU,(WPARAM) hMainMenu,(LPARAM) GetSubMenu(hMainMenu,CHILDS_SUBMENU)); }; DrawMenuBar(hFrame); }else { return(DefMDIChildProc(hChild,uMsg,wParam,lParam)); }; return(0); }; Всё упрощено, что дальше не куда и все равно не могу разобраться. Дочерние окна почему-то получаются чернявыми, и в меню Window(child) галочки не ставяться.
Уже почти разобрался. Начальное id #define ID_FIRST_CHILD 100000, оно-же должно в WORD`e умещаться. Осталось только с цветом окон разобраться.
Компилер какой-то очень вредный. Почему-то вместо (HBRUSH) COLOR_WINDOW+1 подставляет 9 вместо 6. Правильно работает со скобками wc.hbrBackground=(HBRUSH) (COLOR_WINDOW+1);