当前位置:C++技术网 > 资讯 > 模态对话框和非模态对话框实现机制

模态对话框和非模态对话框实现机制

更新时间:2015-06-25 19:30:56浏览次数:1+次

    非模态对话框与模态的不一样,非模态对话框创建后如果没指定WS_VISIBLE则不显示,模态这忽略这个直接显示。
    应用负责检索和分发消息给非模态对话框,大部分的应用使用的是主消息循环。要允许用户使用键盘移动到控件和选择控件,应用必须调用IsDialogMessage 。非模态对话框不像模态的对话框有返回值,但是可以在对话框窗口过程使用SendMessage 向拥有者窗口发送信息。
    不要使用EndDialog来销毁非模态对话框,而使用DestroyWindow来销毁模态对话框。销毁之后,非模态对话框句柄失效,再使用此句柄则出错,为了防止,应该向拥有者窗口通知对话框已被销毁。多数应用使用全局变量来保存对话框句柄,因此,当对话框销毁时应该设置全局变量为空,表示此对话框不再可用。
    消息对话框虽然也是对话框,但是系统却是完全控制创建和管理它的。所以不需要为它提供任何对话框模板和对话框窗口过程。系统创建自己的基于文字和按钮的对话框,并提供自己的对话框处理过程。系统也是使用DialogBox 来创建消息对话框的。应用可以指定消息对话框的拥有者或禁用拥有者,也可以再创建时指定MB_TASKMODAL来直接禁用当前线程的所有顶级窗口。系统始终显示模态对话框而忽略WS_VIAIBLE。应用不能创建含WS_CHILD风格的模态对话框,此风格的模态对话框将禁用自己,阻止任何接下来的输入。
    系统创建模态对话框时向当前捕获了鼠标的窗口发送WM_CANCELMODE消息,接收到这个消息的应用应该释放鼠标捕获,使用户可以在模态对话框中移动。如果接受消息时释放鼠标失败,同时系统禁用了拥有者窗口,因此所有鼠标输入都将丢失。
    创建模态对话框失败则返回0,否则暂时不返回,等待结束模态对话框后才返回。返回值就是结束对话框中指定的返回值。此原理就实现了模态机制。
    使用EndDialog函数来终止模态对话框。
    要创建模态或者非模态对话框,应用必须提供对话框模板去描述对话框样式和内容以及提供一个对话框窗口过程执行任务。对话框模板是对话框以及对话框包含的控件的二进制的描述。开发者可以以资源形式从应用可执行文件中加载来创建模板,或者应用运行时在内存中创建。对话框窗口过程是预定义的回调函数。虽然对话框窗口过程与窗口的相似,但是它表现却不一样。
    DialogBox 创建模态对话框,CreateDialog 创建非模态对话框。这两个函数从可执行文件中加载对话框模板,并创建与指定模板匹配的弹出对话框。还有其他在内存中使用模板创建对话框的函数。当对话框创建后,它们传递额外的信息给对话框窗口过程。
    对话框属于预定义的,专用的窗口类。系统对于模态和非模态对话框都使用这个窗口类和对应的窗口过程。
    应用不可直接访问预定义的窗口类和窗口过程。但是可以使用模板和对话框窗口过程去修改对话框风格和行为。