`
xieyj
  • 浏览: 99996 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Windows SDK笔记(B)

阅读更多

(接上章)

五、子窗口的管理
1.
概述
给MDI客户区窗口发控制消息即可
如:

case WM_COMMAND:

switch (LOWORD (wParam))

{

     case IDM_WINDOW_TILE:

         SendMessage (hwndClient, WM_MDITILE, 0, 0) ;

         return 0 ;

              

     case IDM_WINDOW_CASCADE:

         SendMessage (hwndClient, WM_MDICASCADE, 0, 0) ;

         return 0 ;

              

     case IDM_WINDOW_ARRANGE:

         SendMessage (hwndClient, WM_MDIICONARRANGE, 0, 0) ;         

         return 0;

               

        //...

        //...

}

break;

2.当前子窗口的关闭
关闭当前激活窗口时,先向该窗口发送查询消息:WM_QUERYENDSESSION。
子窗口的消息处理循环中响应此消息,作关闭前的一些处理,若能关闭,返回真
否则返回假。
框架窗口中根据此返回值决定是否关闭窗口。

如果用户直接按下子窗口的关闭按钮,则WM_CLOSE消息直接发送到了子窗口消息处理函数。

例如:
框架窗口命令处理中:

case IDM_FILE_CLOSE:         

//获得当前激活窗口

hwndChild = (HWND) SendMessage (hwndClient, WM_MDIGETACTIVE, 0, 0);

//询问通过后,销毁窗口

if (SendMessage (hwndChild, WM_QUERYENDSESSION, 0, 0))

     SendMessage (hwndClient, WM_MDIDESTROY, (WPARAM) hwndChild, 0);

return 0;

子窗口的消息处理函数中:

LRESULT CALLBACK HelloWndProc (HWND hwnd, UINT message,

                               WPARAM wParam, LPARAM lParam)

{

     switch (message)

     {

     //...

     //...

 

     case WM_QUERYENDSESSION:

     case WM_CLOSE:

          if (IDOK != MessageBox (hwnd, TEXT ("OK to close window?"),

                                  TEXT ("Hello"),

                                  MB_ICONQUESTION | MB_OKCANCEL))

               return 0 ;

              

          break ;   // i.e., call DefMDIChildProc

     }

     return DefMDIChildProc (hwnd, message, wParam, lParam) ;

}

3.关闭所有子窗口
当使用命令方式关闭所有子窗口时,需要枚举所有子窗口进行关闭。
例:
框架窗口响应命令:

case IDM_WINDOW_CLOSEALL:   

     //针对所有子窗口执行CloseEnumProc

     EnumChildWindows (hwndClient, CloseEnumProc, 0) ;

     return 0 ;

枚举函数:

BOOL CALLBACK CloseEnumProc (HWND hwnd, LPARAM lParam)

{

     if (GetWindow (hwnd, GW_OWNER))         // Check for icon title

          return TRUE ;

    

     SendMessage (GetParent (hwnd), WM_MDIRESTORE, (WPARAM) hwnd, 0) ;

    

     if (!SendMessage (hwnd, WM_QUERYENDSESSION, 0, 0))

          return TRUE ;

    

     SendMessage (GetParent (hwnd), WM_MDIDESTROY, (WPARAM) hwnd, 0) ;

     return TRUE ;

}

六、菜单控制
在MDI程序中,可以根据激活的子窗口而切换框架窗口的菜单。
并且,可以将窗口列表添加到菜单中去。所添加的菜单项命令是又框架对应的缺省消息处理函数完成的。
1.为每种窗口类准备一套菜单资源
2.装载菜单,得到菜单句柄
3.框架在建立时,使用框架菜单的句柄作为参数。
4.子窗口在激活时,加载自己菜单到框架窗口
失去焦点时,还原框架菜单。
使用向MDI客户区窗口发送WM_MDISETMENU或WM_MDISETMENU消息。
wParam为菜单句柄,lParam为欲添加窗口列表的子菜单句柄

case WM_MDIACTIVATE:

         //激活时,设置框架菜单

         if (lParam == (LPARAM) hwnd)

               SendMessage (hwndClient, WM_MDISETMENU,

                            (WPARAM) hMenuHello, (LPARAM) hMenuHelloWindow) ;

              

              

          //失去焦点时,将框架菜单还原

         if (lParam != (LPARAM) hwnd)

               SendMessage (hwndClient, WM_MDISETMENU, (WPARAM) hMenuInit,

                            (LPARAM) hMenuInitWindow) ;

              

          DrawMenuBar (hwndFrame) ;

         

          //注: hwndFrame的得到方法:

          //hwndClient = GetParent (hwnd) ;

          //hwndFrame = GetParent (hwndClient) ;

         

          return 0 ;

 (全文完)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics