Dialog Boxes (Dialog Boxes)说到,一个对话框是一个临时的窗口,用来收集用户的输入。一个应用通过菜单点击弹出对话框,来请求用户输入额外信息。一个对话框通常包含多个控件(child windows),可以让用户输入文本,选择选项,或者知道行动。

许多公共的菜单项有预定义的对话框,如Open以及Print菜单。对于这些菜单项,应用最好选择预定义的对话框。

Dialog Box Overviews

About Dialog Boxes

When to Use a Dialog Box

对话框有两种,模态和非模态的。模态对话框必须关掉才能返回其他窗口,非模态对话框无此要求。

应用在创建对话框的时候必须提供模板来描述对话框样式和内容,除此之外还要提供一个对话框执行诀用于处理任务。

对话框模板二进制格式的,描述对话框所拥有的控件。模板可以从可执行文件中以资源的形式加载,或者在程序运行时在内存中创建。对话框执行诀则是用来处理输入,但是职责没有窗口执行诀那么大。

通过DialogBox或者CreateDialog创建对话框。前者创建模态对话框,后者创建非模态对话框。这两者都是从可执行文件创建对话框。还有其他函数从内存中的模板创建对话框。

对话框通常属于一个系统中预定义好的,排他性的窗口标类。系统将这个窗口标类和其执行诀用于模态和非模态对话框。对话框显现时,窗口执行诀接收所有的消息,处理一部分,然后将剩余的传给对话框执行诀。应用程序无法直接访问这个预定以的窗口标类或者窗口执行诀,但是可以使用对话框模板和执行诀修改其样式及行为。

Dialog Box Owner Window

大部分对话框有主管窗口。创建对话框时,可以设置主管窗口的控把。系统根据主管来决定对话框在Z轴的位置。系统还可以发送对话框相关的消息给主管。

系统自动隐藏或者销毁对话框,当其主管被隐藏或者销毁。

对话框通常联合菜单项使用,主管则是带有菜单的窗口。

虽然可以创建没有主管的窗口,但是并不推荐这么做。比如一个模态对话框没有主管,系统就不会禁用应用的其他窗口。这么做违反了模态对话框的本意。

对于非模态对话框,虽然可以没有主管。但是应用需要自己去隐藏和销毁没有主管的非模态对话框。

Message Boxes

消息框是最简单的对话框了。可以通过MessageBox或MessageBoxEx创建。

虽然消息框是对话框,但是其创建和管理完全归系统管,应用不需要提供对话框模板和执行诀。

消息框是一个模态对话框,弹出时系统会禁止其主管。通过设定MB_TASKMODAL,可以禁止当前线程上的所有顶级窗口。

和其他模态对话框一样,系统会发消息,比如 WM_CANCELMODE,WM_ENABLE,给主管。

创建对话框的用编口如下:

  • DialogBox
  • DialogBoxIndirect
  • DialogBoxParam
  • DialogBoxIndirectParam

对话框执行诀呼调EndDialog可以关闭对话框。

对话框执行诀可以启用主管窗口,但是这违反了模态的本意,因而不推荐。

模态对话框创建后,系统会发送WM_CANCELMODE给当前获取了鼠标输入了的窗口。收到此消息的窗口必须释放鼠标。

为了给模态对话框处理消息,系统开始对话框自己的消息循环,于是临时接管了整个应用的消息队列。当系统接收到一个不是针对对话框的消息,会转派给其他合适的窗口。比如收到WM_QUIT的时候,会投递到应用的消息队列,以便随后让应用的主消息循环处理之。

系统发送WM_ENTERIDLE给主管窗口,无论何时应用的消息队列已清空。应用可以使用此消息来执行幕后任务。这么做的话,应用程序需要注意频繁的退让(使用PeekMessage函数),以便让模态对话框可以响应用户输入。如果要避免模态对话框发送WM_ENTERIDLE消息,应用可以指定DS_NOIDLEMSG样式。

当用户进行了关闭操作之后,对话框执行诀可以调用EndDialog 来终止对话框,可以指定一个值通过开启对话框的函数(如 DialogBox )返回。这个值会在对话框关闭的时候返回。

暂略

其他参考

(未完待续)