(接上章)
五、子窗口的管理
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++深入详解学习笔记 #### 一、MFC与Debug模式 - **MFC (Microsoft Foundation Classes)**:这是微软提供的一套C++类库,用于简化Windows编程工作。MFC封装了很多常用的Windows API,使得开发者可以更加高效...
### 新SNMP开发笔记知识点详解 #### 一、配置Ubuntu的编译环境 在进行SNMP(简单网络管理协议)相关的开发工作之前,首先需要在Ubuntu操作系统上搭建一个适合的编译环境。这一过程主要涉及以下几个步骤: 1. **...
1. **获取 Android 开发 SDK**:首先,你需要确保已经安装了适用于 Android 开发的 SDK,这个工具包可以在 Windows、Mac OS X 或 Linux 上运行。 2. **添加 Google Analytics SDK**:将 `libGoogleAnalytics.jar` ...
- **文档资源:** 指导用户了解获取相关文档、固件库、应用笔记及其他生态系统支持的途径。 - **技术支持:** 帮助用户获得额外的技术支持。 **预期成果** - 成功运行一个永磁同步电机(PMSM)。 - 掌握使用STMC ...
(b)在C#代码中引入相关的SDK或者HTTP客户端库;(c)构造请求,包括设置API的URL、添加API密钥和上传手写图片;(d)发送请求并接收响应;(e)解析返回的JSON数据,提取识别出的文本。 8. **错误处理与调试**:在实际...
4. **快捷键支持**:为了提高效率,MarkdownPad提供了许多Markdown常用操作的快捷键,如Ctrl+B加粗文本,Ctrl+I斜体文本等。 5. **导出选项**:除了常见的HTML导出,MarkdownPad还支持将文档导出为PDF、Word文档等...
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 ...
- 需要对应的动态链接库文件(如.dll on Windows,.so on Linux)在运行环境存在。 - 更新动态库不影响依赖它的程序,便于升级和维护。 - 程序发布时体积小,因为不包含库代码。 2. **静态库**: - 静态库在...
那本文就是一篇介绍在windows环境下使用Apktool的笔记。 安装 1.先装JAVA环境,JDK/JRE都行,官网下载 装过的就跳过吧 2.下载apktool.jar及相关文件,这里下apktool-1.0.0.tar.bz2 和apktool-install-windows-2.1_...