﻿<?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++博客-C++ Programmer's Cookbook-随笔分类-MFC/QT</title><link>http://www.cppblog.com/mzty/category/201.html</link><description>&lt;br/&gt;  
&lt;br/&gt;
&lt;a href = "http://www.cppblog.com/mzty/archive/2007/03/02/19109.html"&gt;&lt;font size = 5 color ="#00FFFF"&gt;{C++ 基础}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "http://www.cppblog.com/mzty/archive/2007/08/13/29922.html"&gt;&lt;font size = 5 color ="#00FFFF"&gt;{C++ 高级}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "http://www.cppblog.com/mzty/archive/2007/04/16/22064.html"&gt;&lt;font size = 5 color ="#00FFFF"&gt;{C#界面，C++核心算法}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "http://www.cppblog.com/mzty/archive/2007/03/04/19163.html"&gt;&lt;font size = 5 color ="#00FFFF"&gt;{设计模式}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "
http://www.cppblog.com/mzty/archive/2007/03/04/19167.html"&gt;&lt;font size = 5 color ="#FF0000"&gt;{C#基础}&lt;font/&gt;&lt;/a&gt;





</description><language>zh-cn</language><lastBuildDate>Thu, 22 May 2008 09:01:31 GMT</lastBuildDate><pubDate>Thu, 22 May 2008 09:01:31 GMT</pubDate><ttl>60</ttl><item><title>微软C++标准（事件实例）</title><link>http://www.cppblog.com/mzty/archive/2006/11/25/15657.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Sat, 25 Nov 2006 09:38:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/11/25/15657.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/15657.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/11/25/15657.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/15657.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/15657.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一 微软C++标准关键字（包括标准C++,托管C++,微软扩展C++,C++/CLI）__abstract 2abstract__alignof Operatorarray__asm__assume__basedbool__box 2breakcasecatch__cdeclcharclassconstconst_castcontinue__declspecdefault__delegate 2d...&nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2006/11/25/15657.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/15657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-11-25 17:38 <a href="http://www.cppblog.com/mzty/archive/2006/11/25/15657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何调试程序的 Release 版本？(转)</title><link>http://www.cppblog.com/mzty/archive/2006/11/19/15439.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Sun, 19 Nov 2006 15:39:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/11/19/15439.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/15439.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/11/19/15439.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/15439.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/15439.html</trackback:ping><description><![CDATA[很多时候程序的 Debug 版本运行没有任何问题，但是一旦发布 Release 版本后，运行就出错，着实让人郁闷。大家知道，VC++ 中 Release 版本是对无法对源代码进行调试的。一般的做法是在怀疑有错误的代码前后插入MessageBox 函数，在函数中显示可能导致错误的变量的值。或者插入写文件的语句，输出可能导致错误的变量的值到一个记录文件。其实，除了上面讲的这个办法之外，还有其它的途径来调试 Release 版本的。下面就结合自己的经验和网上查找的一些资料给出调试 Release 版本的两个方法：<br /><br />方法一、利用 *.PDB 符号文件调试 Release 版本<br />在 VCKBASE 的在线杂志中有一篇参考文章：符号文件——Windows 应用程序调试必备（http://www.vckbase.com/document/viewdoc/?id=1710），文章谈到了如何产生 Release 版本二进制文件对应的 PDB 文件的问题。有了 PDB 文件后，就可以调试 Release 了，方法是：<br />    1、在Project Settings里选Settings For为All Configurations。 <br />    2、在C/C++标签中，Debug info 选 Program Database。 <br />    3、在Link 标签中，Category选 Debug，选中Debug info 复选框和Microsoft format。 <br />进行了上述设置后，我们就可以像在调试版本中那样设置断点进行测试了，由于代码优化，有些变量观察不到，行的运行顺序可能也会不同。 <br />有一点需要注意：ASSERT宏在 Release 版本中不起作用，在 Release 版本中应该使用 VERIFY 来代替 ASSERT 进行调试。如果发行版本运行有问题，可以先禁止所有代码优化再进行调试。<br /><br />方法二、在需要加断点的地方添加如下汇编语句： <br />    __asm int 3 <br /><br />不过调试的时候无法显示C程序，只有asm代码。 <br />     <br />此处 int 3 是专门用来设置断点的，是 CPU 定义的，Windows 和 DOS 下的大多数调试器都采用这种方法。<br /><br />本贴不断更新中，希望大家跟贴贡献出更好的调试方法。以便受益者少走弯路...... <img src ="http://www.cppblog.com/mzty/aggbug/15439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-11-19 23:39 <a href="http://www.cppblog.com/mzty/archive/2006/11/19/15439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中动态生成控件(转)</title><link>http://www.cppblog.com/mzty/archive/2006/11/14/15150.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 14 Nov 2006 05:06:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/11/14/15150.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/15150.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/11/14/15150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/15150.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/15150.html</trackback:ping><description><![CDATA[
		<strong>动态控件是指在需要时由Create()创建的控件，这与预先在对话框中放置的控件是不同的。 <br /><br />　　一、创建动态控件：<br /><br />　　为了对照，我们先来看一下静态控件的创建。<br /><br />　　放置静态控件时必须先建立一个容器，一般是对话框，这时我们在对话框编辑窗口中，从工具窗口中拖出所需控件放在对话框中即可，再适当修改控件ID，设置控件属性，一个静态控件就创建好了，当对话框被显示时，其上的控件也会显示。<br /><br />　　静态控件不需要调用Create()函数来创建。<br /><br />　　而创建动态控件有很大不同，以下以按钮为例，看一下动态控件的创建过程：<br /><br />　　1.建立控件ID号：<br /><br />　　ID号是控件的标识，创建控件前必须先为它设置一个ID号。<br /><br />　　打开资源中的“String Table”，在空白行上双击鼠标，这时会弹出一个ID属性对话框，在其中的ID编辑框中输入ID，如：IDC_MYBUTTON，在Caption中输入控件标题或注解（注：Caption框不能为空，为空会导致创建失败），这里我输入的是按钮上要显示的文字--动态按钮。<br /><br />　　2.建立控件对象：<br /><br />　　不同种类的控件应创建不同的类对象：<br /><br />　　·按钮控件 CButton （包括普通按钮、单选按钮和复选按钮）<br />　　·编辑控件 CEdit<br />　　·静态文本控件 CStatic<br />　　·标签控件 CTabCtrl<br />　　·旋转控件 CSpinButtonCtrl<br />　　·滑标控件 CSliderCtrl<br />　　·多信息编辑控件 CRichEditCtrl<br />　　·进度条控件 CProgressCtrl<br />　　·滚动条控件 CSrcollBar<br />　　·组合框控件 CComboBox<br />　　·列表框控件 CListBox<br />　　·图像列表控件 CImageCtrl<br />　　·树状控件 CTreeCtrl<br />　　·动画控件 CAnimateCtrl<br /><br />　　本例中我们创建一个CButton类的普通按钮。注意不能直接定义CButton对象，如：CButton m_MyBut;这种定义只能用来给静态控件定义控制变量，不能用于动态控件。<br /><br />　　正确做法是用new调用CButton构造函数生成一个实例：<br /><br /></strong>
		<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1">
				<tbody>
						<tr>
								<td>CButton *p_MyBut = new CButton();</td>
						</tr>
				</tbody>
		</table>
		<br />　　然后用CButton类的Create()函数创建，该函数原型如下：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT&amp; rect, CWnd* pParentWnd, UINT nID );</td></tr></tbody></table><br />　　lpszCaption是按钮上显示的文本；dwStyle指定按钮风格，可以是按钮风格与窗口风格的组合，取值有：<br /><br />　　窗口风格：<br /><br />　　·WS_CHILD 子窗口，必须有<br />　　·WS_VISIBLE 窗口可见，一般都有<br />　　·WS_DISABLED 禁用窗口，创建初始状态为灰色不可用的按钮时使用<br />　　·WS_TABSTOP 可用Tab键选择<br />　　·WS_GROUP 成组，用于成组的单选按钮中的第一个按钮<br /><br />　　按钮风格：<br /><br />　　·BS_PUSHBUTTON 下压式按钮，也即普通按钮<br />　　·BS_AUTORADIOBUTTON 含自动选中状态的单选按钮<br />　　·BS_RADIOBUTTON 单选按钮，不常用<br />　　·BS_AUTOCHECKBOX 含自动选中状态的复选按钮<br />　　·BS_CHECKBOX 复选按钮，不常用<br />　　·BS_AUTO3STATE 含自动选中状态的三态复选按钮<br />　　·BS_3STATE 三态复选按钮，不常用<br />　<br />　　以上风格指定了创建的按钮类型，不能同时使用，但必须有其一。<br /><br />　　·BS_BITMAP 按钮上将显示位图<br />　　·BS_DEFPUSHBUTTON 设置为默认按钮，只用于下压式按钮，一个对话框中只能指定一个默认按钮<br />　　·rect指定按钮的大小和位置；<br />　　·pParentWnd指示拥有按钮的父窗口，不能为NULL；<br />　　·nID指定与按钮关联的ID号，用上一步创建的ID号。<br /><br />　　不同控件类的Create()函数略有不同，可参考相关资料。<br /><br />　　例：p_MyBut-&gt;Create( "动态按钮", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20,10,80,40), this, IDC_MYBUTTON );<br />这样，我们就在当前对话框中的(20,10)处创建了宽60，高30，按钮文字为“动态按钮”的下压式按钮。<br /><br />　　为了使创建过程更方便易用，我定义了如下函数：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>CButton* CTextEditorView::NewMyButton(int nID,CRect rect,int nStyle)<br />{<br />CString m_Caption;<br />m_Caption.LoadString( nID ); //取按钮标题<br />CButton *p_Button = new CButton();<br />ASSERT_VALID(p_Button);<br />p_Button-&gt;Create( m_Caption, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | nStyle, rect, this, nID ); //创建按钮<br />return p_Button;<br />} </td></tr></tbody></table><br />　　其中m_Caption.LoadString( nID )是从字符串表中读取按钮文本，这样在创建按钮ID时，应该把文本设置好，参数nStyle为除必须风格外的额外风格。<br /><br />　　以下，我调用该函数创建三个按钮，并指定第一个按钮为默认按钮，按钮的ID已预先设置好了：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>CButton *p_MyBut[3];<br />p_MyBut[0] = NewMyButton( ID_MYBUT1, CRect(10,20,50,35), BS_DEFPUSHBUTTON );<br />p_MyBut[1] = NewMyButton( ID_MYBUT2, CRect(55,20,95,35), 0 );<br />p_MyBut[2] = NewMyButton( ID_MYBUT3, CRect(100,20,140,35), 0 ); </td></tr></tbody></table><br />　　<strong>二、动态控件的响应</strong>：<br /><br />　　动态控件的响应函数不能用ClassWizard添加，只能手动添加。仍以上面的按钮为例，我们制作按钮的单击响应函数。<br /><br />　　1.在MESSAGE_MAP中添加响应函数：<br /><br />　　MESSAGE_MAP表中定义了消息响应函数，其格式为：消息名(ID,函数名)，当我们用ClassWizard添加函数时，会自动添加在AFX_MSG_MAP括起的区间内，如：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)<br />//{{AFX_MSG_MAP(CTextEditorView)<br />ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)<br />//}}AFX_MSG_MAP<br />END_MESSAGE_MAP() </td></tr></tbody></table>　<br />　　手工添加时不要添加到AFX_MSG_MAP区间内，以防ClassWizard不能正常工作，如： <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)<br />//{{AFX_MSG_MAP(CTextEditorView)<br />ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)<br />//}}AFX_MSG_MAP<br />ON_BN_CLICKED(ID_MYBUT1, OnMybut1)<br />ON_BN_CLICKED(ID_MYBUT2, OnMybut2)<br />ON_BN_CLICKED(ID_MYBUT3, OnMybut3)<br />END_MESSAGE_MAP() </td></tr></tbody></table><br />　　其中ON_BN_CLICKED是按钮单击消息。<br /><br />　　2.在头文件中添加函数定义：<br /><br />　　用ClassWizard添加函数时，会在头文件的AFX_MSG区间内添加函数定义，如： <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>protected:<br />//{{AFX_MSG(CTextEditorView)<br />afx_msg void OnIconbut0();<br />//}}AFX_MSG<br />DECLARE_MESSAGE_MAP() </td></tr></tbody></table><br />　　我们模仿这种形式，只是把函数定义添加到AFX_MSG区间外就行了：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>protected:<br />//{{AFX_MSG(CTextEditorView)<br />afx_msg void OnIconbut0();<br />//}}AFX_MSG<br />afx_msg void OnMybut1();<br />afx_msg void OnMybut2();<br />afx_msg void OnMybut3();<br />DECLARE_MESSAGE_MAP() </td></tr></tbody></table><br />　　3.编写消息响应函数：<br /><br />　　以上是把消息和函数关联起来了，具体在单击按钮后应做的工作在函数中完成： <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>void CTextEditorView::OnMybut1()<br />{<br />MessageBox( "哈！你单击了动态按钮。" );<br />}<br />void CTextEditorView::OnMybut2()<br />{<br />……<br />}<br />void CTextEditorView::OnMybut3()<br />{<br />……<br />} </td></tr></tbody></table><br />　　除了按钮的响应函数外，你还可以用上面获得的指针访问按钮，如：<br /><br />　　修改按钮的大小和位置：p_MyBut[0]-&gt;MoveWindow(……);<br /><br />　　修改按钮文本：p_MyBut[0]-&gt;SetWindowText(……);<br /><br />　　显示/隐藏按钮：p_MyBut[0]-&gt;ShowWindow(……);等等。<br />三、回收资源：<br /><br />　　由于动态控件对象是由new生成的，它不会被程序自动释放，所以需手工释放。在控件不再使用时可以删除它：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>if( p_MyBut[0] )<br />delete p_MyBut[0]; </td></tr></tbody></table><br />　　以上就是按钮控件动态生成的方法。下面，再看一下单选按钮的动态生成问题。 四、实例：单选按钮组的动态生成<br /><br />　　单选按钮也属于CButton类，但由于单选按钮总是成组使用的，所以它在制作和使用上与普通按钮有一定区别。<br /><br />　　假设有三个单选按钮组成一组，初始时，第一个单选按钮处于选中状态。<br /><br />　　我们先来看静态制作方法：在对话框中放置三个单选按钮，设置属性如下：<br /><br />　　·Radio1属性：Visible、Group、Tab stop、Auto<br />　　·Radio2属性：Visible、Tab stop、Auto<br />　　·Radio3属性：Visible、Tab stop、Auto<br /><br />　　这样的属性设置就把三个单选按钮分成了一组，它们一次只能有一个被选中，若对话框中还有其它成组的单选按钮，使用时也会互不干扰。但这时还没有使第一个按钮处于选中状态。<br /><br />　　接着就用ClassWizard为这组单选按钮添加变量，这里只需为第一个单选按钮添加变量即可。设变量名为m_Radio，类型选为int型。在构造函数中ClassWizard把m_Radio的值设置为-1，我们把它改为0，这样在运行程序时可以看到第一个单选按钮处于选中状态了。之后，还应该用ClassWizard为三个单选按钮添加单击响应函数，在里面修改m_Radio的值对应三个单选按钮就可以了。<br /><br />　　以上就是通常制作单选按钮组的办法，现我们欲改为动态生成，主要要解决按钮分组和单击控制问题。以下为制作步骤：<br /><br />　　1.定义三个单选按钮的ID：<br /><br />　　打开资源中的“String Table”，在其中添加三个ID值：<br /><br />　　·第一个：ID为IDC_MYRADIO1，Caption为单选1<br />　　·第二个：ID为IDC_MYRADIO2，Caption为单选2<br />　　·第三个：ID为IDC_MYRADIO3，Caption为单选3<br /><br />　　其中Caption为按钮上要显示的文字，可根据需要设置。<br /><br />　　2.用CButton类的Create()函数生成三个单选按钮：<br /><br />　　为方便起见，先定义一个函数生成单选按钮： <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>CButton* CTextEditorView::NewMyRadio(int nID,CRect rect,int nStyle)<br />{<br />　CString m_Caption;<br />　m_Caption.LoadString( nID ); //取按钮标题<br />　CButton *p_Radio = new CButton();<br />　ASSERT_VALID(p_Radio);<br />　p_Radio-&gt;Create( m_Caption, WS_CHILD | WS_VISIBLE | nStyle | WS_TABSTOP | BS_AUTORADIOBUTTON, rect, this, nID ); //创建按钮<br />　return p_Radio;<br />} </td></tr></tbody></table><br />　　函数LoadString()用于从“String Table”中读取按钮文本，Create()函数中设定了单选按钮必须的属性，其中就包括了Visible、Tab stop、Auto属性。<br /><br />　　参数nID为单选按钮ID号，rect为单选按钮尺寸，nStyle为除必要属性外的其它属性。返回值为指向新建按钮的指针。<br /><br />　　有了这个函数后，创建单选按钮组时只要依次调用该函数即可，其中单选按钮组的第一个单选按钮必须指定WS_GROUP属性。<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>CButton *p_MyRadio[3];<br />p_MyRadio[0] = NewMyRadio( IDC_MYRADIO1, CRect(15,90,60,105), WS_GROUP );<br />p_MyRadio[1] = NewMyRadio( IDC_MYRADIO2, CRect(15,108,60,123), 0 );<br />p_MyRadio[2] = NewMyRadio( IDC_MYRADIO3, CRect(15,126,60,141), 0 ); </td></tr></tbody></table><br />　　3.定义单选按钮组的控制变量，设置第一个单选按钮为选中状态：<br /><br />　　这里不能用ClassWizard添加变量，也不要在DoDataExchange()中添加控制变量，因为动态控件一开始并不存在，在DoDataExchange()中添加控制变量会造成运行错误。这里我们只需在头文件中随意定义一个int型变量作为控制变量即可，如：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>int m_SelRadio;</td></tr></tbody></table><br />　　在构造函数中设置其初值为0：m_SelRadio = 0;<br /><br />　　在上面的创建按钮的语句中，用SetCheck()函数设置初始选中的按钮：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>CButton *p_MyRadio[3];<br />p_MyRadio[0] = NewMyRadio( IDC_MYRADIO1, CRect(15,90,60,105), WS_GROUP );<br />p_MyRadio[1] = NewMyRadio( IDC_MYRADIO2, CRect(15,108,60,123), 0 );<br />p_MyRadio[2] = NewMyRadio( IDC_MYRADIO3, CRect(15,126,60,141), 0 );<br />p_MyRadio[m_SelRadio]-&gt;SetCheck(1); //设置第一个单选为选中状态 </td></tr></tbody></table><br />　　在SetCheck()函数中，参数为1表示设置为选中状态，为0表示未选中状态。<br /><br />　　4.添加鼠标单击响应函数：<br /><br />　　鼠标单击某单选按钮后，其状态已经能自动改变，这里我们还需修改控制变量m_SelRadio的值，以便跟踪选中的单选按钮。<br /><br />　　首先在MESSAGE_MAP中把鼠标单击消息与响应函数联系起来： <br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)<br />//{{AFX_MSG_MAP(CTextEditorView)<br />ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0) //ClassWizard在此处添加<br />//}}AFX_MSG_MAP<br />ON_BN_CLICKED(IDC_MYRADIO1, OnMyRadio1) //单选按钮1<br />ON_BN_CLICKED(IDC_MYRADIO2, OnMyRadio2) //单选按钮2<br />ON_BN_CLICKED(IDC_MYRADIO3, OnMyRadio3) //单选按钮3<br />END_MESSAGE_MAP() </td></tr></tbody></table><br />　　然后在头文件的MESSAGE_MAP中定义单击函数：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>protected:<br />//{{AFX_MSG(CTextEditorView)<br />afx_msg void OnIconbut0(); //ClassWizard在此处添加<br />//}}AFX_MSG<br />afx_msg void OnMyRadio1(); //单选按钮1<br />afx_msg void OnMyRadio2(); //单选按钮2<br />afx_msg void OnMyRadio3(); //单选按钮3<br />DECLARE_MESSAGE_MAP() </td></tr></tbody></table><br />　　这里注意不要把函数加在AFX_MSG区间内，以防影响ClassWizard的使用。<br /><br />　　定义具体的响应函数（这里是用手工加入的，不是用ClassWizard加入的）：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>//单击单选按钮1 void CTextEditorView::OnMyRadio1() <br />{<br />m_SelRadio=0;<br />} <br /><br />//单击单选按钮2 void CTextEditorView::OnMyRadio2() <br />{<br />m_SelRadio=1;<br />} <br /><br />//单击单选按钮3 void CTextEditorView::OnMyRadio3() <br />{<br />m_SelRadio=2;<br />}</td></tr></tbody></table><br />　　5.回收资源：<br /><br />　　在析构函数中，回收创建的单选按钮（也可以在不使用单选按钮时立即回收）：<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>CTextEditorView::~CTextEditorView()<br />{<br />int i;<br />for( i=0; i&lt;3; i++)<br />{<br />if(p_MyRadio[i])<br />delete p_MyRadio[i];<br />}<br />}</td></tr></tbody></table><br />　　以上就是动态控件的生成和响应方法，各种不同的控件做法略有不同，但思路和步骤都是类似的，希望以上实例对你能够有所帮助。<img src ="http://www.cppblog.com/mzty/aggbug/15150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-11-14 13:06 <a href="http://www.cppblog.com/mzty/archive/2006/11/14/15150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC 常见的108个问题 (转)</title><link>http://www.cppblog.com/mzty/archive/2006/11/14/15149.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 14 Nov 2006 05:03:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/11/14/15149.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/15149.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/11/14/15149.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/15149.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/15149.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: （1） 如何通过代码获得应用程序主窗口的 指针?主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。AfxGetMainWnd() -&gt;ShowWindow(SW_SHOWMAXMIZED)//使程序最大化.														（2） 确定应用程序的路径Use GetModuleFileName 获得应用程序的路径，然后去掉...&nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2006/11/14/15149.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/15149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-11-14 13:03 <a href="http://www.cppblog.com/mzty/archive/2006/11/14/15149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中动态改变控件和对话框字体(大小)</title><link>http://www.cppblog.com/mzty/archive/2006/11/13/15131.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 13 Nov 2006 08:47:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/11/13/15131.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/15131.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/11/13/15131.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/15131.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/15131.html</trackback:ping><description><![CDATA[1 VC的对话框字体设置对所有控件都有效，你不能单独地改变某个静态文本的字体。对于你的问题，需要首先用CreateFont来建立一个字体对象，然后调用控件的SetFont，就可以了。 <br />    例子： <br />    1、改静态文体的ID，如:IDC_STATIC1 <br />    2、添加一个Edit控件，建立一个关联的控件m_editControl。 <br />    3、在OnInitDialog中添加如下代码： <br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CFont </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> f; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     f </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> CFont; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     f</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateFont(</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> nHeight </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">     </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> nWidth </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">     </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> nEscapement </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">     </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> nOrientation </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">     FW_BOLD, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> nWeight </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">     TRUE, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> bItalic </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">     FALSE, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> bUnderline </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">     </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> cStrikeOut </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">     ANSI_CHARSET, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> nCharSet </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">     OUT_DEFAULT_PRECIS, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> nOutPrecision </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">     CLIP_DEFAULT_PRECIS, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> nClipPrecision </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">     DEFAULT_QUALITY, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> nQuality </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">     DEFAULT_PITCH </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> FF_SWISS, </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> nPitchAndFamily </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">     _T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Arial</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> lpszFac </span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">   <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     GetDlgItem(IDC_STATIC1)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetFont(f); </span></div>需要注意的是，这里我们使用的是CFont指针，而不是普通的CFont局部变量, 在非MFC程序，首先用CreateFont来建立一个字体句柄，然后再用SendMessage发给控件WM_SETFONT消息，将建立的字体句柄赋值过去，就可以了。<br /><br />实例下载:http://www.china-askpro.com/download/CtrlFont.zip<br /><br /> <br />2 但是整个对话框或窗口的字体的大小,使用对话框或窗口的SetFont()函数却没有任何的作用.可以在初始化时遍历每个控件分别设置来处理,但这里说另一种使用回调函数的简单方法:<br />   :调用系统的API:::EnumChildWindows(). ,<font style="BACKGROUND-COLOR: #ff1493">传入回调函数和重新定义的字体</font>.(第一个参数不用管啊,本来就有啊)<br />)<br />   1)在文档视图结构中CMainFrame::OnCreate().中调用::EnumChildWindows(). 实现所有窗口和子窗口字体改变<br />   2) 在对话框的OnInitDialog(). 中调用::EnumChildWindows(). 改变对话窗上的所有控件.<br /><br />回调函数如下:<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> lParam is a pointer to CFont object</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">BOOL __stdcall SetChildFont(HWND hwnd, LPARAM lparam)<br /><img id="Codehighlighter1_93_206_Open_Image" onclick="this.style.display='none'; Codehighlighter1_93_206_Open_Text.style.display='none'; Codehighlighter1_93_206_Closed_Image.style.display='inline'; Codehighlighter1_93_206_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_93_206_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_93_206_Closed_Text.style.display='none'; Codehighlighter1_93_206_Open_Image.style.display='inline'; Codehighlighter1_93_206_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_93_206_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_93_206_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  CFont </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pFont </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (CFont</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)lparam;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  CWnd </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pWnd </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> CWnd::FromHandle(hwnd);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  pWnd</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetFont(pFont);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> TRUE;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p> </p><p>使用1:</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">BOOL CAboutDlg::OnInitDialog() <br /><img id="Codehighlighter1_32_312_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_312_Open_Text.style.display='none'; Codehighlighter1_32_312_Closed_Image.style.display='inline'; Codehighlighter1_32_312_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_32_312_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_32_312_Closed_Text.style.display='none'; Codehighlighter1_32_312_Open_Image.style.display='inline'; Codehighlighter1_32_312_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_32_312_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_32_312_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    CDialog::OnInitDialog();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO: Add extra initialization here</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">  ::EnumChildWindows(m_hWnd, ::SetChildFont, (LPARAM)g_Font.GetFont());<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> TRUE;  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> return TRUE unless you set the focus to a control<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />                  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> EXCEPTION: OCX Property Pages should return FALSE</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><p>使用2:</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)<br /><img id="Codehighlighter1_56_800_Open_Image" onclick="this.style.display='none'; Codehighlighter1_56_800_Open_Text.style.display='none'; Codehighlighter1_56_800_Closed_Image.style.display='inline'; Codehighlighter1_56_800_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_56_800_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_56_800_Closed_Text.style.display='none'; Codehighlighter1_56_800_Open_Image.style.display='inline'; Codehighlighter1_56_800_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_56_800_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_56_800_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (CFrameWnd::OnCreate(lpCreateStruct) </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">m_wndToolBar.CreateEx(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">, TBSTYLE_FLAT, WS_CHILD </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> WS_VISIBLE </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> CBRS_TOP<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> CBRS_GRIPPER </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> CBRS_TOOLTIPS </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> CBRS_FLYBY </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> CBRS_SIZE_DYNAMIC) </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">m_wndToolBar.LoadToolBar(IDR_MAINFRAME))<br /><img id="Codehighlighter1_317_397_Open_Image" onclick="this.style.display='none'; Codehighlighter1_317_397_Open_Text.style.display='none'; Codehighlighter1_317_397_Closed_Image.style.display='inline'; Codehighlighter1_317_397_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_317_397_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_317_397_Closed_Text.style.display='none'; Codehighlighter1_317_397_Open_Image.style.display='inline'; Codehighlighter1_317_397_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_317_397_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_317_397_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        TRACE0(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Failed to create toolbar\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> fail to create</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">m_wndStatusBar.Create(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">m_wndStatusBar.SetIndicators(indicators,<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />          </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(indicators)</span><span style="COLOR: #000000">/</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(UINT)))<br /><img id="Codehighlighter1_520_603_Open_Image" onclick="this.style.display='none'; Codehighlighter1_520_603_Open_Text.style.display='none'; Codehighlighter1_520_603_Closed_Image.style.display='inline'; Codehighlighter1_520_603_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_520_603_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_520_603_Closed_Text.style.display='none'; Codehighlighter1_520_603_Open_Image.style.display='inline'; Codehighlighter1_520_603_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_520_603_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_520_603_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        TRACE0(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Failed to create status bar\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> fail to create</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    EnableDocking(CBRS_ALIGN_ANY);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    DockControlBar(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">m_wndToolBar);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  ::EnumChildWindows(m_hWnd, ::SetChildFont, (LPARAM)g_Font.GetFont());<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p>(<font style="BACKGROUND-COLOR: #ff1493">很好用,不像mfc中的那个垃圾setfont(),设置了对话框的没有一点反应!)</font><br /><br />实例下载:http://www.codeproject.com/gdi/SetFont/SetFont_demo.zip<br /><br /><br />3 如何在mfc中实现,当系统的字体变大的时候,对话框上面的字体也相应的变大?(非常感谢)<br /><br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">IconFont</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">    LOGFONT logFont;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">  size </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(LOGFONT);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> isGood </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> SystemParametersInfo(SPI_GETICONTITLELOGFONT,size,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">logFont,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(isGood </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_158_285_Open_Image" onclick="this.style.display='none'; Codehighlighter1_158_285_Open_Text.style.display='none'; Codehighlighter1_158_285_Closed_Image.style.display='inline'; Codehighlighter1_158_285_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_158_285_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_158_285_Closed_Text.style.display='none'; Codehighlighter1_158_285_Open_Image.style.display='inline'; Codehighlighter1_158_285_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span id="Codehighlighter1_158_285_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_158_285_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        CFont </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> f;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        f </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> CFont;<br />            <font face="Arial"> const LOGFONT* pFont = new LOGFONT(logFont);</font><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        f</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateFontIndirectW(pFont);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">::EnumChildWindows(m_hWnd, ::SetChildFont, (LPARAM)f);</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">other Font</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">    NONCLIENTMETRICS ncm </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> NONCLIENTMETRICS();                <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> isGood </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> SystemParametersInfo(SPI_GETNONCLIENTMETRICS, </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(NONCLIENTMETRICS), </span><span style="COLOR: #0000ff">ref</span><span style="COLOR: #000000"> ncm, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (isGood </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_476_867_Open_Image" onclick="this.style.display='none'; Codehighlighter1_476_867_Open_Text.style.display='none'; Codehighlighter1_476_867_Closed_Image.style.display='inline'; Codehighlighter1_476_867_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_476_867_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_476_867_Closed_Text.style.display='none'; Codehighlighter1_476_867_Open_Image.style.display='inline'; Codehighlighter1_476_867_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span id="Codehighlighter1_476_867_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_476_867_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        LOGFONT logFont2;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">logFont2=ncm.lfntCaptionFont);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">CaptionFont<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">logFont2 =ncm.lfntSMCaptionFont;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">CaptionFont_Small<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">logFont2 = ncm.lfntMenuFont;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">MenuFont<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">logFont2 = ncm.lfntStatusFont;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">StatusFont</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        logFont2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ncm.lfntMessageFont;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">MessageFont</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        CFont </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> f;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        f </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> CFont;<br />            <font face="Arial"> const LOGFONT* pFont = new LOGFONT(logFont2);</font><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        f</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">CreateFontIndirectW(pFont);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">::EnumChildWindows(m_hWnd, ::SetChildFont, (LPARAM)f);</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span></div><p>以上是取得系统字体的大小,然后再调用上面的第二种方法,哈哈哈哈哈!<br />窗体上的所有字体都会跟着系统字体的大小改变,哈哈哈哈!<br /><br /><br />主要使用API:<br /></p><h4 class="TextColor1" id="subjcns!4C24E6EF9B58C063!125" style="MARGIN-BOTTOM: 0px">SystemParametersinfo该函数查询或设置系统级参数。该函数也可以在设置参数中更新用户配置文件</h4><div id="msgcns!4C24E6EF9B58C063!125"><div><div>函数功能：该函数查询或设置系统级参数。该函数也可以在设置参数中更新用户配置文件。<br /><br />    函数原型：B00L SystemParametersinfo（UINT uiAction，UINT uiParam，PVOID pvParam，UINT fWinlni）；<br /><br />    参数：<br /><br />    uiAction：该参数指定要查询或设置的系统级参数。其取值如下；<br /><br />    SPI_GETACCESSTIMEOUT：检索与可访问特性相关联的超时段的信息，PvParam参数必须指向某个ACCESSTIMEOUT结构以获得信息，并将该结构中的cbSjze成员和ulParam参数的值设为sizeof（ACCESSTIMEOUT）。<br /><br />    SPI_GETACTIVEWINDOWTRACKING：用于Windows 98和Windows NT 5.0及以后的版本。它表示是否打开活动窗口跟踪（激活该窗口时鼠标置为开状态），pvParam参数必须指向一个BOOL型变量（打开时接收值为TRUE，关闭时为FALSE）。<br /><br />    SPI_GETACTIVEWNDTRKZORDER；用于Windows 98和Windows NT 5.0及以后版本。它表示通过活动窗口跟踪开关激活的窗口是否要置于最顶层。pvParam参数必须指向一个BOOL型变量，如果要置于顶层，那么该变量的值为TRUE，否则为FALSE。<br /><br />    SPI_GETACTIVEWNDTRKTIMEOUT：用于Windows 98和 Windows NT 5.0及以后版本。它指示活动窗口跟踪延迟量，单位为毫秒。pvParam参数必须指向DWORD类型变量，以接收时间量。<br /><br />    SPI_GETANIMATION：检索与用户活动有关的动画效果。pvParam参数必须指向ANIMATIOINFO结构以接收信息。并将该结构的cbSize成员和ulParam参数置为sizeof（ANIMATIONINFO）。<br /><br />    SPI_GETBEEP：表示警告蜂鸣器是否是打开的。pvParam参数必须指向一个BOOL类型变量，如果蜂鸣器处于打开状态，那么该变量的值为TRUE，否则为FALSE。<br /><br />    SpI_GETBORDER：检索决定窗口边界放大宽度的边界放大因子。pvParam参数必须指向一个整型变量以接收该值。<br /><br />    SPI_GETDEFAULTINPUTLANG：返回用于系统缺省输入语言的键盘布局句柄。pvParam参数必须指向一个32位变量，以接收该值。<br /><br />    SPI_GETCOMBOBOXANIMATION：用于Windows 98和Windows NT 5.0及以后版本。它表示用于组合柜的动打开效果是否允许。pvParam参数必须指向一个BOOL变量，如果允许，那么变量返回值为TRUE，否则为FALSE。<br /><br />    SPI_GETDRAGFULLWINDOWS：确定是否允许拖拉到最大窗口。pvParam参数必须指向BOOL变量，如果允许，返回值为TRUE，否则为FALSE。对于Windows 95系统，该标志只有在安装了Windows plusl才支持。<br /><br />    SPI_GETFASTTASKSWITCH：该标志已不用！以前版本的系统使用该标志来确定是否允许Alt＋Tab快速任务切换。对于Windows 95、Windows 98和Windows NT 4.0版而言，快速任务切换通常是允许的。<br /><br />    SPI_GETFILTERKEYS：检索有关FILTERKEYS（过滤键）易用特征信息。pvParam参数必须指向接收信息的filterkeys结构，并将该结构中的cbSze成员和ulParam参数的值设为sizeof（FILTERKEYS）。<br /><br />    SPI_GETFONTSMOOTHING：表示字体平滑处理特征是否允许。该特征使用字体保真技术，通过在不同灰度级上涂上像素使字体曲线显得更加平滑。参数pvParam必须指向BOOL类型变量，如果该特征被允许，那么返回值为TRUE，否则为FALSE。对于Windows 95系统，该标志只有在安装了Windows plusl才支持。<br /><br />    SPI_GETFOREGROUNDFLASHCOUNT：用于Windows 98和Windows NT 5.0及以后版本。它表示在拒绝前台切换申请时系统闪烁任务条按钮的次数。参数pvParam必须指向DWORD变量，以接收该值。<br /><br />    SPI_GETFOREGROUNDLOCKTIMEOUT：用于Windows NT 5.O及以后版本或Windows 98。它表示在系统禁止应用程序强行将自己进入前台期间的时间量，单位为毫秒．参数pvParam必须指向DWORD变量以接收时间值。<br /><br />    SPI_GETGRADIENTCAPTIONS：用于Windows 98和Windows NT 5.0及以后版本。它表示是否允许有用于窗口标题栏的倾斜效果。参数pvParam必须指向BOOL变量，其值在允许时为TRUE，禁止时为FALSE。<br /><br />    SPL_GETGRIDGRANULARITY：检索桌面大小网格的当前颗粒度值。参数pVparam必须指向一个整型变量以接收该值。<br /><br />    SPI_GETHIGHCONTRAST：用于Windows 95及更高版本、Windows NT 5.0及以后版本。检索与HighContrast易用特征有关的信息。pvParam参数必须指向用于接收该信息的HIGHCONTRAST结构，该结构中的。cbSize成员和ulParam参数的值应设为sizeof（NIGHCONTRAST）。</div><div><div>2004-09-10 11:47:30</div>回复人: lixiaosan</div><div>SPI_GETICONMETRICS：检索与图标有关的度量信息。参数pvParam必须指向一个ICONMETRICS结构以接收信息。该结构中的。cbSize成员和ulParam参数的值应设为sizeof（ICONMETRICS）。<br /><br />    SPI_GETICONTITLELOGFONT：检索当前图标标题字体的逻辑字体信息。参数ulParam规定了logfont结构的大小，参数pvParam必须指向要填充的Iogfont结构。<br /><br />    SPI_GETICONTITLEWRAP：确定是否允许图标标题环绕。pvParam参数必须指向一个BOOL类型变量，该变量的值在允许时为TRUE，否则为FALSE。<br /><br />    SPI_GETKEYBOARDDELAY：检索键盘重复击键延迟设置，该值范围从0（大约25Oms延迟）到3（大约1秒延迟）。与该范围里每一个值相关的实际延迟时间可能与硬件有关。pvParam参数必须指向一个整型变量以接收设置值。<br /><br />    SPI_GETKEYBOARDPREF：用于Windows 95及以后版本。Windows NT 5.O及以后版本。它确定用户是否依赖键盘而非鼠标，是否要求应用程序显示键盘接口，以免隐藏。pvParam参数必须指向一个BOOL类型变量，如果用户依赖键盘，那么该变量取值为TRUE，否则为FALSE。<br /><br />    SPI_GETKEYBOARDSPEED：检索键盘重复击键速度设置情况，该值范围从0（大约30次/秒）至31（大约25次/秒）。实际的击键速率与硬件有关，而且变动的线性幅度有可能高达20％。参数pvParam必须指向DWORD变量以接收设置值。<br /><br />    SPI_GETLISTBOXSMOOTHSCROLLING：用于Windows 98和Windows NT 5.0及以后版本。表示是否允许有列表栏的平滑滚动效果。pvParam参数必须指向BOOL变量，如果允许，则该值为TRUE，否则为FALSE。<br /><br />    SPI_GETLDWPOWERACTIVE：确定是否允许屏幕保护的低电压状态。如果允许，那么指向BOOL变量的pvParam参数会接收到TRUE值，否则为FALSE。对于Windows 98,该标志对16位和32位应用程序都支持。<br /><br />    对于Windows 95，该标志只支持16位应用程序。对于Windows NT，在Windows NT 5.0及以后版本中支持32位应用程序，对16位应用程序则不支持。<br /><br />    SPI_GETLOWPOWERTIMEOUT：检索用于屏幕保护的低电压状态超时值。pvParam参数必须指向一个整型变量，以接收该值。对于Windows 98该标志支持16位和32位应用程序。对于Windows95，该标志只支持16位应用程序。对于Windows NT,该标志支持Windows NT 5.0及以后版本上的32位应用程序。不支持16位应用程序。<br /><br />    SPI_GETMENUDROPALIGNMENT。确定弹出式菜单相对于相应的菜单条项是左对齐，还是右对齐、参数pvParam必须指向一个BOOL类型变量，如果是左对齐。那么该变量值为TRUE，否则为FALSE。SPI_GETMINIMIZEDMETRICS：检索最小化窗口有关的度量数据信息。参数pvParam必须指向MINIMIZEDMETRCS结构，以接收信息。该结构中的cbSize和ulParam参数的值应设为sizeof（MINIMIZEDMETRICS）。<br /><br />    SPI_GETMOUSE：检索鼠标的2个阈值和加速特性。pvParam参数必须指向一个长度为3的整型数组，分别存储此值。<br /><br />    SPI_GETMOUSEHOVERHEGHT：用于Windows NT 4.0及以后版本或Windows 98。获得在TrackMouseEvent事件中，为产生WM_MOUSEOVER消息而鼠标指针必须停留的矩形框的高度,以像素为单位。参数pvParam必须指向一个UINT变量以接收这个高度值。<br /><br />    SPI_GETMOUSEHOVERTIME：用于Windows NT 4.0及以后版本、Windows 98，获得在TrackMouseEvent事件中，为产生WM_MOUSEOVER消息而鼠标指针必须停留在矩形框内的时间，单位为毫秒。参数pvParam必须指向一个UINT变量以接收该时间值。<br /><br />    SPI_GETMOUSEHOVERWIDTH：用于Windows NT 4.0及以后版本、Windows 98。获得在TrackMouseEvent事件中，为产生WM_MOUSEOVER消息而鼠标指针必须停留的矩形框的宽度,以像素为单位。参数pvParam必须指向一个UINT变量以接收这个宽度值。<br /><br />    SPI_GETMOUSEKEYS：检索与MOUSEKEYS易用特征有关的信息，pvParam参数必须指向某个MOUSEKEYS结构，以获取信息。应将结构的cbSize成员和ulParam参数设置为sizeof（MOUSEKEYS）。<br /><br />    SPI_GETMOUSESPEED：用于Windows NT 5.0及以后版本、Windows 98。检索当前鼠标速度。鼠标速度决定了鼠标移动多少距离，鼠标的指针将移动多远。参数pvParam指向一个整型变量，该变量接收1（最慢）至20（最快）之间的数值。缺省值为们10。这个值可以由最终用户使用鼠标控制面板应用程序或使用调用了SPI_SETMOUSESPEED的应用程序来设置。<br /><br />    SPI_GETMOUSETRAILS：用于WpvParam必须指向一个BOOL类型变量，如果是左对齐。那么该变量值为TRUE，否则为FALSE。<br /><br />    SPI_GETMINIMIZEDMETRICS：检索最小化窗口有关的度量数据信息。参数pvParam必须指向MINIMIZEDMETRCS结构，以接收信息。该结构中的cbSize和ulParam参数的值应设为sizeof（MINIMIZEDMETRICS）。<br /><br />    SPI_GETMOUSE：检索鼠标的2个阈值和加速特性。pvParam参数必须指向一个长度为3的整型数组，分别存储此值。<br /><br />    SPI_GETMOUSEHOVERHEGHT：用于Windows NT 4.0及以后版本或Windows 98。获得在TrackMouseEvent事件中，为产生WM_MOUSEOVER消息而鼠标指针必须停留的矩形框的高度,以像素为单位。参数pvParam必须指向一个UINT变量以接收这个高度值。<br /><br />    SPI_GETMOUSEHOVERTIME：用于Windows NT 4.0及以后版本、Windows 98，获得在TrackMouseEvent事件中，为产生WM_MOUSEOVER消息而鼠标指针必须停留在矩形框内的时间，单位为毫秒。参数pvParam必须指向一个UINT变量以接收该时间值。<br /><br />    SPI_GETMOUSEHOVERWIDTH：用于Windows NT 4.0及以后版本、Windows 98。获得在TrackMouseEvent事件中，为产生WM_MOUSEOVER消息而鼠标指针必须停留的矩形框的宽度,以像素为单位。参数pvParam必须指向一个UINT变量以接收这个宽度值。<br /><br />    SPI_GETMOUSEKEYS：检索与MOUSEKEYS易用特征有关的信息，pvParam参数必须指向某个MOUSEKEYS结构，以获取信息。应将结构的cbSize成员和ulParam参数设置为sizeof（MOUSEKEYS）。SPI_GETMOUSESPEED：用于Windows NT 5.0及以后版本、Windows 98。检索当前鼠标速度。鼠标速度决定了鼠标移动多少距离，鼠标的指针将移动多远。参数pvParam指向一个整型变量，该变量接收1（最慢）至20（最快）之间的数值。缺省值为们10。这个值可以由最终用户使用鼠标控制面板应用程序或使用调用了SPI_SETMOUSESPEED的应用程序来设置。<br /><br />    SPI_GETMOUSETRAILS：用于Windows 95及更高版本。它用来表示是否允许MouseTrails（鼠标轨迹）。该特征通过简单地显示鼠标轨迹并迅速擦除它们来改善鼠标的可见性。参数prParam必须指向一个整型变量来接收该值。如果这个值为0或1，那么表示禁止该特征。如果该值大于1，则说明该特征被允许，并且该值表示在鼠标轨迹上画出的光标数目。参数ulParam不用。</div><div><div>2004-09-10 11:47:54</div>回复人: lixiaosan</div><div>SPI_GETNONCLIENTMETRICS：检索与非最小化窗口的非客户区有关的度量信息。参数pvParam必须指向NONCLIENTMETRICS结构，以便接收相应值。该结构的。cbSize成员与ulParam参数值应设为sizeof（NONCLIENTMETRICS）。对于Windows 98，该标志支持16位和32位应用程序。对于Windows 95，该标志只支持16位应用程序。对于Windows NT该标志在NT 5.0及以后版本中支持32位应用程序，不支持16位应用程序。<br /><br />    SPI_GETPOWEROFFACTIVE：确定是否允许屏幕保护中关电。TRUE表示允许，FA参数pvParam必须指定SERIALKEYS结构来接收信息。该结构中的cbSize成员和ulParam参数的值要设为sizeof（SERIALKEYS）。<br /><br />    SPI_GETSHOWSOUNDS：确定ShowSounds易用特性标志是开或是关。如果是开，那么用户需要一个应用程序来可视化地表达信息，占则只能以听得见的方式来表达。参数pvParam必须指向一个BOOL类型变量。该变量在该特征处于开状态时返回TRUE，否则为FALSE。使用这个值等同于调用GetSystemMetrics（SM_SHOWSOUNDS）。后者是推荐使用的调用方式。<br /><br />    SPI_GETSNAPTODEFBUTTON：用于Windows NT 4.0及以后版本、Windows 98：确定 Snap-TO-Default-Button（转至缺省按钮）特征是否允许。如果允许，那么鼠标自动移至缺省按钮上，例如对话框的"Ok"或"Apply"按钮。pvParam参数必须指向Bool类型变量，如果该特征被允许，则该变量接收到TRUE，否则为FALSE。<br /><br />    SPI_GETSOUNDSENTRY：检索与SOUNDSENTRY可访问特征有关的信息。参数pvParam必须指向SOUNDSENTRY结构以接收信息。该结构中的。cbSize或员和ulParam参数的值要设为sizeof（SOUNDSENTRY）。<br /><br />    SPI_GETSTICKYKEYS：检索与StickyKeys易用特征有关的信息。参数 pvParam必须指向STICKYKEYS结构以获取信息。该结构中的cbSze成员及ulParam参数的值须设为sizeof（STICKYKEYS）。<br /><br />    SPI_GETSWITCHTASKDISABLE：用于Windows NT 5.0、Windows 95及以后版本，确定是否允许Alt＋Tab和AIt＋Esc任务切换。参数pvParam必须指向UINT类型变量，如果禁止任务切换，那么返回值为1，否则为0。在缺省情况下，是允许进行任务切换的。<br /><br />    SPI_GETTOGGLEKEYS：检索与ToggleKeys易用特性有关的信息。参数pvParam必须指向TOGGLEKEYS结构以获取信息。该结构中的cbSize成员和ulParam参数值要设置sizeof（TOGGLEKEYS）。<br /><br />    SPI_GETWHEELSCROLLLINES：用于Windows NT 4.0及以后版本、Windows 98。当前轨迹球转动时，获取滚动的行数。参数pvParam必须指向UINT类型变量以接收行数。缺省值是3。<br /><br />    SPI_GETWINDOWSEXTENSION：在Windows 95中指示系统中是否装了Windows Extension和Windows Plus！。<br /><br />    参数ulParam应设为1。而参数pvParam则不用。如果安装了Windows Extenson，那么该函数返回TRUE，否则为FALSE。<br /><br />    SPI_GETWORKAREA：检索主显示器的工作区大小。工作区是指屏幕上不被系统任务条或应用程序桌面工具遮盖的部分。参数pvParam必须指向RECT结构以接收工作区的坐标信息，坐标是用虚拟屏幕坐标来表示的。为了获取非主显示器的工作区信息，请调用GetMonitorlnfo函数。参数ulParam指定宽度，单位是像素。<br /><br />    SPI_ICONVERTICALSPACING：设置图标单元的高度。参数ulParam指定高度，单位是像素。<br /><br />    SPI_LANGDRIVER：未实现。<br /><br />    SPI_SCREENSAVERRUNNING：改名为SPI_SETSCREENSAVERRUNNING。<br /><br />    Spl_SETACCESSTIMEOUT：设置与可访问特性有关的时间限度值，参数 pvParam必须指向包含新参数的ACCESSTIMEOUT结构，该结构的cbSize成员与ulParam参数的值要设为sizeof（ACCESSTMEOUT）。<br /><br />    SPI_SETACTIVEWINDOWTRACKING：用于Windows NT 5.0及以后版本、Windows 98。设置活动窗口追踪的开或关，如果把参数pvParam设为TRUE，则表示开。pvParam参数为FALSE时表示关。<br /><br />    SPI_SETACTIVEWNDTRKZORDER：用于Windows NT 5.0及以后版本、Windows 98。表示是否把通过活动窗口跟踪而激活的窗口推至顶层。参数pvParam设为TRUE表示推至顶层，FALSE则表示不推至顶层。<br /><br />    SPI_SETACTIVEWNDTRKTIMEOUT：用于Wlindows NT 5.0及以后版本、Windows 98。设置活动窗口跟踪延迟。<br /><br />    参数pvParam设置在用鼠标指针激活窗口前需延迟的时间量，单位为毫秒。<br /><br />    SPI_SETBEEP：将警蜂器打开或关闭。参数ulParam指定为TRUE时表示打开，为FALSE时表示关闭。<br /><br />    SPI_SETBORDER：设置确定窗口缩放边界的边界放大因子。参数ulParam用来指定该值。<br /><br />    SPI_SETCOMBOBOXANIMATION：用于Windows NT 5.0及以后版本和Windows 98。允许或禁止组合滑动打开效果。如果设置pvParam参数为TRUE，则表示允许有倾斜效果，如果设为FALSE则表示禁止。<br /><br />    SPI_SETCURSORS：重置系统光标。将ulParam参数设为0并且pvParam参数设为NULL。<br /><br />    SPI_SETDEFAULTINPUTLANG：为系统Shell（命令行解器）和应用程序设置缺省的输入语言。指定的语言必须是可使用当前系统字符集来显示的。pvParam参数必须指向DWORD变量，该变量包含用于缺省语言的键盘布局句柄。<br /><br />    SpI_SETDESKpATTERN：通过使Windows系统从WIN.INI文件中pattern=设置项来设置当前桌面模式。<br /><br />    SPI_SETDESKWALLPAPER：设置桌面壁。pvParam参数必须指向一个包含位图文件名，并且以NULL（空）结束的字符串。<br /><br />    SPI_SETDOUBLECLICKTIME：设ulParam参数的值为目标双击时间。双击时间是指双击中的第1次和第2次点击之间的最大时间，单位为毫秒。也可以使用SetDoubleClickTime函数来设置双击时间。为获取当前双击时间，请调用GetDoubleClickTime函数。<br /><br />    SPI_SETDOUBLECLKHEGHT：将ulParam参数的值设为双击矩形区域的高度。双击矩形区域是指双击中的第2次点击时鼠标指针必须落在的区域，这样才能记录为双击。<br /><br />    SPI_SETDOUBLECLKWIDTH：将ulParam参数的值设为双击矩形区域的宽度。<br /><br />    SPI_SETDRAGFULLWINDOWS：设置是否允许拖至最大窗口。参数uIParam指定为TRUE时表示为允许，为FALSE则不可。对于Windows 95，该标志只有在安装了Windows plusl才支持。<br /><br />    SPI_SETDRAGHEIGHT：设置用于检测拖拉操作起点的矩形区域的高度，单位为像素。参考GETSYSTEMMETRICS函数的nlndex参数中的SM_CXDRAG和SM_CYDRAG。<br /><br />    SPI_SETDRAGWIDTH：设置用于检测拖拉操作起点的矩形区域的宽度，单位为像素。<br /><br />    SPI_SETFASTTASKSWITCH：该标志己不再使用。以前版本的系统使用此标志来允许或不许进行Alt＋Tab快速任务切换。对于Windows 95、Windows 98和Windows NT 4.0，通常都允许进行快速任务切换。参考SPI_SETSWITCHTASKDISABLE。<br /><br />    SPI_SETFILTERKEYS：设置FilterKeys易用特性的参数。参数pvParam必须指向包含新参数的FILTERKEYS结构，该结构中的cbSize成员和参数ulParam的值应设为sizeof（FILTERKEYS）。<br /><br />    SPI_SETFONTSMOOTHING：允许或禁止有字体平滑特性。该特性使用字体保真技术，通过在不同灰度级上涂画像素点来使得字体曲线显得更加平滑，为了允许有该特性，参数ulParam应设为TRUE值，否则为FALSE。对于Windows 95，只有在安装了Windows plusl才支持该标志。<br /><br />    SPI_SETFOREGROUNDFLASHCOUNT：用于Windows 98和Windows NT 5.0及以后版本。设置SetForegroundWindow在拒绝前台切换申请时闪烁任务拦按钮的次数。</div><div><div>2004-09-10 11:48:50</div>回复人: lixiaosan</div><div>SPI_SETFOREGROUNDLOCKTIMEOUT：用于Windows 98和Windows NT 5.0及以后版本。它用来设置在用户输入之后，系统禁止应用程序强行将自己进入前台期间的时间长度，单位为毫秒。参数pvParam设置这个新的时间限度值。<br /><br />    SPI_SETGRADIENTCAPTIONS：用于Windows 98和Windows NT 5.0及以后版本。允许或禁止窗口标题栏有倾斜效果。如果允许则将参数pvParam设置为TRUE，否则设为FALSE。有关倾斜效果方面更多信息，请参考GetSysColor函数。<br /><br /><br />    SPI_SETGRIDGRANULARITY：将桌面缩放时网格的颗粒度值设置为参数ulParam中的值。<br /><br />    SPI_SETHANDHELD：内部使用，应用程序不应使用该值。<br /><br />    SPI_SETHIGHCONTRAST：用于Windows 95及以后版本、Windows NT 5.0及以后版本。设置HighContrast可访问特性的参数。参数pvParam必须指向HIGHCONTRAST结构，该结构包含新的参数。该结构中的cbSize成员及参数ulParam的值设为sizeof（HIGHCONTRAST）。<br /><br />    SPI_SETICONMETRICS：设置与图标有关的信息。参数pvParam必须指向包含新参数的ICONMETRICS结构，另外还要将参数ulParam和该结构中的cbSize成员的值设置为sizeof（ICONMETRICS）。<br /><br />    SPI_SETICONS：重新加载系统图标。参数ulParam的值应设为0，而pvParam参数应设为NULL。<br /><br />    SPI_SETICONTITLELOGFONT：设置用于图标标题的字体。参数ulParam指定为logfont结构的大小，而参数pvParam必须指向一个LOGFONT结构。<br /><br />    SPI_SETICONTITLEWRAP：打开或关闭图标标题折行功能。若想打开折行功能，则把参数ulParam设为TRUE，否则为FALSE。<br /><br />    SPI_SETKEYBOARDDELAY：设置键盘重复延迟。参数ulParam必须指定为0，1，2或3。其中0表示设置为最短延迟（大约 250ms）3，表示最大延迟（大约 1 秒）。与每个值对应的实际的延迟时间根据硬件情况有可能有些变化。<br /><br />    SPI_SETKEYBOARDPREF：用于Windows 95及以后版本、Windows NT 5.0及以后版本，设置键盘优先序。如果用户依赖键盘而不是鼠标，那么可将参数ulParam指定为TRUE，否则设为FALSE，并且要求应用程序显示而不隐蔽键盘接口。<br /><br />    SPI_SETKEYBOARDSPEED：设置键盘重击键速度。参数ulParam必须指定一个从0到31的值，其中0表示设置成最快速度（大约30次/秒），31表示设置为最低速度（大约2。5次/秒），实际的重速率与硬件有关，而且可能变动幅度高达20％。如果ulParam大于31，那么该参数仍设置为31。<br /><br />    SPI_SETLANGTOGGLE：为输入语言间切换设置热键集。参数ulParam和pvParam不用。该值通过读取注册表来设置键盘属性表单中的快捷键。在使用该标志之前必须设置注册表，注册表中的路径是"1"=Alt＋shift，"2"=Ctrl+shift，"3"=none（无）。<br /><br />    SPI_SETLISTBOXSMOOTHSCROLLING：用于Windows 98和Windows NT 5.0及以后版本。允许或不许列表栏有平滑滚动效果。参数pvParam设置为TRUE表示允许有平滑滚动效果，为FALSE则表示禁止。<br /><br />    SPI_SETLOWPOWERACTIVE：激活或关闭低电压屏幕保护特性。参数ulParam设为1表示激活，0表示关闭。参数pvParam必须设为NULL。对于Windows 98,该标志支持16位和32位应用程序。对于Windows 95，该标志只支持16位应用程序。对于Windows NT．该标志只支持NT 5.0及以后版本的32位应用程序，不支持16位应用程序。<br /><br />    SPI_SETLOWPOWERTIMEOUT：用于设置低电压屏幕保护中的时间值（也称超时值，即在超过某一时间段后自动进行屏幕保护），单位为秒。uIParam参数用来指定这个新值。参数pvParam必须为NULL。对于Windows98，该标志支持16位和32位应用程序。对于Windows 95，该标志只支持16位应用程序。对于Windows NT该标志只支持NT 5.0及以后版本的32位应用程序，不支持16位应用程序。<br /><br />    SPI_SETMENUDROPALIGNMENT：设置弹出或菜单的对齐方式。参数ulParam指定为TRUE时表示是右对齐，FALSE时为左对齐。<br /><br />    SPI_SETMINIMIZEDMETRICS：设置与最小化窗口有关的数据信息，参数pvParam必须指向包含新参数的MINIMIZEDMETRICS结构。该结构中的cbSize成员与ulParam参数的值应设为sizeof（MINMIZEDMETRICS）。<br /><br />    SPI_SETMOUSE：设置鼠标的两个阀值和加速率。参数pvParam必须指向一个长度为3的数组，以指定这些值。详细请参考mouse_event。<br /><br />    SPI_SETMOUSEBUTTONSWAP：调换或恢复鼠标左右按钮的含义，为FALSE时表示恢复原来的含义。<br /><br />    SPI_SETMOUSEHOVERHEGHT：用于Windows 98和Windows NT 4.0及以后版本。设置鼠标指针停留区域的高度，以像素为单位。鼠标指针在此区域停留是为了让TrackMouseEvent产生一条WM_MUOSEHOVER消息，参数ulParam用来设置此高度值。</div><div><div>2004-09-10 11:49:17</div>回复人: lixiaosan</div><div>SPI_SETMOUSEHOVERTIME：用于Windows 98和Windows NT 4.0及以后版本。设置鼠标指针为了让TrackMouseEvent产生WM_MOUSEHOVER事件而在停留区域应停留的时间。该标志只有在将调用dwHoverTime参数中的HOVER_DEFAULT值传送到TrackMouseEvent时才使用。参数ulParam设置这个新的时间值。<br /><br />    SPI_SETMOUSEHOVERWIDTH：用于Windows 98和Windows NT 4.0及以后版本。设置鼠标指针停留区域的宽度，以像素为单位。参数ulParam设置该新值。<br /><br />    SPI_SETMOUSEKEYS：设置MouseKeys易用特性的参数。参数pvParam必须指向包含新参数的MOUSEKEYS结构。结构中的cbSize成员与参数ulParam的值应设为sizeof（MOUSEKEYS）。<br /><br />    SPI_SETMOUSESPEED：用于Windows NT 5.0及以后的版本和Windows 98，设置当前鼠标速度。参数pvParam必须指向一个1（最慢）至20（最快）之间的整数。缺省值是10。一般可以使用鼠标控制面板应用程序来设置该值。<br /><br />    SPI_SETMOUSETRAILS：用于Windows 95及以后版本：允许或禁止有MoouseTrails（鼠标轨迹）特性。该特性通过简短地显示鼠标光标轨迹，并迅速地擦除它们来提高鼠标的可见度。禁止该特性可将参数ulParam设为0或1，允许时,将ulParam设置为一个大于1的数值，该值表示轨迹中画出的光标个数。<br /><br />    SPI_SETNONCLIENTMETRICS：设置与非最小化窗口的非客区有关的数据信息，参数pvParam必须指向NONCLIENTMETRICS结构，该结构包含新的参数。其成员cbSzie和参数ulParam的值应设为sizeof（NONCLIENTMETRICS）。<br /><br />    SPI_SETPENWINDOWS；用于Windows 95及以后版本：指定是否加载笔窗口，当加载时，参数ulParam设为TRUE，不加载时为FALSE。参数pvParam为NULL。<br /><br />    SPI_SETPOWEROFFACTIVE：激活或关闭屏幕保护特性参数。ulParam设为1表示激活，0表示关闭。参数pvParam必须为NULL。对于Windows 98，该标志支持16位和32位应用程序。对于Windows 95，该标志只支持16位应用程序。对于Windows NT，该标志支持Windows NT 5.0及以后版本的32位应用程序，不支持16位应用程序。<br /><br />    SPI_SETPOWEROFFTIMEOUT：设置用于关闭屏幕保护所需的时间值（也称超时值）。参数ulParam指定该值。参数pvParam必须为NULL。对于Windows 98．该标志支持16位和32位应用程序。对于Windows 95，该标志只支持16位应用程序。对于Windows NT,该标志支持Windows NT 5.0及以后版本上的32位应用程序，不支持16位应用程序。<br /><br />    SPI_SETSCREENREADER；用于Windows 95及以后版本、Windows NT 5.0及以后版本，表示屏幕审阅程序是否运行。参数uiparm指定为TRUE表示运行该程序，FALSE则不运行。<br /><br />    SPI_SETSCREENSAVERRUNNING：用于Windows 95及以后版本，内部使用。应用程序不应该使用此标志SPI_SETSETSCREENSAVETIMEOUT：参数ulParam值为屏幕保护器时间限度值。该值是一个时间量，以秒为单位，在屏幕保护器激活之前，系统应该一直是空闲的，超过这个值就激活屏幕保护器。<br /><br />    SPI_SETSERIALKEYS：用于Windows 95及以后版本：设置SerialKeys易用特性的参数。参数pvParam必须指向包含新参数的SERIALKEYS结构，其成员cbSize和参数ulParam应设为sizeof（SERIALKEYS）。<br /><br />    SPI_SETSHOWSOUNDS：将ShowSounds易用特性设置为打开或关闭。参数ulParam指定为TRUE时表示打开，FALSE表示关闭。<br /><br />    SPI_SETSNAPTODEFBUTTON：用于Windows NT 4.0及以后版本、Windows 98。允许或禁止有snap-to-default-button（跳转至缺省按钮）特性。如果允许，那么鼠标光标会自动移至缺省按钮上，例如对话柜中的OK或"apply"按钮。参数ulParam设为TRUE表示允许该特性，FALSE表示禁止。<br /><br />    SPI_SETSOUNDSENTRY：设置SOUNDSENTRY易用特性的参数。参数pvParam必须指向SOUNDSENTRY结构，该结构包含新参数，其成员cbSize和参数ulParam的值应设为sizeof（SOUNDSENTRY）。<br /><br />    SPI_SETSTICKYKEYS：设置stickykeys可访问特性的参数。参数pvParam必须指向包含新参数的stickykeys结构，其成员cbSize和ulParam参数的值要设为sizeof（STICKYKEYS）。<br /><br />    SPI_SETSWITCHTASKDISABLE：用于Windows NT 5.0及以后版本，允许或禁止有Alt＋Tab和Alt＋Esc任务切换特性。参数ulParam设为1表示允许有该特性，设为0则表示禁止。缺省情况下是允许有任务切换特性的。<br /><br />    SPI_SETTOGGLEKEYS：设置togglekeys可访问特性的参数，参数PvParam必须指向TOGGLEKEYS结构，该结构中包含新的参数。其成员cbSize和参数ulParam的值要设为sizeof（togglekeys）。<br /><br />    SPI_SETWHEELSCROOLLLINES：用于Windows 98和Windows NT 4.O及以后版本。设置当鼠标轨迹球转动时<br /><br />    要滚动的行数，滚动的行数是由参数ulParam设置的，该行数是在鼠标轨迹球滚动，井且没有使用修改键时的滚动行数。如果该数值为0，那么不会发生滚动，如果滚动行数比可见到的行数要大，尤其如果是WHEEL_PAGESCROLL（＃defined sa UINT_MAX），那么滚动操作应该被解释成在滚动条的下一页或上一页区点击一次。<br /><br />    SPI_SETWORKAREA：设置工作区域大小。工作区是指屏幕上没有被系统任务栏或桌面应用程序桌面工具遮盖的部分。参数pvParam是一个指针。指向RECT结构，该结构规定新的矩形工作区域，它是以虚拟屏幕坐标来表达的。在多显示器系统中，该函数用来设置包含特定矩形的显示器工作区域。如果PvParam为NULL，那么该函数将主显示器的工作区域设为全屏。</div><div><div>2004-09-10 11:49:38</div>回复人: lixiaosan</div><div>ulParam：与查询或设置的系统参数有关。关于系统级参数的详情，请参考uiAction参数。否则在没有指明情况下，必须将该参数指定为O。<br /><br />    pvParam：与查询或设置的系统参数有关。关于系统级参数的详情，请参考uiAction参数。否则在没有指明情况下，必须将该参数指定为NULL。<br /><br />    fWinlni：如果设置系统参数，则它用来指定是否更新用户配置文件（Profile）。亦或是否要将WM_SETTINGCHANGE消息广播给所有顶层窗口，以通知它们新的变化内容。该参数可以是0或下列取值之一：<br /><br />    SPIF_UPDATEINIFILE：把新的系统参数的设置内容写入用户配置文件。<br /><br />    SPIF_SENDCHANGED：在更新用户配置文件之后广播WM_SETTINGCHANGE消息。<br /><br />    SPI_SENDWININICHANGE与 SPIF_SENDCHANGE一样。<br /><br />    返回值：如果函数调用成功，返回值非零：如果函数调用失败，那么返回值为零。若想获取更多错误信息，请调用GetLastError函数。<br /><br />    备注：该函数一般与应用程序，例如控制面板一起使用。它可以允许用户对Windows任意进行定制。<br /><br />    盘布局名称是从对应于布局的16进制语言标识符引生而来的。例如，美国英语（U.S.Englisth）的语言标识符为" 0×0409"，则主美国英语键盘布局命名为"00000409"其他的键盘布局如Dvotak等，命名为"00010409"、"00020409"等，关于此的列表参见MAKELANGID宏。<br /><br />    Wiows CE操作系统只支持下列uiAction值：<br /><br />    SPI_GETBATTERYIDLETIMEOUT：在WINDOWS CE没有因用户操作而挂起之前，干电池电源能坚持给系统供电的时间量可以使用该标志得到。以秒为单位，如果pvParam为0，那么该标志被忽略。<br /><br />    SPI_GETEXTERNALIDLETIMEOUT：在 Windows CE没有因用户操作而挂起之前，交流电源能坚持给系统供电时间的时间量可以使用该标志得到。参数pvParam指向一个DWORD类型变量，以返回时间值，单位为秒。如果pvParam为0，那么该标志被忽略。<br /><br />    SPI_GETMOUSE：检索鼠标的两个阈值和速度。<br /><br />    SPI_GETOEMINFO：返回一个字符串，该字符串包含型号和制造商名称。参数ulParam指定为pvParam参数中缓冲区的长度，在成功返回时，参数pvParam中包含Unicode字符集中的字符串。<br /><br />    SPI_GETPLATFORMTYPE：返回一个指定Windows CE设备类型的字符串，例如"H/PC"。参数ulParam规定pvParam参数缓冲区的长度，后者在成功返回时包含一个Unicode字符集中的字符串。该字符串允许象 H/PC EXPLORER一样的应用程序来确定设备类型。<br /><br />    SPI_GETWAKEUPDLETIMEOUT：在用户通知重新激活某个挂起的设备之后，可获取的Windows CE延缓响应的时间量。参数pvParam指向一个DWORD类型变量以返回时间值，单位为秒。如果pvParam值为0那么该标志被忽略。<br /><br />    SPI_GETWORKAREA：检索工作区大小。工作区是指没有被任务遮盖的屏幕部分。<br /><br />    SPI_SETBATTERYidletimeout：在Windows CE没有因用户操作而挂起之前，电池电源能坚持给系统供电的时间量可以使用该标志来设置。只要键盘或触摸屏处在活动状态（有输入），那么Windows CE操作系统及电池电源仍将工作。参数ulParam指定要设置的时间，单位为秒。如果ulParam设置为0，那么该标志被忽略。<br /><br />    SPI_SETEXTERNALIDLETIMEOUT：在Windows CE没有因用户操作而挂起之前，交流电源能坚持给系统供电的时间量可以使用该标志来设置。只要键盘或触摸屏幕处在活动状态，那么Windows CE操作系统及AC电源仍将工作。参数ulParam指定要设置的时间，单位为秒。如果ulParam设为0，那么该标志被忽略。SPL_SETMOUSE：设置鼠标的两个阈值和速度。<br /><br />    SPI_SETWAKEUPIDLETIMEOUT：在用户通知重新激活某个挂起的设备之后，Windows CE延缓响应的时间长度量可使用该标志来设置。参数ulParam指定这个时间量，单位为秒，如果ulParam设置为0，那么该标志被忽略。<br /><br />    SPI_SETWORKAREA设置工作区大小，工作区是指没有被任务条遮盖的屏幕部分。如果用来获取平台类型或OEM信息串的pvParam缓冲区太小，那么该函数会调用失败，并出现错误值ERROR_INSUFFICENT_BUFFER。Windows CE只支持该函数的UNICODE版。Windows CE不支持参数fWinlni的取值为SPIF_SENDWININICHANGE的情形。</div></div></div><img src ="http://www.cppblog.com/mzty/aggbug/15131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-11-13 16:47 <a href="http://www.cppblog.com/mzty/archive/2006/11/13/15131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc 使用总结</title><link>http://www.cppblog.com/mzty/archive/2006/05/29/7794.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Mon, 29 May 2006 00:52:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/05/29/7794.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/7794.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/05/29/7794.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/7794.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/7794.html</trackback:ping><description><![CDATA[
		<table class="fixedTable blogpost" cellspacing="0" width="75%" border="0">
				<tbody>
						<tr>
								<td class="ellipse">
										<span class="bvTitle" id="subjcns!20574CB16CD822C6!123">
												<strong>将文字传送到剪贴簿</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="bvh8">
										<strong>
										</strong>
								</td>
						</tr>
						<tr>
								<td id="msgcns!20574CB16CD822C6!123">
										<div>
												<p>
														<font style="LINE-HEIGHT: 25px" face="arial" color="#3e72d7" size="4">
																<br style="LINE-HEIGHT: 25px" />
																<strong>　</strong>
														</font>
												</p>
												<p>
														<font style="LINE-HEIGHT: 25px" face="arial" color="#000000" size="2">让我们想像把一个ANSI字串传送到剪贴簿上，并且我们已经有了指向这个字串的指标(pString)。现在希望传送这个字串的iLength字元，这些字元可能以NULL结尾，也可能不以NULL结尾。</font>
												</p>
												<p>
														<font style="LINE-HEIGHT: 25px" face="arial" color="#000000" size="2">首先，通过使用GlobalAlloc来配置一个足以储存字串的记忆体块，其中还包括一个终止字元NULL：</font>
												</p>
												<div style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7">
														<font style="LINE-HEIGHT: 25px" face="Arial" size="3">
																<pre style="LINE-HEIGHT: 25px">hGlobal = GlobalAlloc (GHND | GMEM_SHARE, iLength + 1) ;</pre>
														</font>
												</div>
												<p>
														<font style="LINE-HEIGHT: 25px" face="arial" color="#000000" size="2">如果未能配置到记忆体块，hGlobal的值将为NULL 。如果配置成功，则锁定这块记忆体，并得到指向它的一个指标：</font>
												</p>
												<div style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7">
														<font style="LINE-HEIGHT: 25px" face="Arial" size="3">
																<pre style="LINE-HEIGHT: 25px">pGlobal = GlobalLock (hGlobal) ;</pre>
														</font>
												</div>
												<p>
														<font style="LINE-HEIGHT: 25px" face="arial" color="#000000" size="2">将字串复制到记忆体块中：</font>
												</p>
												<div style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7">
														<font style="LINE-HEIGHT: 25px" face="Arial" size="3">
																<pre style="LINE-HEIGHT: 25px">for (i = 0 ; i &lt; wLength ; i++)
     *pGlobal++ = *pString++ ;</pre>
														</font>
												</div>
												<p>
														<font style="LINE-HEIGHT: 25px" face="arial" color="#000000" size="2">由於GlobalAlloc的GHND旗标已使整个记忆体块在配置期间被清除为零，所以不需要增加结尾的NULL 。以下叙述为记忆体块解锁：</font>
												</p>
												<div style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7">
														<font style="LINE-HEIGHT: 25px" face="Arial" size="3">
																<pre style="LINE-HEIGHT: 25px">GlobalUnlock (hGlobal) ;</pre>
														</font>
												</div>
												<p>
														<font style="LINE-HEIGHT: 25px" face="arial" color="#000000" size="2">现在就有了表示以NULL结尾的文字所在记忆体块的记忆体代号。为了把它送到剪贴簿中，打开剪贴簿并把它清空：</font>
												</p>
												<div style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7">
														<font style="LINE-HEIGHT: 25px" face="Arial" size="3">
																<pre style="LINE-HEIGHT: 25px">OpenClipboard (hwnd) ;
EmptyClipboard () ;</pre>
														</font>
												</div>
												<p>
														<font style="LINE-HEIGHT: 25px" face="arial" color="#000000" size="2">利用CF_TEXT识别字把记忆体代号交给剪贴簿，关闭剪贴簿：</font>
												</p>
												<div style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7">
														<font style="LINE-HEIGHT: 25px" face="Arial" size="3">
																<pre style="LINE-HEIGHT: 25px">SetClipboardData (CF_TEXT, hGlobal) ;
CloseClipboard () ;</pre>
														</font>
												</div>
												<p>
														<font style="LINE-HEIGHT: 25px" face="arial" color="#000000" size="2">工作告一段落。</font>
												</p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table class="fixedTable blogpost" cellspacing="0" width="75%" border="0">
				<tbody>
						<tr>
								<td class="ellipse">
										<span class="bvTitle" id="subjcns!20574CB16CD822C6!122">
												<strong>GlobalAlloc 及其它</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="bvh8">
										<strong>
										</strong>
								</td>
						</tr>
						<tr>
								<td id="msgcns!20574CB16CD822C6!122">
										<div>
												<strong>
												</strong>
										</div>从用户的角度来看，WIN32的内存管理是非常简单和明了的。每一个应用程序都有自己独立的4G地址空间，这种内存模式叫做“平坦”型地址模式，所有的段寄存器或描述符都指向同样的起始地址，所有的地址偏移都是32位的长度，这样一个应用程序无须变换选择符就可以存取自己的多达4G的地址空间。这种内存管理模式是非常简洁而便于管理的，而且我们再不用和那些令人讨厌的“near”和“far”指针打交道了。在W16下有两种主要类型的API：全局和局部。“全局”的API 分配在其他的段中，这样从内存角度来看他们是一些“far”（远）函数或者叫远过程调用，“局部”API只要和进程的堆打交道，所以把它们叫做“near”（近）函数或者近过程调用。而在WIN32中，这两种内存模式是相同的，无论您调用GlobalAlloc还是LocalAlloc，结果都是一样。 
<p>至于分配和使用内存的过程都是一样的： </p><p>    调用GlobalAlloc函数分配一块内存，该函数会返回分配的内存句柄。 <br />    调用GlobalLock函数锁定内存块，该函数接受一个内存句柄作为参数，然后返回一个指向被锁定的内存块的指针。 <br />    您可以用该指针来读写内存。 <br />    调用GlobalUnlock函数来解锁先前被锁定的内存，该函数使得指向内存块的指针无效。 <br />    调用GlobalFree函数来释放内存块。您必须传给该函数一个内存句柄。 <br />    在WIN32中您也可以用“Local”替代内存分配API函数带有“Global”字样的函数中的“Global”，也即用LocalAlloc、LocalLock等。<br />    在调用函数GlobalAlloc时使用GMEM_FIXED标志位可以更进一步简化操作。使用了该标志后，Global/LocalAlloc返回的是指向已分配内存的指针而不是句柄，这样也就不用调用Global/LocalLock来锁定内存了，释放内存时只要直接调用Global/LocalFree就可以了。</p></td>
						</tr>
				</tbody>
		</table>
		<br />
		<table class="fixedTable blogpost" cellspacing="0" width="75%" border="0">
				<tbody>
						<tr>
								<td class="ellipse">
										<span class="bvTitle" id="subjcns!20574CB16CD822C6!118">
												<strong>句柄vs指针</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="bvh8">
										<strong>
										</strong>
								</td>
						</tr>
						<tr>
								<td id="msgcns!20574CB16CD822C6!118">
										<div>句柄是一种指向指针的指针。我们知道，所谓指针是一种内存地址。应用程序启动后，组成这  <br />个程序的各对象是住留在内存的。如果简单地理解，似乎我们只要获知这个内存的首地址，那么就可以随时用这个地址 访问对象。但是，如果您真的这样认为，那么您就大错特错了。我们知道，Windows是一 个以虚拟内存为基础的操作系统。在这种系统环境下，Windows内存管理器经常在内存中来回移动对象，依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化 了。如果地址总是如此变化，我们该到哪里去找该对象呢?为了解决这个问题，Windows操作系统为各应用程序腾出一些内存储地址，用来专门 登记各应用对象在内存中的地址变化，而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后，把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的，当系统卸载时(Unload)又释放给系统。句柄地址(稳定)→记载着对象在内存中的地址→对象在内存中的地址(不稳定)→实际对象。但是，必须注意的是程序每次从新启动，系统不能保证分配给这个程序的句柄还是原来的那个句柄，而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成 是一个应用程序的启动运行，那么系统给应用程序分配的句柄总是不一样，这和每次电 影院售给我们的门票总是不同的一个座位是一样的道理。  <br /></div>
								</td>
						</tr>
						<tr>
								<td>
										<table cellspacing="0" border="0">
												<tbody>
												</tbody>
										</table>
										<table class="fixedTable blogpost" cellspacing="0" width="75%" border="0">
												<tbody>
														<tr>
																<td class="ellipse">
																		<span class="bvTitle" id="subjcns!20574CB16CD822C6!125">
																				<strong>Debug</strong>
																		</span>
																</td>
														</tr>
														<tr>
																<td class="bvh8">
																		<strong>
																		</strong>
																</td>
														</tr>
														<tr>
																<td id="msgcns!20574CB16CD822C6!125">
																		<div>某年，某月，某日。<br />为某一个大型程序，增加一个大型功能。编译，运行，死机。 
<p>跟踪之，居然死在了如下语句：<br />CString str;<br />而且还极不稳定，这次调试死在n行，下次调试死在m行。但都是和内存申请有关。（由于程序很大，其中频繁地申请和释放内存，多处使用new和CString）</p><p>猜测：一定是内存不够啦，遂在某处调用函数得到当前剩余的物理内存数量并使用MessageBox显示。报告曰：自由物理内存还有100多M。鼠标按下OK键，程序居然不死了。恩？？？</p><p>删除MessageBox()函数—死！加上MessageBox()函数—不死！再删除–死，再加上–不死。晕倒！</p><p>捏呆呆郁闷不知道多少时间后，灵光闪烁……把多处的new/delete改写为GlobalAlloc()/GlobalFree()，一切OK。</p><p>事后原因分析：使用new和CString，频繁申请，释放内存，一定产生零碎内存块。当使用MessageBox的时候，系统接管程序的运行（因为它在等待着你按OK按纽），它这时候开始回收合并这些零碎的内存块。这样程序就没有问题了。而函数GlobalAlloc()/GlobalFree()本身就有回收合并零碎内存的功能。</p><p>友情提示：在频繁使用new,CString的场合，建议把某些（大）数据块的申请用GlobalAlloc替换。<br /><br /></p><table class="fixedTable blogpost" cellspacing="0" width="75%" border="0"><tbody><tr><td class="ellipse"><span class="bvTitle" id="subjcns!20574CB16CD822C6!126"><strong>c++异常处理</strong></span></td></tr><tr><td class="bvh8"><strong></strong></td></tr><tr><td id="msgcns!20574CB16CD822C6!126"><div>#include&lt;fstream.h&gt;<br />#include&lt;iostream.h&gt;<br />#include&lt;stdlib.h&gt;<br />void main() <br />{ ifstream source("c:\abc.txt");  //打开文件<br /> char line[128];<br /> try //定义异常  <br /> {if (source.fail())<br />  throw "txt";  //抛掷异常<br /> }<br /> catch(char * s) //定义异常处理 <br /> { cout&lt;&lt;"error opening the file "&lt;&lt;s&lt;&lt;endl;<br />  exit(1);<br /> }<br /> while(!source.eof())<br /> { source.getline(line, sizeof(line));<br />  cout&lt;&lt;line&lt;&lt;endl;}<br /> source.close();<br />}</div><div>///////////////////////////////////////////////////////////</div></td></tr></tbody></table></div>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<table class="fixedTable blogpost" cellspacing="0" width="75%" border="0">
				<tbody>
						<tr>
								<td class="ellipse">
										<span class="bvTitle" id="subjcns!20574CB16CD822C6!129">
												<strong>C＋＋开发中常见问题</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="bvh8">
										<strong>
										</strong>
								</td>
						</tr>
						<tr>
								<td id="msgcns!20574CB16CD822C6!129">
										<div>
												<p>    1，简述VC6下如何进行程序的调试。</p>
												<p>在主菜单"Build"中，有一个Start Build的子菜单，它下面包含了Go菜单（快捷键为F5),选择后，程序将从当前语句进入调试运行，直到遇到断点或程序结束。</p>
												<p>将鼠标移动到要调试的代码行，单击鼠标右键选择“Insert/Remove Breakpoint”，或者按下F9，可以在该行上添加断点，此时断点代码行前面出现一个棕色的圈，再次选择将清除断点。进入调试状态后，Debug菜单将取代Build菜单出现在菜单栏中，它下面包含常用的调试操作，如Step Over，单步运行并不跟踪到调用的函数内部；其他还包括Step Into，Step Out, Stop Debugging等调试方法。</p>
												<p>    2, 简述在VC6建立的工程中后缀为.cpp,.h,.rc,.dsp,.dsw的文件的作用是什么?</p>
												<p>.cpp是源程序代码C＋＋文件</p>
												<p>.h是包含函数声明和变量定义的头文件</p>
												<p>.rc是定义资源的资源脚本文件</p>
												<p>.dsp是工程文件，记录当前工程的有关信息</p>
												<p>.dsw是工作区文件，一个工作区可能包含一个或多个工程</p>
												<p>    3, 已知一个对话框上有一个编辑框控件，ID为IDC_EDIT1,为其关联了CEdit类型的变量m_edit1,使用两种方法，说明如何改变编辑框内部的文本为"Hello"，写出程序代码的片断。</p>
												<p>第一种方法：m_edit1.SetSel(0,-1);            </p>
												<p>             m_edit1.ReplaceSel("Hello");     </p>
												<p>第二种方法：SetWindowText("Hello");       </p>
												<p>    4, 简述使用Windows API编写的一个基本的Windows应用程序框架的结构。</p>
												<p>Windows API编写的基本应用程序框架至少应该包含程序入口函数WinMain和窗口函数WndProc。在主函数WinMain里面包含窗口类的定义和注册，窗口的创建和显示以及消息循环。</p>
												<p>    5, 消息在Windows中的数据类型是什么，它有哪些成员变量，各有什么含义</p>
												<p>消息的数据类型是MSG,它是一个结构体，其成员变量主要包括hwnd,表示消息的窗口句柄；message代表消息的类型；wParam和lParam包含消息的附加信息，随不同的消息有所不同。</p>
												<p>    6, Windows的鼠标消息的长参数lParam与字参数wParam的含义是什么</p>
												<p>鼠标消息的长参数lParam的低字节包含了鼠标光标位置的x坐标值，lParam的高字节包含了鼠标光标位置的y坐标值；字参数wParam内包含了指示当前按下的各种虚键状态的值。</p>
												<p>    7, 说明使用一个非模态对话框的注意问题和用到的Windows API函数</p>
												<p>使用一个非模态对话框应该注意一定要在样式中包含WS_VISIBLE才能正常显示；创建对话框使用CreateDialog函数；消息循环部分应该使用IsDialogMessage过滤消息；关闭对话框使用函数DestroyWindow。</p>
												<p>    8, 简述在MFC应用程序中UpdateData函数的作用及其参数含义与使用场合。</p>
												<p>UpdateData只有一个BOOL类型的参数，UpdateData(FALSE)一般用于对话框控件连接的变量值刷新屏幕显示；UpdateData(TRUE)用于获取屏幕数据到对话框控件连接的变量中。</p>
												<p>    9, 列举列表框控件能够接受的三个消息类型，并说明其作用</p>
												<p>LB_ADDSTRING用于在列表框中加入一项字符串；LB_DIR用于在列表框中列出指定文件；LB_GETTEXT用于获取指定项的文本。</p>
												<p>    10, 在一个对话框上添加了三个单选按钮，要使它们之间自动实现互斥，应该注意什么问题，在VC环境下如何操作？</p>
												<p>要实现一组单选按钮的自动互斥，应该让它们的控件ID值连续，并设置第一个单选按钮的Group属性，其他的不设。</p>
												<p>    11, 简述由一个文档类派生自己的文档类，并实现文档的存取需要哪些步骤。</p>
												<p>首先为每一个文档类型从CDocument派生一个相应的文档类；然后为该文档类添加成员变量以保存数据；最后重载Serialize成员函数以实现文档数据的串行化。</p>
												<p>    12, 列举视图类(CView)的三个子类，并简要说明其作用。</p>
												<p>CScrollView类提供视图的滚动显示；CEditView类支持在视图中的文本编辑操作；CHtmlView类支持在视图中显示和操作html文件。</p>
												<p>    13, Visual C＋＋ 6.0如何进入调试状态，在调试状态下能够显示哪些调试窗口，列举三个，其作用分别是什么?</p>
												<p>启动调试后，在View菜单的Debug Window子菜单下可以打开一些辅助调试的窗口</p>
												<p>Watch:显示察看当前语句和前面语句中变量值的窗口</p>
												<p>Call Stack：显示察看调用堆栈的窗口</p>
												<p>Memory：显示察看内存中内容的窗口</p>
												<p>    14, 说明位图资源的创建及显示过程的步骤，并给出相应的Windows API函数名。</p>
												<p>首先定义位图句柄HBITMAP hBitmap;第二步使用LoadBitMap加载位图；第三步，调用CreateCompatibleDC向系统申请内存设备环境句柄，并调用函数SelectObject把位图选入内存设备环境；第四步，调用BitBlt函数将位图从内存设备环境输出到指定的窗口设备环境中，从而实现显示位图。</p>
												<p>    15, 如何获取字体句柄从而实现字体的输出，并给出相应的Windows API函数名。</p>
												<p>首先定义字体句柄变量HFONT hF;然后调用函数GetStockObject获取系统的字体句柄，或者调用CreateFont得到自定义的字体句柄；最后调用SelectObject把字体句柄选入设备环境。</p>
												<p>    16, 列举三种按钮的类型，并说明其作用和创建方法之间的不同之处。</p>
												<p>常用的按钮有普通按钮、单选按钮、复选框，和组框。普通按钮作用是帮助用户触发指定动作；单选按钮一般各选项之间存在互斥性；复选框用来显示一组选项供用户选择，各选项之间不存在互斥；组框主要用于把控件分成不同的组并加以说明.</p>
												<p>    17, 要使一个静态控件显示一个位图并能接受用户输入，应该注意什么问题。</p>
												<p>要使静态控件显示位图，必须设定其风格包含SS_BITMAP，并在创建静态控件窗口，即调用CreateWindow时指定并加载位图；要使静态控件能够接收用户输入，必须设定其风格包含SS_NOTIFY。<br /><br /><br /></p>
												<table class="fixedTable blogpost" cellspacing="0" width="75%" border="0">
														<tbody>
																<tr>
																		<td class="ellipse">
																				<span class="bvTitle" id="subjcns!20574CB16CD822C6!130">
																						<strong>VC学习笔记</strong>
																				</span>
																		</td>
																</tr>
																<tr>
																		<td class="bvh8">
																				<strong>
																				</strong>
																		</td>
																</tr>
																<tr>
																		<td id="msgcns!20574CB16CD822C6!130">
																				<div>
																						<br />
																						<strong>VC学习笔记1：按钮的使能与禁止</strong>
																						<br />
																						<br />用ClassWizard的Member Variables为按钮定义变量，如：m_Button1；<br />则<br />m_Button1.EnableWindow(true); 使按钮处于允许状态<br />m_Button1.EnableWindow(false); 使按钮被禁止，并变灰显示<br /><br /><br /><b>VC学习笔记2：控件的隐藏与显示</b><br /><br />用CWnd类的函数BOOL ShowWindow(int nCmdShow)可以隐藏或显示一个控件。<br /><br />例1：<br />CWnd *pWnd;<br />pWnd = GetDlgItem( IDC_EDIT1 );    //获取控件指针，IDC_EDIT为控件ID号<br />pWnd-&gt;ShowWindow( SW_HIDE );    //隐藏控件<br /><br />例2：<br />CWnd *pWnd;<br />pWnd = GetDlgItem( IDC_EDIT1 );    //获取控件指针，IDC_EDIT为控件ID号<br />pWnd-&gt;ShowWindow( SW_SHOW );    //显示控件<br /><br />以上方法常用于动态生成控件，虽说用控件的Create函数可以动态生成控件，但这种控件很不好控制，所以用隐藏、显示方法不失为一种替代手段。<br /><br /><br /><b>VC学习笔记3：改变控件的大小和位置</b><br /><br />用CWnd类的函数MoveWindow()或SetWindowPos()可以改变控件的大小和位置。<br /><br />void MoveWindow(int x,int y,int nWidth,int nHeight);<br />void MoveWindow(LPCRECT lpRect);<br />第一种用法需给出控件新的坐标和宽度、高度；<br />第二种用法给出存放位置的CRect对象；<br />例：<br />CWnd *pWnd;<br />pWnd = GetDlgItem( IDC_EDIT1 );    //获取控件指针，IDC_EDIT1为控件ID号<br />pWnd-&gt;MoveWindow( CRect(0,0,100,100) );    //在窗口左上角显示一个宽100、高100的编辑控件<br /><br />SetWindowPos()函数使用更灵活，多用于只修改控件位置而大小不变或只修改大小而位置不变的情况：<br />BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);<br />第一个参数我不会用，一般设为NULL;<br />x、y控件位置；cx、cy控件宽度和高度；<br />nFlags常用取值：<br />SWP_NOZORDER：忽略第一个参数；<br />SWP_NOMOVE：忽略x、y，维持位置不变；<br />SWP_NOSIZE：忽略cx、cy，维持大小不变；<br />例：<br />CWnd *pWnd;<br />pWnd = GetDlgItem( IDC_BUTTON1 );    //获取控件指针，IDC_BUTTON1为控件ID号<br />pWnd-&gt;SetWindowPos( NULL,50,80,0,0,SWP_NOZORDER | SWP_NOSIZE );    //把按钮移到窗口的(50,80)处<br />pWnd = GetDlgItem( IDC_EDIT1 );<br />pWnd-&gt;SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER | SWP_NOMOVE );    //把编辑控件的大小设为(100,80)，位置不变<br />pWnd = GetDlgItem( IDC_EDIT1 );<br />pWnd-&gt;SetWindowPos( NULL,0,0,100,80,SWP_NOZORDER );    //编辑控件的大小和位置都改变<br />以上方法也适用于各种窗口。<br /><br /><br /><b>VC学习笔记4：什么时候设定视中控件的初始尺寸？</b><br /><br />我在CFormView的视中加入了一个编辑控件，在运行时使它充满客户区，当窗口改变大小时它也跟着改变。<br />改变控件尺寸可以放在OnDraw()函数中，也可放在CalcWindowRect()函数中，当窗口尺寸发生变化时，它们都将被执行，且CalcWindowRect()函数先于OnDraw()函数，下例是在CalcWindowRect()函数中修改控件尺寸。<br />重载VIEW类的CalcWindowRect函数，把设定控件的尺寸的语句加入这个函数中。<br />例：<br />void CMyEditView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) <br />{<br />    // TODO: Add your specialized code here and/or call the base class<br /><br />    CFrameWnd *pFrameWnd=GetParentFrame(); //获取框架窗口指针<br /><br />    CRect rect;<br />    pFrameWnd-&gt;GetClientRect(&amp;rect); //获取客户区尺寸<br /><br />    CWnd *pEditWnd=GetDlgItem(IDC_MYEDIT); //获取编辑控件指针，IDC_MYEDIT为控件ID号<br />    pEditWnd-&gt;SetWindowPos(NULL,0,0,rect.right,rect.bottom-50,SWP_NOMOVE | SWP_NOZORDER); //设定控件尺寸，bottom-50是为了让出状态条位置。<br /><br />    CFormView::CalcWindowRect(lpClientRect, nAdjustType);<br />}<br /><br /><br /><b>VC学习笔记5：单选按钮控件（Ridio Button）的使用</b><br /><br />一、对单选按钮进行分组：<br />每组的第一个单选按钮设置属性：Group，Tabstop，Auto;其余按钮设置属性Tabstop，Auto。<br /><br />如：<br />Ridio1、Ridio2、Ridio3为一组，Ridio4、Ridio5为一组<br /><br />设定Ridio1属性：Group，Tabstop，Auto<br />设定Ridio2属性：Tabstop，Auto<br />设定Ridio3属性：Tabstop，Auto<br /><br />设定Ridio4属性：Group，Tabstop，Auto<br />设定Ridio5属性：Tabstop，Auto<br /><br />二、用ClassWizard为单选控件定义变量，每组只能定义一个。如：m_Ridio1、m_Ridio4。<br /><br />三、用ClassWizard生成各单选按钮的单击消息函数，并加入内容：<br /><br />void CWEditView::OnRadio1() <br />{<br />    m_Ridio1 = 0;    //第一个单选按钮被选中<br />}<br /><br />void CWEditView::OnRadio2() <br />{<br />    m_Ridio1 = 1;    //第二个单选按钮被选中<br />}<br /><br />void CWEditView::OnRadio3() <br />{<br />    m_Ridio1 = 2;    //第三个单选按钮被选中<br />}<br /><br />void CWEditView::OnRadio4() <br />{<br />    m_Ridio4 = 0;    //第四个单选按钮被选中<br />}<br /><br />void CWEditView::OnRadio5() <br />{<br />    m_Ridio4 = 1;    //第五个单选按钮被选中<br />}<br /><br />四、设置默认按钮：<br />在定义控件变量时，ClassWizard在构造函数中会把变量初值设为-1，只需把它改为其它值即可。<br />如：<br />//{{AFX_DATA_INIT(CWEditView)<br />m_Ridio1 = 0;    //初始时第一个单选按钮被选中<br />m_Ridio4 = 0;    //初始时第四个单选按钮被选中<br />//}}AFX_DATA_INIT<br /><br /><br /><b>VC学习笔记6：旋转控件（Spin）的使用</b><br /><br />当单击旋转控件上的按钮时，相应的编辑控件值会增大或减小。其设置的一般步骤为：<br />一、在对话框中放入一个Spin控件和一个编辑控件作为Spin控件的伙伴窗口，<br />设置Spin控件属性：Auto buddy、Set buddy integer、Arrow keys<br />设置文本控件属性：Number<br /><br />二、用ClassWizard为Spin控件定义变量m_Spin，为编辑控件定义变量m_Edit，定义时注意要把m_Edit设置为int型。<br /><br />三、在对话框的OnInitDialog()函数中加入语句：<br />BOOL CMyDlg::OnInitDialog() <br />{<br />    CDialog::OnInitDialog();<br />    <br />    m_Spin.SetBuddy( GetDlgItem( IDC_EDIT1 ) );    //设置编辑控件为Spin控件的伙伴窗口<br />    m_Spin.SetRange( 0, 10 );    //设置数据范围为0-10<br />    return TRUE;<br />}<br /><br />四、用ClassWizard为编辑控件添加EN_CHANGE消息处理函数，再加入语句：<br />void CMyDlg::OnChangeEdit1() <br />{<br />    m_Edit = m_Spin.GetPos();    //获取Spin控件当前值<br />}<br /><br />OK!<br /><br /><br /><b>VC学习笔记7：程序结束时保存文件问题</b><br /><br />在文档-视图结构中，用串行化自动保存文件在各种VC书上都有介绍。现在的问题是我不使用串行化，而是自己动手保存，当点击窗口的关闭按钮时，如何提示并保存文档。<br /><br />用ClassWizard在文档类（CxxDoc）中添加函数CanCloseFrame()，再在其中加入保存文件的语句就可以了。<br />注：要保存的数据应放在文档类（CxxDoc）或应用程序类（CxxApp）中，不要放在视图类中。<br /><br />例：<br />//退出程序<br />BOOL CEditDoc::CanCloseFrame(CFrameWnd* pFrame) <br />{<br />    CFile file;<br />    if(b_Flag)    //b_Flag为文档修改标志，在修改文档时将其置为True<br />    {<br />        int t;<br />        t=::MessageBox(NULL,"文字已经改变，要存盘吗？","警告",<br />                MB_YESNOCANCEL | MB_ICONWARNING);    //弹出提示对话框<br />        if(t==0 || t==IDCANCEL)<br />            return false;<br />        if(t==IDYES)<br />        {<br />            CString sFilter="Text File(*.txt)|*.txt||";<br />            CFileDialog m_Dlg(FALSE,"txt",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,(LPCTSTR)sFilter,NULL);    //定制文件对话框<br /><br />            int k=m_Dlg.DoModal();    //弹出文件对话框<br />            if(k==IDCANCEL || k==0)<br />                return false;<br />            m_PathName=m_Dlg.GetPathName();    //获取选择的文件路径名<br />            <br />            file.Open(m_PathName,CFile::modeCreate | CFile::modeWrite);<br />            file.Write(m_Text,m_TextLen);    //数据写入文件<br />            file.Close();<br />        }<br />    }<br />    return CDocument::CanCloseFrame(pFrame);<br />}<br /><br /><br /><b>VC学习笔记8：UpdateData()</b><br /><br />对于可以接收数据的控件，如编辑控件来说，UpdateData()函数至关重要。当控件内容发生变化时，对应的控件变量的值并没有跟着变化，同样，当控件变量值变化时，控件内容也不会跟着变。<br />UpdateData()函数就是解决这个问题的。<br /><br />UpdateData(true);把控件内容装入控件变量<br />UpdateData(false);用控件变量的值更新控件<br /><br />如：有编辑控件IDC_EDIT1，对应的变量为字符串m_Edit1，<br />1、修改变量值并显示在控件中：<br />m_Edit1 = _T("结果为50");<br />UpdateData(false);<br />2、读取控件的值到变量中：<br />用ClassWizard为IDC_EDIT1添加EN_CHANGE消息处理函数，<br />void CEditView::OnChangeEdit1()<br />{<br />    UpdateData(true);<br />} </div>
																		</td>
																</tr>
														</tbody>
												</table>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
		<table class="fixedTable blogpost" cellspacing="0" width="75%" border="0">
				<tbody>
						<tr>
								<td class="ellipse">
										<span class="bvTitle" id="subjcns!20574CB16CD822C6!124">
												<strong>VC实现BMP位图文件结构及平滑缩放</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="bvh8">
										<strong>
										</strong>
								</td>
						</tr>
						<tr>
								<td id="msgcns!20574CB16CD822C6!124">
										<div>
												<table cellspacing="0" cellpadding="0" width="75%" border="0">
														<tbody>
																<tr>
																		<td align="middle" bgcolor="#f7fbfe" colspan="2" height="40">
																				<span style="FONT-SIZE: 16pt; COLOR: #05006c">
