`
xieyj
  • 浏览: 102710 次
  • 性别: 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 ;

 (全文完)

分享到:
评论

相关推荐

    VC++深入详解学习笔记

    ### VC++深入详解学习笔记 #### 一、MFC与Debug模式 - **MFC (Microsoft Foundation Classes)**:这是微软提供的一套C++类库,用于简化Windows编程工作。MFC封装了很多常用的Windows API,使得开发者可以更加高效...

    New SNMP开发笔记

    ### 新SNMP开发笔记知识点详解 #### 一、配置Ubuntu的编译环境 在进行SNMP(简单网络管理协议)相关的开发工作之前,首先需要在Ubuntu操作系统上搭建一个适合的编译环境。这一过程主要涉及以下几个步骤: 1. **...

    ADNROID流量分析 Google_Analytics学习笔记

    1. **获取 Android 开发 SDK**:首先,你需要确保已经安装了适用于 Android 开发的 SDK,这个工具包可以在 Windows、Mac OS X 或 Linux 上运行。 2. **添加 Google Analytics SDK**:将 `libGoogleAnalytics.jar` ...

    STM32FOC4.2说明手册

    - **文档资源:** 指导用户了解获取相关文档、固件库、应用笔记及其他生态系统支持的途径。 - **技术支持:** 帮助用户获得额外的技术支持。 **预期成果** - 成功运行一个永磁同步电机(PMSM)。 - 掌握使用STMC ...

    手写识别demo.rar

    (b)在C#代码中引入相关的SDK或者HTTP客户端库;(c)构造请求,包括设置API的URL、添加API密钥和上传手写图片;(d)发送请求并接收响应;(e)解析返回的JSON数据,提取识别出的文本。 8. **错误处理与调试**:在实际...

    markdownpad.exe

    4. **快捷键支持**:为了提高效率,MarkdownPad提供了许多Markdown常用操作的快捷键,如Ctrl+B加粗文本,Ctrl+I斜体文本等。 5. **导出选项**:除了常见的HTML导出,MarkdownPad还支持将文档导出为PDF、Word文档等...

    .Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用

    10. 导入Excel数据到数据库,可以使用OleDb或EPPlus库,导出则反之,利用Excel类库(如Microsoft.Office.Interop.Excel)或Open XML SDK。 11. A程序关闭B程序可以通过进程管理,例如使用Process.Kill()或Process....

    【软件加密_技术内幕】

    [Trial version] 7.4 使用sdk把程序和壳溶为一体 [Trial version] 实现调用加壳的外壳中的子程序的一点见解.htm [Trial version] 7.5 后记关于壳和程序的思考 [Trial version] 加壳技术探讨-加壳时处理IAT.htm ...

    Qt构建动态库静态库.rar

    - 需要对应的动态链接库文件(如.dll on Windows,.so on Linux)在运行环境存在。 - 更新动态库不影响依赖它的程序,便于升级和维护。 - 程序发布时体积小,因为不包含库代码。 2. **静态库**: - 静态库在...

    APKTool批处理版l

    那本文就是一篇介绍在windows环境下使用Apktool的笔记。 安装 1.先装JAVA环境,JDK/JRE都行,官网下载 装过的就跳过吧 2.下载apktool.jar及相关文件,这里下apktool-1.0.0.tar.bz2 和apktool-install-windows-2.1_...

Global site tag (gtag.js) - Google Analytics