Простое MDI приложение.

Тема в разделе "WASM.BEGINNERS", создана пользователем s_d_f, 24 ноя 2010.

  1. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Всем здравствуйте.

    Не получается написать простое MDI приложение на C++.

    Вот перепеписаный на C++ исходник из туториала Икзелиона.
    Код (Text):
    1. #include <windows.h>
    2. // ресурс MDI.rc из туториала Икзелиона
    3. #define IDR_MAINMENU       101
    4. #define IDR_CHILDMENU      102
    5. #define IDM_EXIT           40001
    6. #define IDM_TILEHORZ       40002
    7. #define IDM_TILEVERT       40003
    8. #define IDM_CASCADE        40004
    9. #define IDM_NEW            40005
    10. #define IDM_CLOSE          40006
    11. #define CHILDS_SUBMENU     1
    12. #define ID_FIRST_CHILD     100000
    13. LRESULT CALLBACK MainWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
    14. LRESULT CALLBACK ChildProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
    15. HMODULE hInstance;
    16. ATOM MainClass;
    17. ATOM ChildClass;
    18. char szChildClass[]="ChildWndClass";
    19. HWND hFrame;
    20. HWND hMainWnd;
    21. HWND hClient;
    22. HMENU hMainMenu;
    23. HMENU hChildMenu;
    24. HICON hIcon;
    25. MDICREATESTRUCT mcs;
    26. VOID main(char *lpRet,int UnkArg1,char *InitialRsp,int UnkArg3){
    27. MSG msg;
    28. WNDCLASSEX wc;
    29.     hInstance=GetModuleHandle(0);
    30.     hIcon=LoadIcon(0,(LPSTR) IDI_APPLICATION);
    31.     wc.cbSize=sizeof(WNDCLASSEX);
    32.     wc.style=CS_HREDRAW+CS_VREDRAW;
    33.     wc.lpfnWndProc=&MainWndProc;
    34.     wc.cbClsExtra=0;
    35.     wc.cbWndExtra=0;
    36.     wc.hInstance=hInstance;
    37.     wc.hIcon=hIcon;
    38.     wc.hCursor=LoadCursor(0,IDC_ARROW);
    39.     wc.hbrBackground=(HBRUSH) COLOR_APPWORKSPACE;
    40.     wc.lpszMenuName=(LPSTR) IDR_MAINMENU;
    41.     wc.lpszClassName="MainWndClass";
    42.     wc.hIconSm=hIcon;
    43.     MainClass=RegisterClassEx(&wc);
    44.     wc.lpfnWndProc=&ChildProc;
    45.     wc.hbrBackground=(HBRUSH) COLOR_WINDOW+1;
    46.     wc.lpszClassName=(LPSTR) &szChildClass;
    47.     ChildClass=RegisterClassEx(&wc);
    48.     hFrame=CreateWindowEx(0,(LPSTR) MainClass,"MDI",
    49.         WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,CW_USEDEFAULT,
    50.         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,hInstance,0);
    51.     ShowWindow(hFrame,SW_SHOWNORMAL);
    52.     UpdateWindow(hFrame);
    53.     hChildMenu=LoadMenu(hInstance,(LPSTR) IDR_CHILDMENU);
    54.     while (GetMessage(&msg,0,0,0)!=0){
    55.         if (TranslateMDISysAccel(hClient,&msg)) continue;
    56.         TranslateMessage(&msg);
    57.         DispatchMessage(&msg);
    58.     };
    59.     ExitProcess(msg.wParam);
    60. };
    61. LRESULT CALLBACK MainWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
    62.     if (uMsg==WM_CREATE){
    63.         hMainWnd=hwnd;
    64.         CLIENTCREATESTRUCT ClientStruc;
    65.         hMainMenu=GetMenu(hMainWnd);
    66.         ClientStruc.hWindowMenu=GetSubMenu(hMainMenu,CHILDS_SUBMENU);
    67.         ClientStruc.idFirstChild=ID_FIRST_CHILD;
    68.         hClient=CreateWindowEx(0,"MDICLIENT",0,WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN,
    69.         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
    70.         hMainWnd,0,hInstance,&ClientStruc);
    71.         mcs.hOwner=hInstance;
    72.         mcs.szClass=(LPSTR) &szChildClass;
    73.         mcs.szTitle="ChildWindow";
    74.         mcs.style=0;
    75.         mcs.lParam=0;
    76.         mcs.x=CW_USEDEFAULT;
    77.         mcs.y=CW_USEDEFAULT;
    78.         mcs.cx=CW_USEDEFAULT;
    79.         mcs.cy=CW_USEDEFAULT;
    80.     }else if (uMsg==WM_COMMAND){
    81.         if (lParam==0){
    82.             if (LOWORD(wParam)==IDM_EXIT){
    83.                 DestroyWindow(hwnd);
    84.             }else if (LOWORD(wParam)==IDM_TILEHORZ){
    85.                 SendMessage(hClient,WM_MDITILE,MDITILE_HORIZONTAL,0);
    86.             }else if (LOWORD(wParam)==IDM_TILEVERT){
    87.                 SendMessage(hClient,WM_MDITILE,MDITILE_VERTICAL,0);
    88.             }else if (LOWORD(wParam)==IDM_CASCADE){
    89.                 SendMessage(hClient,WM_MDICASCADE,MDITILE_SKIPDISABLED,0);
    90.             }else if (LOWORD(wParam)==IDM_CLOSE){
    91.                 SendMessage((HWND) SendMessage(hClient,WM_MDIGETACTIVE,0,0),WM_CLOSE,0,0);
    92.             }else if (LOWORD(wParam)==IDM_NEW){
    93.                 //CreateMDIWindow((LPSTR) &szChildClass,
    94.                 //  "ChildWindow",0,CW_USEDEFAULT,
    95.                 //  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hClient,hInstance,0);
    96.                 SendMessage(hClient,WM_MDICREATE,0,(LPARAM) &mcs);
    97.             }else{
    98.                 return(DefFrameProc(hwnd,hClient,uMsg,wParam,lParam));
    99.             };
    100.         };
    101.     }else if (uMsg==WM_DESTROY){
    102.         PostQuitMessage(0);
    103.     }else{
    104.         return(DefFrameProc(hwnd,hClient,uMsg,wParam,lParam));
    105.     };
    106.     return(0);
    107. };
    108. LRESULT CALLBACK ChildProc(HWND hChild,UINT uMsg,WPARAM wParam,LPARAM lParam){
    109.     if (uMsg==WM_CLOSE){
    110.         SendMessage(hClient,WM_MDIDESTROY,(WPARAM) hChild,0);
    111.     }else if (uMsg==WM_MDIACTIVATE){
    112.         if (hChild==(HWND) lParam){
    113.             SendMessage(hClient,WM_MDISETMENU,(WPARAM) hChildMenu,(LPARAM)
    114.                 GetSubMenu(hChildMenu,CHILDS_SUBMENU));
    115.         }else{
    116.             SendMessage(hClient,WM_MDISETMENU,(WPARAM) hMainMenu,(LPARAM)
    117.                 GetSubMenu(hMainMenu,CHILDS_SUBMENU));
    118.         };
    119.         DrawMenuBar(hFrame);
    120.     }else {
    121.         return(DefMDIChildProc(hChild,uMsg,wParam,lParam));
    122.     };
    123.     return(0);
    124. };
    Всё упрощено, что дальше не куда и все равно не могу разобраться. Дочерние окна почему-то получаются чернявыми, и в меню Window(child) галочки не ставяться.
     
  2. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Уже почти разобрался. Начальное id #define ID_FIRST_CHILD 100000, оно-же должно в WORD`e умещаться. Осталось только с цветом окон разобраться.
     
  3. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Компилер какой-то очень вредный.
    Почему-то вместо (HBRUSH) COLOR_WINDOW+1 подставляет 9 вместо 6.
    Правильно работает со скобками wc.hbrBackground=(HBRUSH) (COLOR_WINDOW+1);