汇编教程多文档界面(mdi)

上传人:ji****n 文档编号:45671022 上传时间:2018-06-18 格式:DOC 页数:14 大小:22.58KB
返回 下载 相关 举报
汇编教程多文档界面(mdi)_第1页
第1页 / 共14页
汇编教程多文档界面(mdi)_第2页
第2页 / 共14页
汇编教程多文档界面(mdi)_第3页
第3页 / 共14页
汇编教程多文档界面(mdi)_第4页
第4页 / 共14页
汇编教程多文档界面(mdi)_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《汇编教程多文档界面(mdi)》由会员分享,可在线阅读,更多相关《汇编教程多文档界面(mdi)(14页珍藏版)》请在金锄头文库上搜索。

1、 本教程告诉你怎样创建 MDI 应用程序.事实上并不是很困难.理论:多文档界面(MDI)是同一时刻处理多个文档的应用程序的一个规范. 你很熟悉记事本. 它是单文档界面(SDI)的一个例子.记事本在一个时候只能处理一个文档.假如你希望打开另 一个文档,你首先必须关闭你前面打开的那一个.你可以想象这有多麻烦. 和 Microsoft Wo rd 相比:Word 可以随心所欲的在同一时刻打开任意多个文档,而且可以让用户选择使用哪一 个文档.Microsoft Word 是多文档界面(MDI)的一个例子.MDI 应用程序有几个显著的特征:我列举其中的一些:有主窗口,在客户区可以有多个子窗口.所有的子窗

2、口都位于客户区.最小化一个子窗口,它最小化到了主窗口的客户区的左下角.最大化一个子窗口,它的标题和主窗口的标题合并到了一起.你可以通过按 Ctrl+F4 键来关闭子窗口,还可以通过按 Ctrl+Tab 键在子窗口之间来切 换.包含子窗口的主窗口被称为框架窗口.主窗口的客户区是子窗口活动的地方,因此有了 框架这个名字.主窗口的任务要比普通窗口精细一些,因为它需要为 MDI 处理一些协调工作.为了在你的客户区控制任意多个数目的子窗口,你需要一个特殊的窗口:客户窗口.你可 以把客户窗口看成是覆盖框架窗口的整个客户区的一个透明的窗口.客户窗口才是所有 MDI 子窗口的实际的父亲.客户窗口是 MDI 子

3、窗口的真实的监督者.框架窗口 | 客户窗口 | -| | | |MDI 自窗口 1MDI 自窗口 2MDI 自窗口 3MDI 自窗口 4MDI 自窗口 n图 1.一个 MDI 应用程序的层次结构创建框架窗口现在我们将注意力放到细节上来.首先你需要创建框架窗口. 创建框架窗口的方法和普 通窗口是相同的:调用 CreateWindowEx. 和普通窗口相比,有两个主要的不同.第一个不同是你必须调用 DefFrameProc 来处理你的窗口不想处理的窗口信息而不是调 用 DefWindowProc.这是让 Windows 为你作的保持一个 MDI 应用程序的垃圾任务的一个方法.假 如你忘记使用 De

4、fFrameProc,你的应用程序将不具有 MDI 的功能. DefFrameProc 具有下列 语法:DefFrameProc proc hwndFrame:DWORD, hwndClient:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD假如你将 DefFrameProc 和 DefWindowProc 作一个对比,你将会注意到它们之间的唯 一的不同在于 DefFrameProc 有 5 个参数,而 DefWindowProc 只有 4 个.这个增加的参数是客 户窗口的句柄.这个句柄是必须的,有了它 Windows 才可以发送 MDI-相关的消息

5、给客户窗口.第二个不同是你必须在你的框架窗口的消息循环中调用 TranslateMDISysAccel .假如 你希望 Windows 为你处理 MDI 相关的加速键,比如 Ctrl+F4,Ctrl+Tab,那么这是必须的.它 具有下列语法:TranslateMDISysAccel proc hwndClient:DWORD,lpMsg:DWORD第一个参数是客户窗口的句柄.对此你应该不会觉得惊讶.因为客户窗口是所有 MDI 子 窗口的父亲. 第二个参数是你通过调用 GetMessage 获得的 MSG 框架的地址. 我们的想法是 传递 MSG 结构给客户窗口,这样客户窗口可以检测在 MSG

6、结构中所包含的 MDI 相关的按键是 不是按下去了.假如是的话, 客户窗口处理这个信息,然后返回一个非零值,否则返回一个假 值.创建框架窗口的步骤总结如下:像平常一样填写 WNDCLASSEX 结构.通过调用 RegisterClassEx 注册框架窗口类.通过调用 CreateWindowEx 创建框架窗口.在消息循环中调用 TranslateMDISysAccel.在窗口过程中,将未处理的消息传递给 DefFrameProc 而不是 DefWindowProc.创建客户窗口现在我们有了框架窗口,我们可以开始创建客户窗口了. 客户窗口类是由 Windows 预先 注册的. 类的名称为“MDI

7、CLIENT“. 你同样也需要将 CLIENTCREATESTRUCT 的地址传递给 C reateWindowEx. 这个结构具有以下定义:CLIENTCREATESTRUCT struct hWindowMenu dd ? idFirstChild dd ? CLIENTCREATESTRUCT endshWindowMenu 是子菜单的句柄,这个子菜单显示 Windows 将要添加的 MDI 子窗口名称列 表. 我们需要对这一功能进行一点解释.假如你以前曾经使用过类似 Microsoft Word 的 MD I 应用程序,你将会注意到有一个名称为“窗口“的子菜单. 这个菜单一旦激活的话,

8、将会在 底部显示出和窗口管理相关的各种各样的菜单项, 还有当前打开的 MDI 子窗口的列表. 这 个列表是由 Windows 自己内部保持的. 你不需要为它作任何特殊的事情. 仅仅只在需要在 hWindowMenu 中传递你所希望显示列表的子菜单的句柄, Windows 将会处理剩下的事情. 注意这个子菜单可以是任何的子菜单:它并不一定要是名称为“窗口“的子菜单. 重要的是你 应该传递你希望显示窗口列表的子菜单的句柄. 假如你不想要这个列表,你就给 hWindowMe nu 赋一个 NULL 的值就行了. 你可以通过调用 GetSubMenu 来获得子菜单的句柄.idFirstChild 是第

9、一个 MDI 子窗口的标识号. Windows 为应用程序所创建的每一个新 的 MDI 子窗口相应的增加标识号. 举个例子, 假如你传递 100 给这个域, 第一个 MDI 子窗 口将会有一个值为 100 的标识符, 那么第二个 MDI 子窗口也就会有一个值为 101 的标识符, 如此这样下去. 当从窗口列表中选择 MDI 子窗口时, 被选择的 MDI 子窗口的标识符通过 WM _COMMAND 传递给框架窗口. 正常情况下,你将传递“未处理“的 WM_COMMAND 消息给 DefFrame Proc. 我用“未处理“这个词语,是因为窗口列表中的菜单项不是由你的应用程序创建的, 这 样你的应

10、用程序不知道它们的标识符,而且也没有它们的句柄. 这是 MDI 框架窗口又一个特 殊的地方. 假如你有窗口列表的话,你必须像这样来修改你的 WM_COMMAND 句柄:.elseif uMsg=WM_COMMAND .if lParam=0 ; 这条消息是由菜单产生的mov eax,wParam .if ax=IDM_CASCADE . .elseif ax=IDM_TILEVERT . .else invoke DefFrameProc, hwndFrame, hwndClient, uMsg,wParam, lParam ret .endif一般来说,你可以忽略未处理的消息. 但是在 MD

11、I 的情况下,如果你忽略它们, 当用户 点击窗口列表中的一个 MDI 子窗口的名称时,这个窗口不会被激活. 你需要将这些消息传 递给 DefFrameProc 这样它们才会得到适当的处理.idFirstChild 赋值的注意之处: 你不能使用 0. 你窗口列表将会表现的不正常. 举个 例子, 即使某一个 MDI 子窗口被激活的话, 窗口列表中的这个 MDI 子窗口名字前的复选标 记也不会显现. 我们可以选择一个安全的值,比如 100 或是一个比 100 大的值.给 CLIENTCREATESTRUCT 结构赋值后,你可以通过调用 CreateWindowEx 用预先注册好 的类名“MDICLI

12、ENT“, 在 lParam 中传递 CLIENTCREATESTRUCT 结构的地址来创建客户窗口. 你同样需要在 hWndParent 参数中指定框架窗口的句柄, 这样 Windows 才可以知道框架窗口 和客户窗口之间的父-子关系. 你可以使用的窗口风格有:WS_CHILD ,WS_VISIBLEHE WS_CLI PCHILDREN . 假如你忘了 WS_VISIBLE 的话, 即使 MDI 子窗口成功地创建了,你也看不到它 们.以下是创建客户窗口的步骤:获取你所希望显示窗口列表的子菜单的句柄.将这个菜单句柄的值和你希望作为第一个 MDI 子窗口标识符的值一起传送给 CLIENTCR

13、EATESTRUCT 结构.调用 CreateWindowEx 用类名“MDICLIENT“ ,lParam 参数为 CLIENTCREATESTRUCT 结构 的地址,创建 MDI 子窗口现在我们既有了框架窗口,也有了客户窗口. 下一阶段可以开始创建 MDI 子窗口了.有 两种方法:你可以发送 WM_MDICREATE 消息给客户窗口,在 wParam 参数中传递类型 MDICREATESTRU CT 的结构的地址. 这是常用的也是最简单的 MDI 子窗口的创建方法.data? mdicreate MDICREATESTRUCT hwndFrame dd ? .code start: inv

14、oke GetModuleHandle, NULL mov hInstance,eax invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG ;= ; 注册框架窗口类;= mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRA

15、W or CS_VREDRAW mov wc.lpfnWndProc,OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_APPWORKSPACE mov wc.lpszMenuName,IDR_MAINMENU mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc ;=; 注册 MDI 子窗口类;= mov wc.lpfnWndProc,offset ChildProc mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszClassNa

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 初中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号