分类: C/C++
2012-07-27 16:36:08
谨慎对待对话框模板
对话框模板是写在 rc 文件中的用于描述 Windows 对话框的脚本,Visual Studio 提供了方便的对话框编辑器,我们也可以通过修改 rc 文件的脚本来改变对话框的大小、样式等。
今天直接修改 rc 代码,出现了一些奇怪的现象,写下来跟大家分享一下。
使用 Visual Studio 建立一个简单的对话框工程,对应对话框模板如下:
IDD_MYDIALOG_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_SHELLFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_MODALFRAME | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "MyDialog"
FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "OK",IDOK,209,179,50,14
PUSHBUTTON "Cancel",IDCANCEL,263,179,50,14
CTEXT "TODO: Place dialog controls here.",IDC_STATIC,10,96,300,8
END
我们关注对话框模板中的基本风格,此对话框模板的基本风格有DS_SHELLFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION | DS_MODALFRAME | WS_SYSMENU,使用Visual Studio为对话框加入最大化、最小化风格,此时对话框模板中的基本风格变为DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU,对比可以看到,除了 DS(Dialog Style)风格变化了之外,WS(Window Style)风格增加了 WS_MINIMIZEBOX、WS_MAXIMIZEBOX两个,编译此工程,运行,对话框右上角有最小化、最大化、关闭按钮,在任务栏上右键菜单,可以看到对话框中有还原、移动、大小、最大化、最小化、关闭等项。我们使用 Visual Studio 去除最大化、最小化风格,重新编译,运行,对话框右上角只有关闭按钮了,在任务栏上右键菜单,可以看到对话框中只有移动、关闭等项了。工程至此,一切正常。我们继续往下看。
由于新需求,我们要再次为对话框加入最大化、最小化风格,由于应急,某程序员在OnInitDialog函数中写下来如下代码:
ModifyStyle(0, WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
编译,运行,可以看到,对话框右上角再次出现了最大化、最小化按钮,似乎一切正常,我们点击最大化、最小化,发现功能根本不奏效,ModifyStyle 函数只是更改了对话框表现,并没有更改实际功能,要实现最终功能,还是要更改对话框模板。上述例子反过来同样奏效,使用 ModifyStyle 去除最大化、最小化风格后,在任务栏上右键点击,发现弹出的菜单中仍然会出现最大化、最小化选项,感兴趣的同学不妨试试。
在文章的最后,对于写 Windows 对话框,给出如下建议:
1、如果使用标准 Windows 对话框,最好不要手动更改对话框风格,建议使用Visual Studio直接修改 rc 文件,这样更方便更准确。
2、如果要写一个通用的对话框,建议为每种风格的对话框建立一个对话框模板,避免手动更改对话框风格。