现在的位置: 首页 > 综合 > 正文

对话框的运作

2013年11月26日 ⁄ 综合 ⁄ 共 1252字 ⁄ 字号 评论关闭

Windows的对话框根据与父窗口的关系,分为两类。

1. 「令其父窗口除能,直到对话框结束」,这种称为modal 对话框。
2. 「父窗口与对话框共同运行」,这种称为modeless 对话框。

比较常用的是modal 对话框。我就以Generic 的¡ §About¡ ¨ 对话框做为说明范例。
为了做出一个对话框,程序员必须准备两样东西:

1. 对话框模板(dialog template)。这是在RC 文件中定义的一个对话框外貌,以各
种方式决定对话框的大小、字形、内部有哪些控制组件、各在什么位置...等等。
2. 对话框函数(dialog procedure)。其类型非常类似窗口函数,但是它通常只处
理WM_INITDIALOG 和WM_COMMAND 两个消息。对话框中的各个控制组件也
都是小小窗口,各有自己的窗口函数,它们以消息与其管理者(父窗口,也就
是对话框)沟通。而所有的控制组件传来的消息都是WM_COMMAND,再由其
参数分辨哪一种控制组件以及哪一种通告(notification)。

Modal 对话框的激活与结束,靠的是DialogBox 和EndDialog 两个API 函数。请看

资源描述档(.RC)

RC 文件是一个以文字描述资源的地方。常用的资源有九项之多,分别是ICON、CURSOR、
BITMAP、FONT、DIALOG、MENU、ACCELERATOR、STRING、VERSIONINFO。还
可能有新的资源不断加入,例如Visual C++ 4.0 就多了一种名为TOOLBAR 的资源。这
些文字描述需经过RC 编译器,才产生可使用的二进制代码。本例Generic 示范ICON、
MENU 和DIALOG 三种资源。

Windows 程序的生与死

1. 程序初始化过程中调用CreateWindow,为程序建立了一个窗口,做为程序的萤
幕舞台。CreateWindow 产生窗口之后会送出WM_CREATE 直接给窗口函数,
后者于是可以在此时机做些初始化动作(例如配置内存、开文件、读初始资
料...)。
2. 程序活着的过程中,不断以GetMessage 从消息贮列中抓取消息。如果这个消
息是WM_QUIT,GetMessage 会传回0 而结束while 循环,进而结束整个程序。
3. DispatchMessage 透过Windows USER 模块的协助与监督,把消息分派至窗口
函数。消息将在该处被判别并处理。
4. 程序不断进行2. 和3. 的动作。
5. 当使用者按下系统菜单中的Close 命令项,系统送出WM_CLOSE。通常程序
的窗口函数不栏截此消息,于是DefWindowProc 处理它。
6. DefWindowProc 收到WM_CLOSE 后, 调用DestroyWindow 把窗口清除。
DestroyWindow 本身又会送出WM_DESTROY。
7. 程序对WM_DESTROY 的标准反应是调用PostQuitMessage。
8. PostQuitMessage 没什么其它动作,就只送出WM_QUIT 消息,准备让消息循
环中的GetMessage 取得,如步骤2,结束消息循环。

抱歉!评论已关闭.