﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-michael-随笔分类-visual c++</title><link>http://www.cppblog.com/michaelgao/category/7399.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 03 Oct 2008 16:07:40 GMT</lastBuildDate><pubDate>Fri, 03 Oct 2008 16:07:40 GMT</pubDate><ttl>60</ttl><item><title>windows 对话框</title><link>http://www.cppblog.com/michaelgao/archive/2008/10/03/63200.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Fri, 03 Oct 2008 13:55:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/10/03/63200.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/63200.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/10/03/63200.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/63200.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/63200.html</trackback:ping><description><![CDATA[Windows&nbsp;对话框<br>　　顾名思义，对话框是应用程序创建的一个窗口，给出用户一些信息或者接收用户的输入。Delphi&nbsp;中没有创建对话框的
模板（除了通用的对话框如打开对话框、字体对话框、颜色对话框等）。Delphi&nbsp;本身使用&nbsp;TForm&nbsp;创建对话框。对话框可以使得临时输入的窗口创建
更加容易。不用&nbsp;CreateWindow(&nbsp;)&nbsp;创建一个弹出窗口然后在上面添加控件，你只要制作一个资源模板，然后调用&nbsp;DialogBox&nbsp;就可以
了。本例中我们创建并使用资源模板，然后调用&nbsp;Windows&nbsp;DialogBox(&nbsp;)&nbsp;函数。你可以参考&nbsp;Win32&nbsp;API&nbsp;帮助的
&#8220;Dialog&nbsp;Boxes&#8221;部分。在程序示例里我使用&nbsp;DialogBox(&nbsp;)&nbsp;创建了一个模式对话框。你需要为它准备好一个对话框资源文件
&#8220;Dlg1.RES&#8221;。&nbsp;<br><br><br>对话框资源的创建<br>　　你需要使用&nbsp;brcc32.exe&nbsp;编译对话框资源。这在&nbsp;Delphi&nbsp;帮助文档中没有详细说明。下面我们开始创建一个非常简单的对话框资源&nbsp;.RC&nbsp;文件。<br><br>First&nbsp;DIALOG&nbsp;&nbsp;12,&nbsp;10,&nbsp;206,&nbsp;86<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STYLE&nbsp;WS_POPUP&nbsp;|&nbsp;WS_DLGFRAME&nbsp;|&nbsp;WS_CAPTION<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAPTION&nbsp;"&nbsp;A&nbsp;Dialog&nbsp;Form"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FONT&nbsp;10,&nbsp;"MS&nbsp;Sans&nbsp;Serif"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LTEXT&nbsp;"Simple&nbsp;Dialog"&nbsp;&nbsp;200,&nbsp;8,&nbsp;6,&nbsp;196,&nbsp;8<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PUSHBUTTON&nbsp;"OK"&nbsp;&nbsp;&nbsp;IDOK,&nbsp;48,&nbsp;71,&nbsp;&nbsp;32,&nbsp;12<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>　　这是&nbsp;C&nbsp;语言代码，不是&nbsp;Pascal&nbsp;代码。第一个&#8220;First&#8221;是资源名字，就像下面一行的&#8220;MyIcon&#8221;。<br><br>MyIcon&nbsp;&nbsp;ICON&nbsp;&nbsp;Floppy.ico<br><br>
对于&nbsp;.RC&nbsp;文件内的图标，DIALOG&nbsp;是一种资源，12、10、206、86&nbsp;是对话框的标准的上、左、宽、高参数（单位不是像素，对话框单位参
见&nbsp;Win32&nbsp;API&nbsp;帮助的&#8220;GetDialogBaseUnits&#8221;）。上和左与它的父窗体的上和左相关，以父窗体为参考原点。接下里来
是：STYLE&nbsp;WS_POPUP&nbsp;|&nbsp;WS_DLGFRAME&nbsp;|&nbsp;WS_CAPTION&nbsp;，这些设置了对话框窗体的创建风格（&nbsp;C&nbsp;语言中
的&nbsp;|&nbsp;和&nbsp;Pascal&nbsp;语言中的&nbsp;or&nbsp;一样）。还有一些其他的对话框风格：<br><br>DS_LOCALEDIT&nbsp;-指定编辑框控件在对话框上
使用程序数据模块的内存。默认情况下，对话框上的编辑框控件是使用应用程序数据模块之外的内存的。如果没有使用这个标志，那么不要向编辑框发
送&nbsp;EM_GETHANDLE&nbsp;和&nbsp;EM_SETHANDLE&nbsp;消息，因为控件没有存储在程序的数据模块。<br><br>DS_MODALFRAME&nbsp;-创建一个模式对话框，对话框可以通过指定&nbsp;WS_CAPTION&nbsp;和&nbsp;WS_SYSMENU&nbsp;结合标题栏和系统菜单。<br><br>DS_NOIDLEMSG&nbsp;-禁止&nbsp;Windows&nbsp;或其它程序在对话框显示时向它的&nbsp;owner&nbsp;窗体发送&nbsp;WM_ENTERIDLE&nbsp;消息。<br><br>DS_SYSMODAL&nbsp;-创建一个系统的模式对话框。<br><br>
如果你使用了&nbsp;WS_CAPTION&nbsp;风格，那么&#8220;CAPTION&nbsp;"&nbsp;A&nbsp;Dialog&nbsp;Form"&#8221;这行将在对话框标题上放上这个字符
串，&#8220;FONT&nbsp;10,&nbsp;"MS&nbsp;Sans&nbsp;Serif"&#8221;将会设置对话框内所有控件字体和尺寸。{&nbsp;和&nbsp;}&nbsp;对应&nbsp;Pascal&nbsp;中
的&nbsp;begin&nbsp;和&nbsp;end&nbsp;，在&nbsp;{&nbsp;}&nbsp;之间你可以放置希望出现在对话框上的控件，PUSHBUTTON&nbsp;是一个按钮，参数跟
在&nbsp;PUSHBUTTON&nbsp;之后，形式如：<br>PUSHBUTTON&nbsp;"Text&nbsp;on&nbsp;Control"&nbsp;IDNUMBER,&nbsp;Left,&nbsp;Top,&nbsp;Width,&nbsp;Height
后面的参数为对话框单位而不是像素。这里创建的对话框&nbsp;206&nbsp;单位宽、86&nbsp;单位高、左侧距父窗体&nbsp;12&nbsp;单位、顶部距父窗体&nbsp;10&nbsp;单位，对话框
上有静态文本框和按钮两个控件。<br><br>其他对话框控件<br>　　对话框控件的语法形式为：<br>controlName&nbsp;text,&nbsp;IDnumber,&nbsp;Left,&nbsp;Top,&nbsp;Width,&nbsp;Height,&nbsp;style,&nbsp;extended-style<br><br>DEFPUSHBUTTON&nbsp;"Cancel"&nbsp;IDCANCEL,&nbsp;8,&nbsp;67,&nbsp;&nbsp;32,&nbsp;12<br>LTEXT&nbsp;"Static&nbsp;Text&nbsp;Left&nbsp;aligned"&nbsp;&nbsp;201,&nbsp;5,&nbsp;21,&nbsp;196,&nbsp;24<br>CTEXT&nbsp;"Static&nbsp;Text&nbsp;Centered"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;202,&nbsp;18,&nbsp;12,&nbsp;170,&nbsp;8<br>ICON&nbsp;&nbsp;"Icon"&nbsp;-1,&nbsp;1,1,0,0<br>EDITTEXT&nbsp;300,&nbsp;9,&nbsp;47,&nbsp;180,&nbsp;50,&nbsp;ES_MULTILINE,&nbsp;WS_EX_CLIENTEDGE<br>CHECKBOX&nbsp;"Check&nbsp;Box",&nbsp;100,&nbsp;10,&nbsp;60,&nbsp;69,&nbsp;8<br>AUTOCHECKBOX&nbsp;"Auto&nbsp;CheckBox",&nbsp;101,&nbsp;140,&nbsp;60,&nbsp;61,&nbsp;8<br>RADIOBUTTON&nbsp;"radio",&nbsp;400,&nbsp;8,&nbsp;32,&nbsp;64,&nbsp;8<br>AUTORADIOBUTTON&nbsp;"needs&nbsp;WS_GROUP",&nbsp;401,&nbsp;8,&nbsp;42,&nbsp;64,&nbsp;8,&nbsp;WS_GROUP<br>GROUPBOX&nbsp;"GroupBox",&nbsp;-1,&nbsp;4,22,150,42<br>　　&nbsp;<br>你可以通过放置控件类型名字参数创建大部分&nbsp;Windows&nbsp;控件，参见下文的&#8220;在对话框中包含常规控件&#8221;部分。<br><br>　　使用&nbsp;DialogBox(hInstance,&nbsp;lpTemplate,&nbsp;hWndParent,&nbsp;lpDialogFunc);<br>参
见程序代码的&#8220;procedure&nbsp;DoDialog&#8221;，你会发现它设置对话框使用的一些变量，然后调用&nbsp;DialogBox(&nbsp;)。
lpTemplate&nbsp;为资源名称的&nbsp;PChar&nbsp;类型，父窗体为&nbsp;hForm1&nbsp;，lpDialogFunc&nbsp;设置为对话框函数的地址（参见帮助中
的&nbsp;DialogProc&nbsp;部分）。这个&nbsp;DialogProc&nbsp;类似于&nbsp;WndProc&nbsp;，用于获取对话框消息，参见代码中
的&nbsp;DialogProc&nbsp;。&nbsp;WM_INITDIALOG&nbsp;消息被发送后对话框就被创建了，因此你可以在这里设置控件。由于对话框是从模板创建的，所以
控件的句柄还不知道，这样可以用&nbsp;ID&nbsp;号码访问它们。通过&nbsp;GetDlgItem(hWnd,IDNUMBER)&nbsp;获取控件的句柄，你可以使用大量控件
的&nbsp;SendMessage&nbsp;或者状态变化（Enable(&nbsp;)&nbsp;等）。有几个特定的对话框函数根据&nbsp;ID&nbsp;编号直接使用
（SendDlgItemMessage、&nbsp;CheckDlgButton、&nbsp;SetDlgItemText、&nbsp;GetDlgItemText）。
在&nbsp;WM_COMMAND&nbsp;消息中，LOWORD(wParam)&nbsp;就是控件的&nbsp;ID&nbsp;号码。<br><br><br>有待完善&#8230;&#8230;&nbsp;<br><br><br>对于本文的对话框演示程序，使用的&#8220;Dlg1.rc&#8221;源文件代码如下：<br><br>Z1&nbsp;ICON&nbsp;Done2.ICO<br>Z2&nbsp;ICON&nbsp;Flop.ICO<br><br>First&nbsp;DIALOG&nbsp;&nbsp;12,&nbsp;10,&nbsp;206,&nbsp;86<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STYLE&nbsp;WS_POPUP&nbsp;|&nbsp;WS_DLGFRAME&nbsp;|&nbsp;WS_CAPTION&nbsp;|&nbsp;WS_SYSMENU<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAPTION&nbsp;"&nbsp;A&nbsp;Dialog&nbsp;Form"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FONT&nbsp;10,&nbsp;"MS&nbsp;Sans&nbsp;Serif"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CTEXT&nbsp;"Dialogs&nbsp;are&nbsp;really&nbsp;NON&nbsp;Delphi"&nbsp;200,&nbsp;18,&nbsp;1,&nbsp;170,&nbsp;10<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ICON&nbsp;&nbsp;"Z1"&nbsp;-1,&nbsp;1,1,0,0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ICON&nbsp;&nbsp;"Z2"&nbsp;-1,&nbsp;189,1,0,0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CTEXT&nbsp;"Checkbox&nbsp;was&nbsp;Unchecked"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;201,&nbsp;18,&nbsp;12,&nbsp;170,&nbsp;8<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LTEXT&nbsp;"&nbsp;"&nbsp;&nbsp;202,&nbsp;5,&nbsp;21,&nbsp;196,&nbsp;24<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EDITTEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;300,&nbsp;14,&nbsp;47,&nbsp;100,&nbsp;10<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AUTOCHECKBOX&nbsp;"Show&nbsp;MessageBox",&nbsp;100,&nbsp;10,&nbsp;60,&nbsp;69,&nbsp;8<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AUTOCHECKBOX&nbsp;"Check&nbsp;me",&nbsp;101,&nbsp;140,&nbsp;60,&nbsp;61,&nbsp;8<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEFPUSHBUTTON&nbsp;"OK"&nbsp;&nbsp;&nbsp;IDOK,&nbsp;48,&nbsp;71,&nbsp;&nbsp;32,&nbsp;12,&nbsp;WS_GROUP<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PUSHBUTTON&nbsp;"set&nbsp;Edit&nbsp;Text"&nbsp;&nbsp;&nbsp;401,&nbsp;108,&nbsp;71,&nbsp;&nbsp;44,&nbsp;12,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;<br>　　使用&nbsp;brcc32.exe&nbsp;编译&nbsp;Dlg1.rc&nbsp;文件，我不知道为什么可以不使用&#8220;&nbsp;#include&nbsp;&lt;windows.h&gt;&#8221;，但是确实通过编译了（生成&nbsp;Dlg1.RES&nbsp;文件）。<br><br>对话框程序<br>　　本程序演示了创建与使用&nbsp;Windows&nbsp;对话框的方法，你需要使用上面代码编译得到的&nbsp;Dlg1.RES&nbsp;文件。&nbsp;&nbsp;<br><br>program&nbsp;Dialogs;<br><br>uses<br>&nbsp;&nbsp;Windows,&nbsp;Messages,&nbsp;smallUtils;<br>{$R&nbsp;*.RES}<br>{$R&nbsp;Dlg1.RES}<br>var<br>&nbsp;&nbsp;wClass:&nbsp;TWndClass;<br>&nbsp;&nbsp;hForm1,&nbsp;hExitBut,&nbsp;hDlgBut,&nbsp;hCheckCB,&nbsp;hEdit1,<br>&nbsp;&nbsp;hLabel1,&nbsp;Font1,&nbsp;hLabel2,&nbsp;hLabel3:&nbsp;THandle;<br>&nbsp;&nbsp;mainMsg:&nbsp;TMSG;<br>&nbsp;&nbsp;Rect1:&nbsp;TRect;<br>&nbsp;&nbsp;DlgText,&nbsp;DlgEditText:&nbsp;String;<br>&nbsp;&nbsp;DlgChk,&nbsp;Dlg2Chk:&nbsp;Boolean;<br><br>function&nbsp;DialogProc(hWnd,Msg,wParam,lParam:Longint):Boolean;&nbsp;stdcall;<br>{这里处理对话框消息。有些消息如&nbsp;WndProc&nbsp;消息（WM_COMMAND、WM_CLOSE）列<br>在这里，有些消息（WM_INITDIALOG）没有列出。在对话框&nbsp;Proc&nbsp;经常使用<br>&nbsp;DlgItem&nbsp;ID&nbsp;而不是&nbsp;hWnd&nbsp;}<br>var<br>&nbsp;&nbsp;OKrect:TRect;<br>begin<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;case&nbsp;Msg&nbsp;of<br>WM_INITDIALOG:&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{WM_INITDIALOG&nbsp;是设置你的&nbsp;Dlg&nbsp;Items&nbsp;属性的地方，有些特定的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DlgItem&nbsp;函数（SendDlgItemMessage、SetDlgItemText）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对此比较有用。}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DlgEditText&nbsp;:=&nbsp;'';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(hWnd,&nbsp;WM_SETICON,&nbsp;1,&nbsp;LoadIcon(hInstance,'Z1'));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{对话框默认使用图标，你需要设置图标}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendDlgItemMessage(hWnd,200,WM_SETFONT,Font1,&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SendDlgItemMessage&nbsp;使用&nbsp;ID&nbsp;编号代替&nbsp;hWnd}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CheckDlgButton(hWnd,100,BST_CHECKED);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;SendMessage(hCheckCB,BM_GETCHECK,0,0)&nbsp;=&nbsp;BST_CHECKED&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{你可以从主窗体获取信息来设置对话框}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(GetDlgItem(hWnd,201),'多选按钮被勾选');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{这里可以使用&nbsp;SetWindowText，但是一样可以使用&nbsp;SetDlgItemText。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetDlgItemText(hWnd,201,'检查框被勾选');}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnableWindow(GetDlgItem(hWnd,101),False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{大部分改变窗口的函数对于对话框一样有效}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{SetWindowText(GetDlgItem(hWnd,202),PChar(DlgText));}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetDlgItemText(hWnd,202,PChar(DlgText));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetDlgItemText(hWnd,300,PChar(GetWindowStr(hEdit1)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetWindowRect(GetDlgItem(hWnd,IDOK),OKrect);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCursorPos(OKrect.Left+10,OKrect.Top+10);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>WM_COMMAND:&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{和&nbsp;MessageProc&nbsp;的&nbsp;WM_COMMAND&nbsp;消息不一样，wParam&nbsp;与&nbsp;LParam<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有不同的用途。}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;LOWORD(wParam)&nbsp;=&nbsp;IDOK&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{对话框在&nbsp;LOWORD(wParam)&nbsp;使用&nbsp;DlgItem&nbsp;ID}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(IsDlgButtonChecked(hWnd,101)&nbsp;=&nbsp;BST_CHECKED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;&nbsp;Dlg2Chk&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(IsDlgButtonChecked(hWnd,100)&nbsp;=&nbsp;BST_CHECKED)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(hWnd,'对话框上多选按钮被勾选',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'退出对话框',MB_OK&nbsp;or&nbsp;MB_ICONQUESTION);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DlgChk&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DlgEditText&nbsp;:=&nbsp;GetWindowStr(GetDlgItem(hWnd,300));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndDialog(hWnd,1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;LOWORD(wParam)&nbsp;=&nbsp;401<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;SetDlgItemText(hWnd,300,&nbsp;'新的编辑框文本')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;LOWORD(wParam)&nbsp;=&nbsp;101<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;&nbsp;MessageBox(hWnd,'对话框上多选按钮被单击',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'单击它',MB_OK&nbsp;or&nbsp;MB_ICONQUESTION);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>WM_CLOSE:&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{和&nbsp;MessageProc&nbsp;不一样，你需要使用&nbsp;EndDialog&nbsp;退出一个对话框}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndDialog(hWnd,1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>end;<br><br>procedure&nbsp;DoDialog;<br>var<br>&nbsp;&nbsp;Dsize:&nbsp;TdriveSize;<br>begin<br>&nbsp;&nbsp;if&nbsp;hLabel3&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;DestroyWindow(hLabel3);<br>&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;PeekMessage(mainMsg,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;PM_REMOVE)<br>&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;&nbsp;DispatchMessage(mainMsg);<br>&nbsp;&nbsp;&nbsp;&nbsp;hLabel3&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;Dsize&nbsp;:=&nbsp;DiskSpace('C:\');<br>&nbsp;&nbsp;DlgText&nbsp;:=&nbsp;'C&nbsp;盘总容量为&nbsp;&nbsp;'+Int2Str(Dsize.TotalS)+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'&nbsp;字节&nbsp;-&nbsp;可用空间为&nbsp;&nbsp;'+&nbsp;Int2Str(Dsize.FreeS);<br>&nbsp;&nbsp;{DlgText&nbsp;被用于对话框的静态标签控件，你应该在调用&nbsp;DialogBox(&nbsp;)&nbsp;前设置好对话框<br>&nbsp;&nbsp;需要的所有的变量。}<br>&nbsp;&nbsp;DialogBox(hInstance,&nbsp;'First',&nbsp;hForm1,&nbsp;@DialogProc);<br>&nbsp;&nbsp;{DialogBox&nbsp;将根据资源&nbsp;DIALOG&nbsp;的&nbsp;'First'&nbsp;创建一个模式对话框，它以&nbsp;hForm1&nbsp;作为<br>&nbsp;&nbsp;父窗体，以&nbsp;DialogProc&nbsp;作为&nbsp;WndProc&nbsp;(MessageProc)}<br>&nbsp;&nbsp;{可以从对话框获取返回值}<br>&nbsp;&nbsp;if&nbsp;DlgChk&nbsp;then<br>&nbsp;&nbsp;MessageBox(hForm1,'这里&nbsp;DlgChk&nbsp;=&nbsp;True',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'对话框返回值',MB_OK&nbsp;or&nbsp;MB_ICONQUESTION);<br>&nbsp;&nbsp;if&nbsp;Dlg2Chk&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;hLabel3&nbsp;:=&nbsp;CreateWindow('Static',&nbsp;'"Check&nbsp;me"&nbsp;多选按钮被勾选',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or&nbsp;SS_CENTER,6,200,370,29,hForm1,0,hInstance,nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(hLabel3,&nbsp;WM_SETFONT,&nbsp;Font1,0);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;SetWindowText(hLabel2,@DlgEditText[1]);<br>&nbsp;&nbsp;DlgChk&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;Dlg2Chk&nbsp;:=&nbsp;False;<br>end;<br><br>function&nbsp;MessageProc(hWnd,Msg,wParam,lParam:Integer):Integer;&nbsp;stdcall;<br>begin<br>&nbsp;&nbsp;case&nbsp;Msg&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;WM_COMMAND:&nbsp;if&nbsp;lParam&nbsp;=&nbsp;abs(hExitBut)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;PostMessage(hForm1,WM_CLOSE,0,0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(LParam&nbsp;=&nbsp;abs(hDlgBut))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;DoDialog;<br>&nbsp;&nbsp;&nbsp;&nbsp;WM_DESTROY:&nbsp;PostQuitMessage(0);<br>&nbsp;&nbsp;end;&nbsp;//&nbsp;case&nbsp;语句结束<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;DefWindowProc(hWnd,Msg,wParam,lParam);<br>end;<br><br>begin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;主程序开始&nbsp;//<br>&nbsp;&nbsp;DlgChk&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;Dlg2Chk&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;hLabel3&nbsp;:=&nbsp;0;<br><br>&nbsp;&nbsp;Font1&nbsp;:=&nbsp;CreateFont(-16,0,0,0,FW_BOLD,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,<br>&nbsp;&nbsp;&nbsp;CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH&nbsp;or&nbsp;FF_SWISS,'Arial');<br><br>&nbsp;&nbsp;wClass.hInstance&nbsp;:=&nbsp;hInstance;<br>&nbsp;&nbsp;with&nbsp;wClass&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;style&nbsp;:=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CS_PARENTDC&nbsp;or&nbsp;CS_BYTEALIGNWINDOW;<br>&nbsp;&nbsp;&nbsp;&nbsp;hIcon&nbsp;:=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoadIcon(hInstance,'MAINICON');<br>&nbsp;&nbsp;&nbsp;&nbsp;lpfnWndProc&nbsp;:=&nbsp;&nbsp;@MessageProc;<br>&nbsp;&nbsp;&nbsp;&nbsp;hbrBackground:=&nbsp;COLOR_BTNFACE+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;lpszClassName:=&nbsp;'Form&nbsp;Class';<br>&nbsp;&nbsp;&nbsp;&nbsp;hCursor&nbsp;:=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoadCursor(0,IDC_ARROW);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;RegisterClass(wClass);<br><br>&nbsp;&nbsp;SetRect(Rect1,0,0,430,300);<br>&nbsp;&nbsp;if&nbsp;not&nbsp;AdjustWindowRect(Rect1,WS_CAPTION&nbsp;or&nbsp;WS_MINIMIZEBOX&nbsp;or&nbsp;WS_SYSMENU,False)<br>&nbsp;&nbsp;then&nbsp;SetRect(Rect1,0,0,438,328);<br><br>&nbsp;&nbsp;hForm1&nbsp;:=&nbsp;CreateWindow(wClass.lpszClassName,&nbsp;'对话框演示程序',<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_CAPTION&nbsp;or&nbsp;WS_MINIMIZEBOX&nbsp;or&nbsp;WS_SYSMENU&nbsp;or&nbsp;WS_VISIBLE,<br>&nbsp;&nbsp;&nbsp;&nbsp;(GetSystemMetrics(SM_CXSCREEN)&nbsp;div&nbsp;2)-200,<br>&nbsp;&nbsp;&nbsp;&nbsp;(GetSystemMetrics(SM_CYSCREEN)&nbsp;div&nbsp;2)-160,<br>&nbsp;&nbsp;&nbsp;&nbsp;Rect1.Right-Rect1.Left,&nbsp;Rect1.Bottom-Rect1.Top,<br>&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;0,&nbsp;hInstance,&nbsp;nil);<br><br>&nbsp;&nbsp;hLabel1&nbsp;:=&nbsp;CreateWindow('Static',&nbsp;'对话框演示',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or&nbsp;SS_CENTER,8,8,388,22,hForm1,0,hInstance,nil);<br>&nbsp;&nbsp;SendMessage(hLabel1,WM_SETFONT,Font1,0);<br><br>&nbsp;&nbsp;hLabel2&nbsp;:=&nbsp;CreateWindow('Static',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'在下面输入你想放置到对话框的文字'#10'对话框编辑框如数的文字将在此显示',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or&nbsp;SS_LEFT,10,38,290,28,hForm1,0,hInstance,nil);<br>&nbsp;&nbsp;SendMessage(hLabel2,WM_SETFONT,GetStockObject(ANSI_VAR_FONT),0);<br><br>&nbsp;&nbsp;hExitBut&nbsp;:=&nbsp;CreateWindow('Button','退&nbsp;出',<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or&nbsp;BS_PUSHBUTTON&nbsp;or&nbsp;BS_TEXT,<br>&nbsp;&nbsp;&nbsp;&nbsp;350,270,74,24,&nbsp;hForm1,0,&nbsp;hInstance,nil);<br><br>&nbsp;&nbsp;hEdit1&nbsp;:=&nbsp;CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','这里输入的文字将显示在对话框中',<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or&nbsp;ES_LEFT&nbsp;or&nbsp;ES_AUTOHSCROLL,<br>&nbsp;&nbsp;&nbsp;&nbsp;16,78,410,21,hForm1,0,hInstance,nil);<br>&nbsp;&nbsp;SendMessage(hEdit1,WM_SETFONT,GetStockObject(ANSI_VAR_FONT),0);<br><br>&nbsp;&nbsp;hDlgBut&nbsp;:=&nbsp;CreateWindow('Button','显示对话框',<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_VISIBLE&nbsp;or&nbsp;WS_CHILD&nbsp;or&nbsp;BS_PUSHBUTTON&nbsp;or&nbsp;BS_TEXT,<br>&nbsp;&nbsp;&nbsp;&nbsp;30,160,144,24,&nbsp;hForm1,0,&nbsp;hInstance,nil);<br>&nbsp;&nbsp;SendMessage(hDlgBut,&nbsp;WM_SETFONT,&nbsp;GetStockObject(ANSI_VAR_FONT),0);<br><br>&nbsp;&nbsp;hCheckCB&nbsp;:=&nbsp;CreateWindow('Button','对话框多选检测按钮',<br>&nbsp;&nbsp;&nbsp;&nbsp;WS_CHILD&nbsp;or&nbsp;BS_AUTOCHECKBOX&nbsp;or&nbsp;WS_VISIBLE,<br>&nbsp;&nbsp;&nbsp;&nbsp;20,130,190,24,&nbsp;hForm1,0,hInstance,nil);<br>&nbsp;&nbsp;SendMessage(hCheckCB,&nbsp;WM_SETFONT,&nbsp;GetStockObject(ANSI_VAR_FONT),0);<br><br>&nbsp;&nbsp;while&nbsp;GetMessage(mainMsg,0,0,0)&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;TranslateMessage(mainMsg);<br>&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(mainMsg);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;DeleteObject(Font1);<br>&nbsp;&nbsp;DlgText&nbsp;:=&nbsp;'';<br>&nbsp;&nbsp;DlgEditText&nbsp;:=&nbsp;'';<br>end.<br><br>&nbsp;<br><br>在对话框中包含常规控件<br>　　为了在对话框里创建预定义的控件类，可以使用如下的一般语法，参数为：<br><br>ClassName&nbsp;text,&nbsp;IDnumber,&nbsp;x,&nbsp;y,&nbsp;width,&nbsp;height&nbsp;,&nbsp;style&nbsp;,&nbsp;extended-style<br>
&nbsp;X&nbsp;和&nbsp;width&nbsp;是水平方向单位，是对话框基本宽度单位的&nbsp;1/4&nbsp;，Y&nbsp;和&nbsp;height&nbsp;是竖直方向单位，是对话框基本高度单位的&nbsp;1
/8&nbsp;。当前对话框基本单位是计算机从当前系统字体的高度和宽度得到的，GetDialogBaseUnits(&nbsp;)&nbsp;函数可以返回对话框基本单位的对应
像素值。<br><br>ControlName&nbsp;-&nbsp;预定义的控件的类名，比如&nbsp;BUTTON、&nbsp;COMBOBOX、&nbsp;EDIT、&nbsp;LISTBOX、&nbsp;SCROLLBAR、&nbsp;STATIC&nbsp;等。<br><br>text&nbsp;-&nbsp;指
定控件上显示的文本。文本位置在控件指定尺寸之内或者接近控件。这个参数是有双引号（"）括起来的&nbsp;0&nbsp;到多个字符。字符串自动以零结束并在资源文件返回
结果中转换成&nbsp;Unicode&nbsp;字符。默认情况下，双引号括起的字符是&nbsp;ANSI&nbsp;字符，交换码顺序被认为是按位交换码顺序。如果字符串加上&nbsp;L&nbsp;前缀，
字符串被认为是宽字符组成，交换码顺序被认为是两位交换码，这就是&nbsp;Unicode&nbsp;字符。如果双引号本身在文本内，那么需要连续使用双引号两次。
And&nbsp;符号（&amp;）放在文本中表示后面跟着的字符是控件的助记符（加速字符），当控件显示的时候，&amp;&nbsp;不会出现，后面的字符会自动加上下
划线显示，用户可以通过按下下划线助记符来选择这个控件。为了在字符串中使用&nbsp;&amp;&nbsp;字符，你需要连续两次使用（&amp;&amp;）。<br><br>IDnumber&nbsp;-&nbsp;指定控件标识。这个值为&nbsp;Word&nbsp;类型，介于&nbsp;0&nbsp;到&nbsp;65,535&nbsp;之间。<br><br>x&nbsp;-&nbsp;给出控件在对话框客户区域左边距，这个值为&nbsp;Word&nbsp;类型，介于&nbsp;0&nbsp;到&nbsp;65,535&nbsp;之间。这个坐标轴在对话框的客户区域的左边缘为&nbsp;0&nbsp;对话框单位。<br><br>y&nbsp;-&nbsp;给出控件在对话框客户区域上边距，这个值为&nbsp;Word&nbsp;类型，介于&nbsp;0&nbsp;到&nbsp;65,535&nbsp;之间。这个坐标轴在对话框的客户区域的上边缘为&nbsp;0&nbsp;对话框单位。<br><br>width&nbsp;-&nbsp;指
定控件宽度，这个值为&nbsp;Word&nbsp;类型，介于&nbsp;1&nbsp;到&nbsp;65,535&nbsp;之间。宽度单位为&nbsp;1/4&nbsp;字符。
Specifies&nbsp;the&nbsp;width&nbsp;of&nbsp;the&nbsp;control.&nbsp;This&nbsp;value&nbsp;must&nbsp;be&nbsp;a&nbsp;Word&nbsp;value&nbsp;in&nbsp;the&nbsp;range&nbsp;1&nbsp;through&nbsp;65,535.&nbsp;The&nbsp;width&nbsp;is&nbsp;in&nbsp;1/4-character&nbsp;units.&nbsp;<br>height&nbsp;-&nbsp;指定控件高度，这个值为&nbsp;Word&nbsp;类型，介于&nbsp;1&nbsp;到&nbsp;65,535&nbsp;之间。宽度单位为&nbsp;1/8&nbsp;字符。&nbsp;<br><br>style&nbsp;-&nbsp;指定控件的风格。利用逻辑或操作（&nbsp;|&nbsp;）组合多个风格。&nbsp;<br><br>extended-style&nbsp;-&nbsp;指定扩展风格（WS_EX_xxx）。你必须给定一种风格以便使用扩展风格<img src ="http://www.cppblog.com/michaelgao/aggbug/63200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-10-03 21:55 <a href="http://www.cppblog.com/michaelgao/archive/2008/10/03/63200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Debug 和 Release 编译方式的本质区别</title><link>http://www.cppblog.com/michaelgao/archive/2008/06/18/53909.html</link><dc:creator>micheal's tech</dc:creator><author>micheal's tech</author><pubDate>Wed, 18 Jun 2008 09:30:00 GMT</pubDate><guid>http://www.cppblog.com/michaelgao/archive/2008/06/18/53909.html</guid><wfw:comment>http://www.cppblog.com/michaelgao/comments/53909.html</wfw:comment><comments>http://www.cppblog.com/michaelgao/archive/2008/06/18/53909.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/michaelgao/comments/commentRss/53909.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/michaelgao/services/trackbacks/53909.html</trackback:ping><description><![CDATA[<p>一、Debug 和 Release 编译方式的本质区别</p>
<p>&nbsp;&nbsp;&nbsp; Debug 通常称为调试版本，它包含调试信息，并且不作任何优化，便于程序员调试程序。Release 称为发布版本，它往往是进行了各种优化，使得程序在代码大小和运行速度上都是最优的，以便用户很好地使用。<br>&nbsp;&nbsp;&nbsp; Debug 和 Release 的真正秘密，在于一组编译选项。下面列出了分别针对二者的选项（当然除此之外还有其他一些，如/Fd /Fo，但区别并不重要，通常他们也不会引起 Release 版错误，在此不讨论）<br>&nbsp;&nbsp;&nbsp; <br>Debug 版本：<br>&nbsp;/MDd /MLd 或 /MTd&nbsp;&nbsp; 使用 Debug runtime library(调试版本的运行时刻函数库)<br>&nbsp;/Od&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关闭优化开关<br>&nbsp;/D "_DEBUG"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相当于 #define _DEBUG,打开编译调试代码开关(主要针对<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assert函数)<br>&nbsp;/ZI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建 Edit and continue(编辑继续)数据库，这样在调试过<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程中如果修改了源代码不需重新编译<br>&nbsp;/GZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以帮助捕获内存错误<br>&nbsp;/Gm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开最小化重链接开关，减少链接时间<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>Release 版本：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;/MD /ML 或 /MT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用发布版本的运行时刻函数库<br>&nbsp;/O1 或 /O2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 优化开关，使程序最小或最快<br>&nbsp;/D "NDEBUG"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关闭条件编译调试代码开关(即不编译assert函数)<br>&nbsp;/GF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 合并重复的字符串，并将字符串常量放到只读内存，防止<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被修改</p>
<p>&nbsp;&nbsp;&nbsp; 实际上，Debug 和 Release 并没有本质的界限，他们只是一组编译选项的集合，编译器只是按照预定的选项行动。事实上，我们甚至可以修改这些选项，从而得到优化过的调试版本或是带跟踪语句的发布版本。<br>&nbsp;&nbsp;&nbsp; <br>二、哪些情况下 Release 版会出错</p>
<p>&nbsp;&nbsp;&nbsp; 有了上面的介绍，我们再来逐个对照这些选项看看 Release 版错误是怎样产生的<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;1. Runtime Library：链接哪种运行时刻函数库通常只对程序的性能产生影响。调试版本的 Runtime Library 包含了调试信息，并采用了一些保护机制以帮助发现错误，因此性能不如发布版本。编译器提供的 Runtime Library 通常很稳定，不会造成 Release 版错误；倒是由于 Debug 的 Runtime Library 加强了对错误的检测，如堆内存分配，有时会出现 Debug 有错但 Release 正常的现象。应当指出的是，如果 Debug 有错，即使 Release 正常，程序肯定是有 Bug 的，只不过可能是 Release 版的某次运行没有表现出来而已。<br>&nbsp;<br>&nbsp;2. 优化：这是造成错误的主要原因，因为关闭优化时源程序基本上是直接翻译的，而打开优化后编译器会作出一系列假设。这类错误主要有以下几种：<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; (1) 帧指针(Frame Pointer)省略（简称 FPO ）：在函数调用过程中，所有调用信息（返回地址、参数）以及自动变量都是放在栈中的。若函数的声明与实现不同（参数、返回值、调用方式），就会产生错误————但 Debug 方式下，栈的访问通过 EBP 寄存器保存的地址实现，如果没有发生数组越界之类的错误（或是越界&#8220;不多&#8221;），函数通常能正常执行；Release 方式下，优化会省略 EBP 栈基址指针，这样通过一个全局指针访问栈就会造成返回地址错误是程序崩溃。C++ 的强类型特性能检查出大多数这样的错误，但如果用了强制类型转换，就不行了。你可以在 Release 版本中强制加入 /Oy- 编译选项来关掉帧指针省略，以确定是否此类错误。此类错误通常有：<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; ● MFC 消息响应函数书写错误。正确的应为<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON_MESSAGE 宏包含强制类型转换。防止这种错误的方法之一是重定义 ON_MESSAGE 宏，把下列代码加到 stdafx.h 中（在#include "afxwin.h"之后）,函数原形错误时编译会报错<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #undef ON_MESSAGE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define ON_MESSAGE(message, memberFxn) \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { message, 0, 0, 0, AfxSig_lwl, \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (AFX_PMSG)(AFX_PMSGW)(static_cast&lt; LRESULT (AFX_MSG_CALL \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CWnd::*)(WPARAM, LPARAM) &gt; (&amp;memberFxn) },<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; (2) volatile 型变量：volatile 告诉编译器该变量可能被程序之外的未知方式修改（如系统、其他进程和线程）。优化程序为了使程序性能提高，常把一些变量放在寄存器中（类似于 register 关键字），而其他进程只能对该变量所在的内存进行修改，而寄存器中的值没变。如果你的程序是多线程的，或者你发现某个变量的值与预期的不符而你确信已正确的设置了，则很可能遇到这样的问题。这种错误有时会表现为程序在最快优化出错而最小优化正常。把你认为可疑的变量加上 volatile 试试。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; (3) 变量优化：优化程序会根据变量的使用情况优化变量。例如，函数中有一个未被使用的变量，在 Debug 版中它有可能掩盖一个数组越界，而在 Release 版中，这个变量很可能被优化调，此时数组越界会破坏栈中有用的数据。当然，实际的情况会比这复杂得多。与此有关的错误有：<br>&nbsp;&nbsp;&nbsp;&nbsp; ● 非法访问，包括数组越界、指针错误等。例如<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void fn(void)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int a[4];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[-1] = 1;//当然错误不会这么明显，例如下标是变量<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[4] = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j 虽然在数组越界时已出了作用域，但其空间并未收回，因而 i 和 j 就会掩盖越界。而 Release 版由于 i、j 并未其很大作用可能会被优化掉，从而使栈被破坏。</p>
<p>3. _DEBUG 与 NDEBUG ：当定义了 _DEBUG 时，assert() 函数会被编译，而 NDEBUG 时不被编译。除此之外，VC++中还有一系列断言宏。这包括：</p>
<p>&nbsp;&nbsp;&nbsp; ANSI C 断言&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void assert(int expression );<br>&nbsp;&nbsp;&nbsp; C Runtime Lib 断言&nbsp; _ASSERT( booleanExpression );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ASSERTE( booleanExpression );<br>&nbsp;&nbsp;&nbsp; MFC 断言&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASSERT( booleanExpression );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VERIFY( booleanExpression );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASSERT_VALID( pObject );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASSERT_KINDOF( classname, pobject );<br>&nbsp;&nbsp;&nbsp; ATL 断言&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ATLASSERT( booleanExpression );<br>&nbsp;&nbsp;&nbsp; 此外，TRACE() 宏的编译也受 _DEBUG 控制。</p>
<p>所有这些断言都只在 Debug版中才被编译，而在 Release 版中被忽略。唯一的例外是 VERIFY() 。事实上，这些宏都是调用了 assert() 函数，只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了任何程序代码，而不只是布尔表达式（例如赋值、能改变变量值的函数调用 等），那么 Release 版都不会执行这些操作，从而造成错误。初学者很容易犯这类错误，查找的方法也很简单，因为这些宏都已在上面列出，只要利用 VC++ 的 Find in Files 功能在工程所有文件中找到用这些宏的地方再一一检查即可。另外，有些高手可能还会加入 #ifdef _DEBUG 之类的条件编译，也要注意一下。<br>&nbsp;&nbsp;&nbsp; 顺便值得一提的是 VERIFY() 宏，这个宏允许你将程序代码放在布尔表达式里。这个宏通常用来检查 Windows API 的返回值。有些人可能为这个原因而滥用 VERIFY() ，事实上这是危险的，因为 VERIFY() 违反了断言的思想，不能使程序代码和调试代码完全分离，最终可能会带来很多麻烦。因此，专家们建议尽量少用这个宏。</p>
<p>4. /GZ 选项：这个选项会做以下这些事</p>
<p>&nbsp;&nbsp;&nbsp; (1) 初始化内存和变量。包括用 0xCC 初始化所有自动变量，0xCD ( Cleared Data ) 初始化堆中分配的内存（即动态分配的内存，例如 new ），0xDD ( Dead Data ) 填充已被释放的堆内存（例如 delete ），0xFD( deFencde Data ) 初始化受保护的内存（debug 版在动态分配内存的前后加入保护内存以防止越界访问），其中括号中的词是微软建议的助记词。这样做的好处是这些值都很大，作为指针是不可能的（而且 32 位系统中指针很少是奇数值，在有些系统中奇数的指针会产生运行时错误），作为数值也很少遇到，而且这些值也很容易辨认，因此这很有利于在 Debug 版中发现 Release 版才会遇到的错误。要特别注意的是，很多人认为编译器会用 0 来初始化变量，这是错误的（而且这样很不利于查找错误）。<br>&nbsp;&nbsp;&nbsp; (2) 通过函数指针调用函数时，会通过检查栈指针验证函数调用的匹配性。（防止原形不匹配）<br>&nbsp;&nbsp;&nbsp; (3) 函数返回前检查栈指针，确认未被修改。（防止越界访问和原形不匹配，与第二项合在一起可大致模拟帧指针省略 FPO ）<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 通常 /GZ 选项会造成 Debug 版出错而 Release 版正常的现象，因为 Release 版中未初始化的变量是随机的，这有可能使指针指向一个有效地址而掩盖了非法访问。<br>&nbsp;&nbsp;&nbsp; <br>除此之外，/Gm /GF 等选项造成错误的情况比较少，而且他们的效果显而易见，比较容易发现。</p>
<p>三、怎样&#8220;调试&#8221; Release 版的程序</p>
<p>&nbsp;&nbsp;&nbsp; 遇到 Debug 成功但 Release 失败，显然是一件很沮丧的事，而且往往无从下手。如果你看了以上的分析，结合错误的具体表现，很快找出了错误，固然很好。但如果一时找不出，以下给出了一些在这种情况下的策略。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 1. 前面已经提过，Debug 和 Release 只是一组编译选项的差别，实际上并没有什么定义能区分二者。我们可以修改 Release 版的编译选项来缩小错误范围。如上所述，可以把 Release 的选项逐个改为与之相对的 Debug 选项，如 /MD 改为 /MDd、/O1 改为 /Od，或运行时间优化改为程序大小优化。注意，一次只改一个选项，看改哪个选项时错误消失，再对应该选项相关的错误，针对性地查找。这些选项在 Project\Settings... 中都可以直接通过列表选取，通常不要手动修改。由于以上的分析已相当全面，这个方法是最有效的。</p>
<p>&nbsp;&nbsp;&nbsp; 2. 在编程过程中就要时常注意测试 Release 版本，以免最后代码太多，时间又很紧。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 3. 在 Debug 版中使用 /W4 警告级别，这样可以从编译器获得最大限度的错误信息，比如 if( i =0 )就会引起 /W4 警告。不要忽略这些警告，通常这是你程序中的 Bug 引起的。但有时 /W4 会带来很多冗余信息，如 未使用的函数参数 警告，而很多消息处理函数都会忽略某些参数。我们可以用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #progma warning(disable: 4702) //禁止<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #progma warning(default: 4702) //重新允许<br>来暂时禁止某个警告，或使用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #progma warning(push, 3) //设置警告级别为 /W3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #progma warning(pop) //重设为 /W4<br>来暂时改变警告级别，有时你可以只在认为可疑的那一部分代码使用 /W4。</p>
&nbsp;&nbsp;&nbsp; 4.你也可以像 Debug 一样调试你的 Release 版，只要加入调试符号。在 Project/Settings... 中，选中 Settings for "Win32 Release"，选中 C/C++ 标签，Category 选 General，Debug Info 选 Program Database。再在 Link 标签 Project options&nbsp; 最后加上 "/OPT:REF" (引号不要输)。这样调试器就能使用 pdb 文件中的调试符号。但调试时你会发现断点很难设置，变量也很难找到——这些都被优化过了。不过令人庆幸的是，Call Stack 窗口仍然工作正常，即使帧指针被优化，栈信息（特别是返回地址）仍然能找到。这对定位错误很有帮助。
<br> <img src ="http://www.cppblog.com/michaelgao/aggbug/53909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/michaelgao/" target="_blank">micheal's tech</a> 2008-06-18 17:30 <a href="http://www.cppblog.com/michaelgao/archive/2008/06/18/53909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>