对话框是windows资源中一个非常重要的东西,对话框分为两类,模态的和非模态的,它们的区别是在于是否允许用户在不同的窗口间进行切换。
对话框的工作原理
对话框和普通的窗口之间有很多相同的地方。但是对话框和普通窗口在实现上又有很多的不同,普通窗口的建立需要用RegisterClass注册一个窗口类,然后用CreateWindow建立窗口。建立对话框的时候并不使用CreateWindow函数,建立模态对话框的函数是DialogBox,建立非模态对话框的函数是CreateDialog。Windows其实在这两个函数的内部仍然调用CreateWindow函数来建立对话框,调用这两个函数来建立对话框窗口之前不需要注册对话框的窗口类(有点类似于子控件)。
在这个预定义的窗口类中,窗口过程被定义到了Windows内部的“对话框管理器”中,Window在这里处理关于对话框的大部分消息,对话框管理器在初始化的时候会根据对话框模板中定义的子窗口控件建立对话框中所有的子窗口。我们在自己的代码中也会定义一个类似于窗口过程的对话框过程,这个过程是由对话框管理器调用的,
在处理消息之前,对话框管理器会先调用用户指定的对话框过程,再根据对话框过程的返回值决定是否处理它们。
Windows对模态对话框和非模态对话框的处理有些不同,在创建并显示模态对话框后,Windows会为它在内部建立一个消息循环,在这个消息循环中把消息发送给对话框管理器,对话框会在处理消息的过程中调用用户定义的对话框过程,当对话框关闭的时候,Windows退出内建的消息循环,并从DialogBox函数返回。其过程如下图所示:
而对于非模态对话框,CreateDialog函数在创建对话框后直接返回,对话框的窗口的消息是通过用户程序中的消息循环派送的,即上图中的Windows内的内建消息循环被移到左边矩形框内。由用户自定义。
模态对话框
我们根据子窗口控件(二)中的程序来简单的进行扩展,增加一个关于对话框,我们首先要为程序添加一个菜单。然后新建一个对话框资源,然后仿照记事本的关于对话框来添加控件。如下所示:
其中,对话框中的图片和图标都是通过一个图片控件进行插入,我们在图片控件Type中选择Icon或Bitmap,之后再Image中选择要插入的图标和位图的ID即可。中间的一个横线也是一个图片控件,我们把图片控件拉成一条线后,在Sunken项中选择True。默认对话框有ok和cancel两个按钮,我们删除了cancel按钮。
其中窗口过程函数部分如下:
case ID_HELP_ABOUT:
DialogBox( (HINSTANCE)GetWindowLong( hwnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDD_HELP_ABOUT), hwnd, AboutDlgProc );
对话框的窗口过程如下所示:
BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_INITDIALOG :