模态对话框

模态对话框
    模态对话框应该是拥有一个窗口菜单、一个标题栏和一个宽边框的弹出式窗口,对话框模板应该指定WS_POPUP,WS_SYSMENU,WS_CAPTION和DS_MODALFRAME风格。尽管应用程序可以指定WS_VISIBLE风格,但是系统总是显示一个模态对话框,虽然对话框模板指定了WS_VISIBLE风格。应用程序不能创建一个WS_CHILD风格的模态对话框。一个有WS_CHILD风格的模态对话框会让自身失效,阻止往程序中的输入。
    应用程序利用DialogBox函数或DialogBoxIndirect函数来创建模态对话框。DialogBox函数需要一个包含对话框模板的资源的名字和标识符。DialogBoxIndirect函数需要一个指向包含对话框模板的内存对象的句柄。DialogBoxParam函数和DialogBoxIndirectParam函数也可以创建模态对话框,这两个函数和上面提到的两个函数是相同的,但是当创建对话框时,会传递一个指定的参数给对话框过程。
    当创建模态对话框时,系统会把它设置为活动的窗口。这个对话框会一直保持活动的状态,直到对话框过程调用了EndDialog函数或系统把另一个程序中的对话框变成活动的。用户和程序都不能是拥有模态对话框的主窗口变成活动的,除非这个模态对话框被撤销。
    当一个处于活动状态的主窗口创建一个模态对话框时,系统会自动使主窗口以及任何子窗口失效。主窗口会一直失效,直到模态对话框被撤销。虽然一个对话框的窗口过程可以在任何时间使主窗口称为活动的窗口,但是这样的话就违背了设置模态对话框的目的,所以不推荐这样做。当对话框过程被撤销时,系统会使主窗口再次变成活动的窗口,前提是主窗口是被模态对话框导致失效的。
    当系统创建模态对话框时,系统会发送WM_CANCELMODE消息到当前获取鼠标输入的窗口。接收到这个消息的应用程序应该释放对鼠标的捕获,这样才能让用户在模态对话框中移动鼠标。因为系统使主窗口失效,如果主窗口在接收了这条消息时,不能释放掉鼠标,那么会失去所有的鼠标输入。
    为了处理模态对话框的消息,系统会开始自己的消息循环,暂时的控制整个程序的消息队列。当系统获取一个不是针对的对话框的消息时,系统会把这个消息分配给适合的窗口。如果系统获取一个WM_QUIT消息,系统会把消息发布到应用程序的消息队列,这样程序的主消息循环就可以最终获取到这个消息。
    当应用程序的消息队列为空时,系统发送WM_ENTERIDLE消息到主窗口。当模态对话框显示在屏幕上时,应用程序可以使用这条消息执行一个后台任务。当一个程序以这种方式使用这个消息时,程序必须频繁的转让控制权(例如,通过使用PeekMessage函数),这样模态对话框就可以获取用户输入。为了阻止模态对话框发送WM_ENTERIDLE消息,应用程序可以在创建对话框时,为对话框指定DS_NOIDLEMSG风格。
    应用程序通过调用EndDialog函数来撤销模态对话框。在大多数情况下,当用户点击模态对话框菜单上的Close命令或者对话框上OK或Cancel按钮时,对话框过程调用EndDialog函数。对话框通过DialogBox函数可以返回一个值,这个值可以指定。当调用EndDialog函数时。系统撤销对话框后会返回这个值。大多数程序使用这个值来确定对话框是否完成了任务或者,是否是由用户取消的。系统不会从创建对话框的函数中返回控制的,直到对话框过程已经调用了EndDialog函数。

你可能感兴趣的:(Win32对话框,MSDN文档翻译)