﻿<?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++博客-ally-zheng-2009-文章分类-mfc</title><link>http://www.cppblog.com/ally-zheng-2009/category/12039.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 05 Mar 2010 22:06:42 GMT</lastBuildDate><pubDate>Fri, 05 Mar 2010 22:06:42 GMT</pubDate><ttl>60</ttl><item><title>SystemParametersInfo详说(转)</title><link>http://www.cppblog.com/ally-zheng-2009/articles/108416.html</link><dc:creator>ally-zheng</dc:creator><author>ally-zheng</author><pubDate>Thu, 25 Feb 2010 03:59:00 GMT</pubDate><guid>http://www.cppblog.com/ally-zheng-2009/articles/108416.html</guid><wfw:comment>http://www.cppblog.com/ally-zheng-2009/comments/108416.html</wfw:comment><comments>http://www.cppblog.com/ally-zheng-2009/articles/108416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ally-zheng-2009/comments/commentRss/108416.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ally-zheng-2009/services/trackbacks/108416.html</trackback:ping><description><![CDATA[<font color=#800000>函数功能描述:查询或设置系统级参数。该函数也可以在设置参数中更新用户配置文件。<br><br>函数原型<br>B00L SystemParametersinfo(UINT uiAction,UINT uiParam,PVOID pvParam,UINT fWinlni);<br><br>参数<br>uiAction：该参数指定要查询或设置的系统级参数。其取值如下；<br>SPI_GETACCESSTIMEOUT:<br>检索与可访问特性相关联的超时段的信息，PvParam参数必须指向某个ACCESSTIMEOUT结构以获得信息，并将该结构中的cbSjze成员和ulParam参数的值设为sizeof（ACCESSTIMEOUT）。<br><br>SPI_GETACTIVEWINDOWTRACKING:<br>用于Windows 98和Windows NT 5.0及以后的版本。它表示是否打开活动窗口跟踪（激活该窗口时鼠标置为开状态），pvParam参数必须指向一个BOOL型变量（打开时接收值为TRUE，关闭时为FALSE）。<br><br>SPI_GETACTIVEWNDTRKZORDER:<br>用于Windows 98和Windows NT 5.0及以后版本。它表示通过活动窗口跟踪开关激活的窗口是否要置于最顶层。pvParam参数必须指向一个BOOL型变量，如果要置于顶层，那么该变量的值为TRUE，否则为FALSE。<br><br>SPI_GETACTIVEWNDTRKTIMEOUT:<br>用于Windows 98和 Windows NT 5.0及以后版本。它指示活动窗口跟踪延迟量，单位为毫秒。pvParam参数必须指向DWORD类型变量，以接收时间量。<br><br>SPI_GETANIMATION:<br>检索与用户活动有关的动画效果。pvParam参数必须指向ANIMATIOINFO结构以接收信息。并将该结构的cbSize成员和ulParam参数置为sizeof（ANIMATIONINFO）。<br><br>SPI_GETBEEP:<br>表示警告蜂鸣器是否是打开的。pvParam参数必须指向一个BOOL类型变量，如果蜂鸣器处于打开状态，那么该变量的值为TRUE，否则为FALSE。<br><br>SpI_GETBORDER:<br>检索决定窗口边界放大宽度的边界放大因子。pvParam参数必须指向一个整型变量以接收该值。<br><br>SPI_GETDEFAULTINPUTLANG:<br>返回用于系统缺省输入语言的键盘布局句柄。pvParam参数必须指向一个32位变量，以接收该值。<br><br>SPI_GETCOMBOBOXANIMATION:<br>用于Windows 98和Windows NT 5.0及以后版本。它表示用于组合柜的动打开效果是否允许。pvParam参数必须指向一个BOOL变量，如果允许，那么变量返回值为TRUE，否则为FALSE。<br><br>SPI_GETDRAGFULLWINDOWS:<br>确定是否允许拖拉到最大窗口。pvParam参数必须指向BOOL变量，如果允许，返回值为TRUE，否则为FALSE。对于Windows 95系统，该标志只有在安装了Windows plusl才支持。<br><br>SPI_GETFASTTASKSWITCH:<br>该标志已不用！以前版本的系统使用该标志来确定是否允许Alt＋Tab快速任务切换。对于Windows 95、Windows 98和Windows NT 4.0版而言，快速任务切换通常是允许的。<br><br>SPI_GETFILTERKEYS:<br>检索有关FILTERKEYS（过滤键）易用特征信息。pvParam参数必须指向接收信息的filterkeys结构，并将该结构中的cbSze成员和ulParam参数的值设为sizeof（FILTERKEYS）。<br><br>SPI_GETFONTSMOOTHING:<br>表示字体平滑处理特征是否允许。该特征使用字体保真技术，通过在不同灰度级上涂上像素使字体曲线显得更加平滑。参数pvParam必须指向BOOL类型变量，如果该特征被允许，那么返回值为TRUE，否则为FALSE。对于Windows 95系统，该标志只有在安装了Windows plusl才支持。<br><br>SPI_GETFOREGROUNDFLASHCOUNT:<br>用于Windows 98和Windows NT 5.0及以后版本。它表示在拒绝前台切换申请时系统闪烁任务条按钮的次数。参数pvParam必须指向DWORD变量，以接收该值。<br><br>SPI_GETFOREGROUNDLOCKTIMEOUT:<br>用于Windows NT 5.O及以后版本或Windows 98。它表示在系统禁止应用程序强行将自己进入前台期间的时间量，单位为毫秒．参数pvParam必须指向DWORD变量以接收时间值。<br><br>SPI_GETGRADIENTCAPTIONS:<br>用于Windows 98和Windows NT 5.0及以后版本。它表示是否允许有用于窗口标题栏的倾斜效果。参数pvParam必须指向BOOL变量，其值在允许时为TRUE，禁止时为FALSE。<br><br>SPL_GETGRIDGRANULARITY:<br>检索桌面大小网格的当前颗粒度值。参数pVparam必须指向一个整型变量以接收该值。<br><br>SPI_GETHIGHCONTRAST:<br>用于Windows 95及更高版本、Windows NT 5.0及以后版本。检索与HighContrast易用特征有关的信息。pvParam参数必须指向用于接收该信息的HIGHCONTRAST结构，该结构中的。cbSize成员和ulParam参数的值应设为sizeof（NIGHCONTRAST）。<br><br>SPI_GETICONMETRICS:<br>检索与图标有关的度量信息。参数pvParam必须指向一个ICONMETRICS结构以接收信息。该结构中的。cbSize成员和ulParam参数的值应设为sizeof（ICONMETRICS）。<br><br>SPI_GETICONTITLELOGFONT:<br>检索当前图标标题字体的逻辑字体信息。参数ulParam规定了logfont结构的大小，参数pvParam必须指向要填充的Iogfont结构。<br><br>SPI_GETICONTITLEWRAP:<br>确定是否允许图标标题环绕。pvParam参数必须指向一个BOOL类型变量，该变量的值在允许时为TRUE，否则为FALSE。<br><br>SPI_GETKEYBOARDDELAY:<br>检索键盘重复击键延迟设置，该值范围从0（大约25Oms延迟）到3（大约1秒延迟）。与该范围里每一个值相关的实际延迟时间可能与硬件有关。pvParam参数必须指向一个整型变量以接收设置值。<br><br>SPI_GETKEYBOARDPREF:<br>用于Windows 95及以后版本。Windows NT 5.O及以后版本。它确定用户是否依赖键盘而非鼠标，是否要求应用程序显示键盘接口，以免隐藏。pvParam参数必须指向一个BOOL类型变量，如果用户依赖键盘，那么该变量取值为TRUE，否则为FALSE。<br><br>SPI_GETKEYBOARDSPEED:<br>检索键盘重复击键速度设置情况，该值范围从0（大约30次/秒）至31（大约25次/秒）。实际的击键速率与硬件有关，而且变动的线性幅度有可能高达20％。参数pvParam必须指向DWORD变量以接收设置值。<br><br>SPI_GETLISTBOXSMOOTHSCROLLING:<br>用于Windows 98和Windows NT 5.0及以后版本。表示是否允许有列表栏的平滑滚动效果。pvParam参数必须指向BOOL变量，如果允许，则该值为TRUE，否则为FALSE。<br><br>SPI_GETLDWPOWERACTIVE:<br>确定是否允许屏幕保护的低电压状态。如果允许，那么指向BOOL变量的pvParam参数会接收到TRUE值，否则为FALSE。对于Windows 98,该标志对16位和32位应用程序都支持。<br>对于Windows 95，该标志只支持16位应用程序。对于Windows NT，在Windows NT 5.0及以后版本中支持32位应用程序，对16位应用程序则不支持。<br><br>SPI_GETLOWPOWERTIMEOUT:<br>检索用于屏幕保护的低电压状态超时值。pvParam参数必须指向一个整型变量，以接收该值。对于Windows 98该标志支持16位和32位应用程序。对于Windows95，该标志只支持16位应用程序。对于Windows NT,该标志支持Windows NT 5.0及以后版本上的32位应用程序。不支持16位应用程序。<br><br>SPI_GETMENUDROPALIGNMENT:<br>确定弹出式菜单相对于相应的菜单条项是左对齐，还是右对齐、参数pvParam必须指向一个BOOL类型变量，如果是左对齐。那么该变量值为TRUE，否则为FALSE。<br><br>SPI_GETMINIMIZEDMETRICS:<br>检索最小化窗口有关的度量数据信息。参数pvParam必须指向MINIMIZEDMETRCS结构，以接收信息。该结构中的cbSize和ulParam参数的值应设为sizeof（MINIMIZEDMETRICS）。<br><br>SPI_GETMOUSE:<br>检索鼠标的2个阈值和加速特性。pvParam参数必须指向一个长度为3的整型数组，分别存储此值。<br><br>SPI_GETMOUSEHOVERHEGHT:<br>用于Windows NT 4.0及以后版本或Windows 98。获得在TrackMouseEvent事件中，为产生WM_MOUSEOVER消息而鼠标指针必须停留的矩形框的高度,以像素为单位。参数pvParam必须指向一个UINT变量以接收这个高度值。<br><br>SPI_GETMOUSEHOVERTIME:<br>用于Windows NT 4.0及以后版本、Windows 98，获得在TrackMouseEvent事件中，为产生WM_MOUSEOVER消息而鼠标指针必须停留在矩形框内的时间，单位为毫秒。参数pvParam必须指向一个UINT变量以接收该时间值。<br><br>SPI_GETMOUSEHOVERWIDTH:<br>用于Windows NT 4.0及以后版本、Windows 98。获得在TrackMouseEvent事件中，为产生WM_MOUSEOVER消息而鼠标指针必须停留的矩形框的宽度,以像素为单位。参数pvParam必须指向一个UINT变量以接收这个宽度值。<br><br>SPI_GETMOUSEKEYS:<br>检索与MOUSEKEYS易用特征有关的信息，pvParam参数必须指向某个MOUSEKEYS结构，以获取信息。应将结构的cbSize成员和ulParam参数设置为sizeof（MOUSEKEYS）。<br><br>SPI_GETMOUSESPEED:<br>用于Windows NT 5.0及以后版本、Windows 98。检索当前鼠标速度。鼠标速度决定了鼠标移动多少距离，鼠标的指针将移动多远。参数pvParam指向一个整型变量，该变量接收1（最慢）至20（最快）之间的数值。缺省值为们10。这个值可以由最终用户使用鼠标控制面板应用程序或使用调用了SPI_SETMOUSESPEED的应用程序来设置。<br><br>SPI_GETMOUSETRAILS:<br>用于WpvParam必须指向一个BOOL类型变量，如果是左对齐。那么该变量值为TRUE，否则为FALSE。<br><br>SPI_GETMINIMIZEDMETRICS:<br>检索最小化窗口有关的度量数据信息。参数pvParam必须指向MINIMIZEDMETRCS结构，以接收信息。该结构中的cbSize和ulParam参数的值应设为sizeof（MINIMIZEDMETRICS）。<br><br>SPI_GETMOUSE:<br>检索鼠标的2个阈值和加速特性。pvParam参数必须指向一个长度为3的整型数组，分别存储此值。<br><br>SPI_GETMOUSEHOVERHEGHT:<br>用于Windows NT 4.0及以后版本或Windows 98。获得在TrackMouseEvent事件中，为产生WM_MOUSEOVER消息而鼠标指针必须停留的矩形框的高度,以像素为单位。参数pvParam必须指向一个UINT变量以接收这个高度值。<br><br>SPI_GETMOUSEHOVERTIME:<br>用于Windows NT 4.0及以后版本、Windows 98，获得在TrackMouseEvent事件中，为产生WM_MOUSEOVER消息而鼠标指针必须停留在矩形框内的时间，单位为毫秒。参数pvParam必须指向一个UINT变量以接收该时间值。<br><br>SPI_GETMOUSEHOVERWIDTH:<br>用于Windows NT 4.0及以后版本、Windows 98。获得在TrackMouseEvent事件中，为产生WM_MOUSEOVER消息而鼠标指针必须停留的矩形框的宽度,以像素为单位。参数pvParam必须指向一个UINT变量以接收这个宽度值。<br><br>SPI_GETMOUSEKEYS:<br>检索与MOUSEKEYS易用特征有关的信息，pvParam参数必须指向某个MOUSEKEYS结构，以获取信息。应将结构的cbSize成员和ulParam参数设置为sizeof（MOUSEKEYS）。<br><br>SPI_GETMOUSESPEED:<br>用于Windows NT 5.0及以后版本、Windows 98。检索当前鼠标速度。鼠标速度决定了鼠标移动多少距离，鼠标的指针将移动多远。参数pvParam指向一个整型变量，该变量接收1（最慢）至20（最快）之间的数值。缺省值为们10。这个值可以由最终用户使用鼠标控制面板应用程序或使用调用了SPI_SETMOUSESPEED的应用程序来设置。<br><br>SPI_GETMOUSETRAILS：用于Windows 95及更高版本。它用来表示是否允许MouseTrails（鼠标轨迹）。该特征通过简单地显示鼠标轨迹并迅速擦除它们来改善鼠标的可见性。参数prParam必须指向一个整型变量来接收该值。如果这个值为0或1，那么表示禁止该特征。如果该值大于1，则说明该特征被允许，并且该值表示在鼠标轨迹上画出的光标数目。参数ulParam不用。<br>SPI_GETNONCLIENTMETRICS：检索与非最小化窗口的非客户区有关的度量信息。参数pvParam必须指向NONCLIENTMETRICS结构，以便接收相应值。该结构的。cbSize成员与ulParam参数值应设为sizeof（NONCLIENTMETRICS）。对于Windows 98，该标志支持16位和32位应用程序。对于Windows 95，该标志只支持16位应用程序。对于Windows NT该标志在NT 5.0及以后版本中支持32位应用程序，不支持16位应用程序。<br>SPI_GETPOWEROFFACTIVE：确定是否允许屏幕保护中关电。TRUE表示允许，FA参数pvParam必须指定SERIALKEYS结构来接收信息。该结构中的cbSize成员和ulParam参数的值要设为sizeof（SERIALKEYS）。<br>SPI_GETSHOWSOUNDS：确定ShowSounds易用特性标志是开或是关。如果是开，那么用户需要一个应用程序来可视化地表达信息，占则只能以听得见的方式来表达。参数pvParam必须指向一个BOOL类型变量。该变量在该特征处于开状态时返回TRUE，否则为FALSE。使用这个值等同于调用GetSystemMetrics（SM_SHOWSOUNDS）。后者是推荐使用的调用方式。<br>SPI_GETSNAPTODEFBUTTON：用于Windows NT 4.0及以后版本、Windows 98：确定 Snap-TO-Default-Button（转至缺省按钮）特征是否允许。如果允许，那么鼠标自动移至缺省按钮上，例如对话框的&#8220;Ok&#8221;或&#8220;Apply&#8221;按钮。pvParam参数必须指向Bool类型变量，如果该特征被允许，则该变量接收到TRUE，否则为FALSE。<br>SPI_GETSOUNDSENTRY：检索与SOUNDSENTRY可访问特征有关的信息。参数pvParam必须指向SOUNDSENTRY结构以接收信息。该结构中的。cbSize或员和ulParam参数的值要设为sizeof（SOUNDSENTRY）。<br>SPI_GETSTICKYKEYS：检索与StickyKeys易用特征有关的信息。参数 pvParam必须指向STICKYKEYS结构以获取信息。该结构中的cbSze成员及ulParam参数的值须设为sizeof（STICKYKEYS）。<br>SPI_GETSWITCHTASKDISABLE：用于Windows NT 5.0、Windows 95及以后版本，确定是否允许Alt＋Tab和AIt＋Esc任务切换。参数pvParam必须指向UINT类型变量，如果禁止任务切换，那么返回值为1，否则为0。在缺省情况下，是允许进行任务切换的。<br>SPI_GETTOGGLEKEYS：检索与ToggleKeys易用特性有关的信息。参数pvParam必须指向TOGGLEKEYS结构以获取信息。该结构中的cbSize成员和ulParam参数值要设置sizeof（TOGGLEKEYS）。<br>SPI_GETWHEELSCROLLLINES：用于Windows NT 4.0及以后版本、Windows 98。当前轨迹球转动时，获取滚动的行数。参数pvParam必须指向UINT类型变量以接收行数。缺省值是3。<br>SPI_GETWINDOWSEXTENSION：在Windows 95中指示系统中是否装了Windows Extension和Windows Plus！。<br>参数ulParam应设为1。而参数pvParam则不用。如果安装了Windows Extenson，那么该函数返回TRUE，否则为FALSE。<br>SPI_GETWORKAREA：检索主显示器的工作区大小。工作区是指屏幕上不被系统任务条或应用程序桌面工具遮盖的部分。参数pvParam必须指向RECT结构以接收工作区的坐标信息，坐标是用虚拟屏幕坐标来表示的。为了获取非主显示器的工作区信息，请调用GetMonitorlnfo函数。参数ulParam指定宽度，单位是像素。<br>SPI_ICONVERTICALSPACING：设置图标单元的高度。参数ulParam指定高度，单位是像素。<br>SPI_LANGDRIVER：未实现。<br>SPI_SCREENSAVERRUNNING：改名为SPI_SETSCREENSAVERRUNNING。<br>Spl_SETACCESSTIMEOUT：设置与可访问特性有关的时间限度值，参数 pvParam必须指向包含新参数的ACCESSTIMEOUT结构，该结构的cbSize成员与ulParam参数的值要设为sizeof（ACCESSTMEOUT）。<br>SPI_SETACTIVEWINDOWTRACKING：用于Windows NT 5.0及以后版本、Windows 98。设置活动窗口追踪的开或关，如果把参数pvParam设为TRUE，则表示开。pvParam参数为FALSE时表示关。<br>SPI_SETACTIVEWNDTRKZORDER：用于Windows NT 5.0及以后版本、Windows 98。表示是否把通过活动窗口跟踪而激活的窗口推至顶层。参数pvParam设为TRUE表示推至顶层，FALSE则表示不推至顶层。<br>SPI_SETACTIVEWNDTRKTIMEOUT：用于Wlindows NT 5.0及以后版本、Windows 98。设置活动窗口跟踪延迟。<br>参数pvParam设置在用鼠标指针激活窗口前需延迟的时间量，单位为毫秒。<br>SPI_SETBEEP：将警蜂器打开或关闭。参数ulParam指定为TRUE时表示打开，为FALSE时表示关闭。<br>SPI_SETBORDER：设置确定窗口缩放边界的边界放大因子。参数ulParam用来指定该值。<br>SPI_SETCOMBOBOXANIMATION：用于Windows NT 5.0及以后版本和Windows 98。允许或禁止组合滑动打开效果。如果设置pvParam参数为TRUE，则表示允许有倾斜效果，如果设为FALSE则表示禁止。<br>SPI_SETCURSORS：重置系统光标。将ulParam参数设为0并且pvParam参数设为NULL。<br>SPI_SETDEFAULTINPUTLANG：为系统Shell（命令行解器）和应用程序设置缺省的输入语言。指定的语言必须是可使用当前系统字符集来显示的。pvParam参数必须指向DWORD变量，该变量包含用于缺省语言的键盘布局句柄。<br>SpI_SETDESKpATTERN：通过使Windows系统从WIN.INI文件中pattern=设置项来设置当前桌面模式。<br>SPI_SETDESKWALLPAPER：设置桌面壁。pvParam参数必须指向一个包含位图文件名，并且以NULL（空）结束的字符串。<br>SPI_SETDOUBLECLICKTIME：设ulParam参数的值为目标双击时间。双击时间是指双击中的第1次和第2次点击之间的最大时间，单位为毫秒。也可以使用SetDoubleClickTime函数来设置双击时间。为获取当前双击时间，请调用GetDoubleClickTime函数。<br>SPI_SETDOUBLECLKHEGHT：将ulParam参数的值设为双击矩形区域的高度。双击矩形区域是指双击中的第2次点击时鼠标指针必须落在的区域，这样才能记录为双击。<br>SPI_SETDOUBLECLKWIDTH：将ulParam参数的值设为双击矩形区域的宽度。<br>SPI_SETDRAGFULLWINDOWS：设置是否允许拖至最大窗口。参数uIParam指定为TRUE时表示为允许，为FALSE则不可。对于Windows 95，该标志只有在安装了Windows plusl才支持。<br>SPI_SETDRAGHEIGHT：设置用于检测拖拉操作起点的矩形区域的高度，单位为像素。参考GETSYSTEMMETRICS函数的nlndex参数中的SM_CXDRAG和SM_CYDRAG。<br>SPI_SETDRAGWIDTH：设置用于检测拖拉操作起点的矩形区域的宽度，单位为像素。<br>SPI_SETFASTTASKSWITCH：该标志己不再使用。以前版本的系统使用此标志来允许或不许进行Alt＋Tab快速任务切换。对于Windows 95、Windows 98和Windows NT 4.0，通常都允许进行快速任务切换。参考SPI_SETSWITCHTASKDISABLE。<br>SPI_SETFILTERKEYS：设置FilterKeys易用特性的参数。参数pvParam必须指向包含新参数的FILTERKEYS结构，该结构中的cbSize成员和参数ulParam的值应设为sizeof（FILTERKEYS）。<br>SPI_SETFONTSMOOTHING：允许或禁止有字体平滑特性。该特性使用字体保真技术，通过在不同灰度级上涂画像素点来使得字体曲线显得更加平滑，为了允许有该特性，参数ulParam应设为TRUE值，否则为FALSE。对于Windows 95，只有在安装了Windows plusl才支持该标志。<br>SPI_SETFOREGROUNDFLASHCOUNT：用于Windows 98和Windows NT 5.0及以后版本。设置SetForegroundWindow在拒绝前台切换申请时闪烁任务拦按钮的次数。<br>SPI_SETFOREGROUNDLOCKTIMEOUT：用于Windows 98和Windows NT 5.0及以后版本。它用来设置在用户输入之后，系统禁止应用程序强行将自己进入前台期间的时间长度，单位为毫秒。参数pvParam设置这个新的时间限度值。<br>SPI_SETGRADIENTCAPTIONS：用于Windows 98和Windows NT 5.0及以后版本。允许或禁止窗口标题栏有倾斜效果。如果允许则将参数pvParam设置为TRUE，否则设为FALSE。有关倾斜效果方面更多信息，请参考GetSysColor函数。<br>SPI_SETGRIDGRANULARITY：将桌面缩放时网格的颗粒度值设置为参数ulParam中的值。<br>SPI_SETHANDHELD：内部使用，应用程序不应使用该值。<br>SPI_SETHIGHCONTRAST：用于Windows 95及以后版本、Windows NT 5.0及以后版本。设置HighContrast可访问特性的参数。参数pvParam必须指向HIGHCONTRAST结构，该结构包含新的参数。该结构中的cbSize成员及参数ulParam的值设为sizeof（HIGHCONTRAST）。<br>SPI_SETICONMETRICS：设置与图标有关的信息。参数pvParam必须指向包含新参数的ICONMETRICS结构，另外还要将参数ulParam和该结构中的cbSize成员的值设置为sizeof（ICONMETRICS）。<br>SPI_SETICONS：重新加载系统图标。参数ulParam的值应设为0，而pvParam参数应设为NULL。<br>SPI_SETICONTITLELOGFONT：设置用于图标标题的字体。参数ulParam指定为logfont结构的大小，而参数pvParam必须指向一个LOGFONT结构。<br>SPI_SETICONTITLEWRAP：打开或关闭图标标题折行功能。若想打开折行功能，则把参数ulParam设为TRUE，否则为FALSE。<br>SPI_SETKEYBOARDDELAY：设置键盘重复延迟。参数ulParam必须指定为0，1，2或3。其中0表示设置为最短延迟（大约 250ms）3，表示最大延迟（大约 1 秒）。与每个值对应的实际的延迟时间根据硬件情况有可能有些变化。<br>SPI_SETKEYBOARDPREF：用于Windows 95及以后版本、Windows NT 5.0及以后版本，设置键盘优先序。如果用户依赖键盘而不是鼠标，那么可将参数ulParam指定为TRUE，否则设为FALSE，并且要求应用程序显示而不隐蔽键盘接口。<br>SPI_SETKEYBOARDSPEED：设置键盘重击键速度。参数ulParam必须指定一个从0到31的值，其中0表示设置成最快速度（大约30次/秒），31表示设置为最低速度（大约2。5次/秒），实际的重速率与硬件有关，而且可能变动幅度高达20％。如果ulParam大于31，那么该参数仍设置为31。<br>SPI_SETLANGTOGGLE：为输入语言间切换设置热键集。参数ulParam和pvParam不用。该值通过读取注册表来设置键盘属性表单中的快捷键。在使用该标志之前必须设置注册表，注册表中的路径是&#8220;1&#8221;=Alt＋shift，&#8221;2&#8221;=Ctrl+shift，&#8221;3&#8221;=none（无）。<br>SPI_SETLISTBOXSMOOTHSCROLLING：用于Windows 98和Windows NT 5.0及以后版本。允许或不许列表栏有平滑滚动效果。参数pvParam设置为TRUE表示允许有平滑滚动效果，为FALSE则表示禁止。<br>SPI_SETLOWPOWERACTIVE：激活或关闭低电压屏幕保护特性。参数ulParam设为1表示激活，0表示关闭。参数pvParam必须设为NULL。对于Windows 98,该标志支持16位和32位应用程序。对于Windows 95，该标志只支持16位应用程序。对于Windows NT．该标志只支持NT 5.0及以后版本的32位应用程序，不支持16位应用程序。<br>SPI_SETLOWPOWERTIMEOUT：用于设置低电压屏幕保护中的时间值（也称超时值，即在超过某一时间段后自动进行屏幕保护），单位为秒。uIParam参数用来指定这个新值。参数pvParam必须为NULL。对于Windows98，该标志支持16位和32位应用程序。对于Windows 95，该标志只支持16位应用程序。对于Windows&nbsp;&nbsp;NT该标志只支持NT 5.0及以后版本的32位应用程序，不支持16位应用程序。<br>SPI_SETMENUDROPALIGNMENT：设置弹出或菜单的对齐方式。参数ulParam指定为TRUE时表示是右对齐，FALSE时为左对齐。<br>SPI_SETMINIMIZEDMETRICS：设置与最小化窗口有关的数据信息，参数pvParam必须指向包含新参数的MINIMIZEDMETRICS结构。该结构中的cbSize成员与ulParam参数的值应设为sizeof（MINMIZEDMETRICS）。<br>SPI_SETMOUSE：设置鼠标的两个阀值和加速率。参数pvParam必须指向一个长度为3的数组，以指定这些值。详细请参考mouse_event。<br>SPI_SETMOUSEBUTTONSWAP：调换或恢复鼠标左右按钮的含义，为FALSE时表示恢复原来的含义。<br>SPI_SETMOUSEHOVERHEGHT：用于Windows 98和Windows NT 4.0及以后版本。设置鼠标指针停留区域的高度，以像素为单位。鼠标指针在此区域停留是为了让TrackMouseEvent产生一条WM_MUOSEHOVER消息，参数ulParam用来设置此高度值。<br>SPI_SETMOUSEHOVERTIME：用于Windows&nbsp;&nbsp;98和Windows NT 4.0及以后版本。设置鼠标指针为了让TrackMouseEvent产生WM_MOUSEHOVER事件而在停留区域应停留的时间。该标志只有在将调用dwHoverTime参数中的HOVER_DEFAULT值传送到TrackMouseEvent时才使用。参数ulParam设置这个新的时间值。<br>SPI_SETMOUSEHOVERWIDTH：用于Windows 98和Windows NT 4.0及以后版本。设置鼠标指针停留区域的宽度，以像素为单位。参数ulParam设置该新值。<br>SPI_SETMOUSEKEYS：设置MouseKeys易用特性的参数。参数pvParam必须指向包含新参数的MOUSEKEYS结构。结构中的cbSize成员与参数ulParam的值应设为sizeof（MOUSEKEYS）。<br>SPI_SETMOUSESPEED：用于Windows NT 5.0及以后的版本和Windows 98，设置当前鼠标速度。参数pvParam必须指向一个1（最慢）至20（最快）之间的整数。缺省值是10。一般可以使用鼠标控制面板应用程序来设置该值。<br>SPI_SETMOUSETRAILS：用于Windows 95及以后版本：允许或禁止有MoouseTrails（鼠标轨迹）特性。该特性通过简短地显示鼠标光标轨迹，并迅速地擦除它们来提高鼠标的可见度。禁止该特性可将参数ulParam设为0或1，允许时,将ulParam设置为一个大于1的数值，该值表示轨迹中画出的光标个数。<br>SPI_SETNONCLIENTMETRICS：设置与非最小化窗口的非客区有关的数据信息，参数pvParam必须指向NONCLIENTMETRICS结构，该结构包含新的参数。其成员cbSzie和参数ulParam的值应设为sizeof（NONCLIENTMETRICS）。<br>SPI_SETPENWINDOWS；用于Windows 95及以后版本：指定是否加载笔窗口，当加载时，参数ulParam设为TRUE，不加载时为FALSE。参数pvParam为NULL。<br>SPI_SETPOWEROFFACTIVE：激活或关闭屏幕保护特性参数。ulParam设为1表示激活，0表示关闭。参数pvParam必须为NULL。对于Windows 98，该标志支持16位和32位应用程序。对于Windows 95，该标志只支持16位应用程序。对于Windows NT，该标志支持Windows NT 5.0及以后版本的32位应用程序，不支持16位应用程序。<br>SPI_SETPOWEROFFTIMEOUT：设置用于关闭屏幕保护所需的时间值（也称超时值）。参数ulParam指定该值。参数pvParam必须为NULL。对于Windows 98．该标志支持16位和32位应用程序。对于Windows 95，该标志只支持16位应用程序。对于Windows NT,该标志支持Windows NT 5.0及以后版本上的32位应用程序，不支持16位应用程序。<br>SPI_SETSCREENREADER；用于Windows 95及以后版本、Windows NT 5.0及以后版本，表示屏幕审阅程序是否运行。参数uiparm指定为TRUE表示运行该程序，FALSE则不运行。<br>SPI_SETSCREENSAVERRUNNING：用于Windows 95及以后版本，内部使用。应用程序不应该使用此标志SPI_SETSETSCREENSAVETIMEOUT：参数ulParam值为屏幕保护器时间限度值。该值是一个时间量，以秒为单位，在屏幕保护器激活之前，系统应该一直是空闲的，超过这个值就激活屏幕保护器。<br>SPI_SETSERIALKEYS：用于Windows 95及以后版本：设置SerialKeys易用特性的参数。参数pvParam必须指向包含新参数的SERIALKEYS结构，其成员cbSize和参数ulParam应设为sizeof（SERIALKEYS）。<br>SPI_SETSHOWSOUNDS：将ShowSounds易用特性设置为打开或关闭。参数ulParam指定为TRUE时表示打开，FALSE表示关闭。<br>SPI_SETSNAPTODEFBUTTON：用于Windows NT 4.0及以后版本、Windows 98。允许或禁止有snap-to-default-button（跳转至缺省按钮）特性。如果允许，那么鼠标光标会自动移至缺省按钮上，例如对话柜中的OK或&#8221;apply&#8221;按钮。参数ulParam设为TRUE表示允许该特性，FALSE表示禁止。<br>SPI_SETSOUNDSENTRY：设置SOUNDSENTRY易用特性的参数。参数pvParam必须指向SOUNDSENTRY结构，该结构包含新参数，其成员cbSize和参数ulParam的值应设为sizeof（SOUNDSENTRY）。<br>SPI_SETSTICKYKEYS：设置stickykeys可访问特性的参数。参数pvParam必须指向包含新参数的stickykeys结构，其成员cbSize和ulParam参数的值要设为sizeof（STICKYKEYS）。<br>SPI_SETSWITCHTASKDISABLE：用于Windows NT 5.0及以后版本，允许或禁止有Alt＋Tab和Alt＋Esc任务切换特性。参数ulParam设为1表示允许有该特性，设为0则表示禁止。缺省情况下是允许有任务切换特性的。<br>SPI_SETTOGGLEKEYS：设置togglekeys可访问特性的参数，参数PvParam必须指向TOGGLEKEYS结构，该结构中包含新的参数。其成员cbSize和参数ulParam的值要设为sizeof（togglekeys）。<br>SPI_SETWHEELSCROOLLLINES：用于Windows 98和Windows NT 4.O及以后版本。设置当鼠标轨迹球转动时<br>要滚动的行数，滚动的行数是由参数ulParam设置的，该行数是在鼠标轨迹球滚动，井且没有使用修改键时的滚动行数。如果该数值为0，那么不会发生滚动，如果滚动行数比可见到的行数要大，尤其如果是WHEEL_PAGESCROLL（＃defined sa UINT_MAX），那么滚动操作应该被解释成在滚动条的下一页或上一页区点击一次。<br>SPI_SETWORKAREA：设置工作区域大小。工作区是指屏幕上没有被系统任务栏或桌面应用程序桌面工具遮盖的部分。参数pvParam是一个指针。指向RECT结构，该结构规定新的矩形工作区域，它是以虚拟屏幕坐标来表达的。在多显示器系统中，该函数用来设置包含特定矩形的显示器工作区域。如果PvParam为NULL，那么该函数将主显示器的工作区域设为全屏。<br>ulParam：与查询或设置的系统参数有关。关于系统级参数的详情，请参考uiAction参数。否则在没有指明情况下，必须将该参数指定为O。<br>pvParam：与查询或设置的系统参数有关。关于系统级参数的详情，请参考uiAction参数。否则在没有指明情况下，必须将该参数指定为NULL。<br>fWinlni：如果设置系统参数，则它用来指定是否更新用户配置文件（Profile）。亦或是否要将WM_SETTINGCHANGE消息广播给所有顶层窗口，以通知它们新的变化内容。该参数可以是0或下列取值之一：<br>SPIF_UPDATEINIFILE：把新的系统参数的设置内容写入用户配置文件。<br>SPIF_SENDCHANGED：在更新用户配置文件之后广播WM_SETTINGCHANGE消息。<br>SPI_SENDWININICHANGE与 SPIF_SENDCHANGE一样。<br>返回值：如果函数调用成功，返回值非零：如果函数调用失败，那么返回值为零。若想获取更多错误信息，请调用GetLastError函数。<br>备注：该函数一般与应用程序，例如控制面板一起使用。它可以允许用户对Windows任意进行定制。<br>&nbsp;&nbsp;&nbsp;&nbsp;键盘布局名称是从对应于布局的16进制语言标识符引生而来的。例如，美国英语（U.S.Englisth）的语言标识符为&#8220; 0&#215;0409&#8221;，则主美国英语键盘布局命名为&#8220;00000409&#8221;其他的键盘布局如Dvotak等，命名为&#8221;00010409&#8221;、&#8221;00020409&#8221;等，关于此的列表参见MAKELANGID宏。<br>&nbsp;&nbsp;&nbsp;&nbsp;Windows CE操作系统只支持下列uiAction值：<br>SPI_GETBATTERYIDLETIMEOUT：在WINDOWS CE没有因用户操作而挂起之前，干电池电源能坚持给系统供电的时间量可以使用该标志得到。以秒为单位，如果pvParam为0，那么该标志被忽略。<br>SPI_GETEXTERNALIDLETIMEOUT：在 Windows CE没有因用户操作而挂起之前，交流电源能坚持给系统供电时间的时间量可以使用该标志得到。参数pvParam指向一个DWORD类型变量，以返回时间值，单位为秒。如果pvParam为0，那么该标志被忽略。<br>SPI_GETMOUSE：检索鼠标的两个阈值和速度。<br>SPI_GETOEMINFO：返回一个字符串，该字符串包含型号和制造商名称。参数ulParam指定为pvParam参数中缓冲区的长度，在成功返回时，参数pvParam中包含Unicode字符集中的字符串。<br>SPI_GETPLATFORMTYPE：返回一个指定Windows CE设备类型的字符串，例如&#8220;H/PC&#8221;。参数ulParam规定pvParam参数缓冲区的长度，后者在成功返回时包含一个Unicode字符集中的字符串。该字符串允许象 H/PC EXPLORER一样的应用程序来确定设备类型。<br>SPI_GETWAKEUPDLETIMEOUT：在用户通知重新激活某个挂起的设备之后，可获取的Windows CE延缓响应的时间量。参数pvParam指向一个DWORD类型变量以返回时间值，单位为秒。如果pvParam值为0那么该标志被忽略。<br>SPI_GETWORKAREA：检索工作区大小。工作区是指没有被任务遮盖的屏幕部分。<br>SPI_SETBATTERYidletimeout：在Windows CE没有因用户操作而挂起之前，电池电源能坚持给系统供电的时间量可以使用该标志来设置。只要键盘或触摸屏处在活动状态（有输入），那么Windows CE操作系统及电池电源仍将工作。参数ulParam指定要设置的时间，单位为秒。如果ulParam设置为0，那么该标志被忽略。<br>SPI_SETEXTERNALIDLETIMEOUT：在Windows CE没有因用户操作而挂起之前，交流电源能坚持给系统供电的时间量可以使用该标志来设置。只要键盘或触摸屏幕处在活动状态，那么Windows CE操作系统及AC电源仍将工作。参数ulParam指定要设置的时间，单位为秒。如果ulParam设为0，那么该标志被忽略。SPL_SETMOUSE：设置鼠标的两个阈值和速度。<br>SPI_SETWAKEUPIDLETIMEOUT：在用户通知重新激活某个挂起的设备之后，Windows CE延缓响应的时间长度量可使用该标志来设置。参数ulParam指定这个时间量，单位为秒，如果ulParam设置为0，那么该标志被忽略。<br>SPI_SETWORKAREA设置工作区大小，工作区是指没有被任务条遮盖的屏幕部分。如果用来获取平台类型或OEM信息串的pvParam缓冲区太小，那么该函数会调用失败，并出现错误值ERROR_INSUFFICENT_BUFFER。Windows CE只支持该函数的UNICODE版。Windows CE不支持参数fWinlni的取值为SPIF_SENDWININICHANGE的情形。<br>速查：Windows NT：3.1及以上版本；Window：95及以上版本；Windows CE：不支持；头文件：Winuser.h；库文件：user32.lib；Unicode：在Windows NT环境中实现为Unicode和ANSI两个版本。</font><br>
<img src ="http://www.cppblog.com/ally-zheng-2009/aggbug/108416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ally-zheng-2009/" target="_blank">ally-zheng</a> 2010-02-25 11:59 <a href="http://www.cppblog.com/ally-zheng-2009/articles/108416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>系统语言ID</title><link>http://www.cppblog.com/ally-zheng-2009/articles/98570.html</link><dc:creator>ally-zheng</dc:creator><author>ally-zheng</author><pubDate>Wed, 14 Oct 2009 05:56:00 GMT</pubDate><guid>http://www.cppblog.com/ally-zheng-2009/articles/98570.html</guid><wfw:comment>http://www.cppblog.com/ally-zheng-2009/comments/98570.html</wfw:comment><comments>http://www.cppblog.com/ally-zheng-2009/articles/98570.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ally-zheng-2009/comments/commentRss/98570.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ally-zheng-2009/services/trackbacks/98570.html</trackback:ping><description><![CDATA[<h3><a name=_win32_table_of_language_identifiers></a>Table of Language Identifiers</h3>
<p>The following are language identifiers. They are composed of a <a href="ms-help://MS.VSCC/MS.MSDNVS/intl/nls_61df.htm"><u><font color=#0000ff>primary language identifier</font></u></a> and a <a href="ms-help://MS.VSCC/MS.MSDNVS/intl/nls_19ir.htm"><u><font color=#0000ff>sublanguage identifier</font></u></a>. </p>
<p>The following identifiers were composed using the <a href="ms-help://MS.VSCC/MS.MSDNVS/intl/nls_97vo.htm"><strong><u><font color=#0000ff>MAKELANGID</font></u></strong></a> macro. </p>
<table>
    <tbody>
        <tr vAlign=top>
            <th align=left width="14%">Identifier</th>
            <th align=left width="86%">Language</th>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0000</td>
            <td width="86%">Language Neutral</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x007f</td>
            <td width="86%">The language for the invariant locale (LOCALE_INVARIANT). See <a href="ms-help://MS.VSCC/MS.MSDNVS/intl/nls_7qck.htm"><u><font color=#0000ff>MAKELCID</font></u></a>.</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0400</td>
            <td width="86%">Process or User Default Language</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0800</td>
            <td width="86%">System Default Language</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0436</td>
            <td width="86%">Afrikaans</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x041c</td>
            <td width="86%">Albanian</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0401</td>
            <td width="86%">Arabic (Saudi Arabia)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0801</td>
            <td width="86%">Arabic (Iraq)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0c01</td>
            <td width="86%">Arabic (Egypt)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x1001</td>
            <td width="86%">Arabic (Libya)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x1401</td>
            <td width="86%">Arabic (Algeria)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x1801</td>
            <td width="86%">Arabic (Morocco)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x1c01</td>
            <td width="86%">Arabic (Tunisia)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x2001</td>
            <td width="86%">Arabic (Oman)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x2401</td>
            <td width="86%">Arabic (Yemen)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x2801</td>
            <td width="86%">Arabic (Syria)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x2c01</td>
            <td width="86%">Arabic (Jordan)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x3001</td>
            <td width="86%">Arabic (Lebanon)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x3401</td>
            <td width="86%">Arabic (Kuwait)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x3801</td>
            <td width="86%">Arabic (U.A.E.)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x3c01</td>
            <td width="86%">Arabic (Bahrain)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x4001</td>
            <td width="86%">Arabic (Qatar)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x042b</td>
            <td width="86%"><strong>Windows 2000/XP: </strong>Armenian. This is Unicode only.</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x042c</td>
            <td width="86%">Azeri (Latin)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x082c</td>
            <td width="86%">Azeri (Cyrillic)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x042d</td>
            <td width="86%">Basque</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0423</td>
            <td width="86%">Belarusian</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0402</td>
            <td width="86%">Bulgarian</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0455</td>
            <td width="86%">Burmese</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0403</td>
            <td width="86%">Catalan</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0404</td>
            <td width="86%">Chinese (Taiwan)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0804</td>
            <td width="86%">Chinese (PRC)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0c04</td>
            <td width="86%">Chinese (Hong Kong SAR, PRC)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x1004</td>
            <td width="86%">Chinese (Singapore)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x1404</td>
            <td width="86%"><strong>Windows 98/Me, Windows 2000/XP:</strong> Chinese (Macau SAR)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x041a</td>
            <td width="86%">Croatian</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0405</td>
            <td width="86%">Czech</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0406</td>
            <td width="86%">Danish</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0465</td>
            <td width="86%"><strong>Windows XP:</strong> Divehi. This is Unicode only.</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0413</td>
            <td width="86%">Dutch (Netherlands)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0813</td>
            <td width="86%">Dutch (Belgium)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0409</td>
            <td width="86%">English (United States)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0809</td>
            <td width="86%">English (United Kingdom)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0c09</td>
            <td width="86%">English (Australian)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x1009</td>
            <td width="86%">English (Canadian)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x1409</td>
            <td width="86%">English (New Zealand)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x1809</td>
            <td width="86%">English (Ireland)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x1c09</td>
            <td width="86%">English (South Africa)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x2009</td>
            <td width="86%">English (Jamaica)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x2409</td>
            <td width="86%">English (Caribbean)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x2809</td>
            <td width="86%">English (Belize)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x2c09</td>
            <td width="86%">English (Trinidad)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x3009</td>
            <td width="86%"><strong>Windows 98/Me, Windows 2000/XP:</strong> English (Zimbabwe)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x3409</td>
            <td width="86%"><strong>Windows 98/Me, Windows 2000/XP:</strong> English (Philippines)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0425</td>
            <td width="86%">Estonian</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0438</td>
            <td width="86%">Faeroese</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0429</td>
            <td width="86%">Farsi</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x040b</td>
            <td width="86%">Finnish</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x040c</td>
            <td width="86%">French (Standard)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x080c</td>
            <td width="86%">French (Belgian)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0c0c</td>
            <td width="86%">French (Canadian)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x100c</td>
            <td width="86%">French (Switzerland)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x140c</td>
            <td width="86%">French (Luxembourg)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x180c</td>
            <td width="86%"><strong>Windows 98/Me, Windows 2000/XP:</strong> French (Monaco)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0456</td>
            <td width="86%"><strong>Windows XP: </strong>Galician</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0437</td>
            <td width="86%"><strong>Windows 2000/XP: </strong>Georgian. This is Unicode only.</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0407</td>
            <td width="86%">German (Standard)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0807</td>
            <td width="86%">German (Switzerland)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0c07</td>
            <td width="86%">German (Austria)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x1007</td>
            <td width="86%">German (Luxembourg)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x1407</td>
            <td width="86%">German (Liechtenstein)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0408</td>
            <td width="86%">Greek</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0447</td>
            <td width="86%"><strong>Windows XP: </strong>Gujarati. This is Unicode only.</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x040d</td>
            <td width="86%">Hebrew</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0439</td>
            <td width="86%"><strong>Windows 2000/XP: </strong>Hindi. This is Unicode only.</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x040e</td>
            <td width="86%">Hungarian</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x040f</td>
            <td width="86%">Icelandic</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0421</td>
            <td width="86%">Indonesian</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0410</td>
            <td width="86%">Italian (Standard)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0810</td>
            <td width="86%">Italian (Switzerland)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0411</td>
            <td width="86%">Japanese</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x044b</td>
            <td width="86%"><strong>Windows XP: </strong>Kannada. This is Unicode only.</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0457</td>
            <td width="86%"><strong>Windows 2000/XP: </strong>Konkani. This is Unicode only.</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0412</td>
            <td width="86%">Korean</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0812</td>
            <td width="86%"><strong>Windows 95, Windows NT 4.0 only:</strong> Korean (Johab)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0440</td>
            <td width="86%"><strong>Windows XP: </strong>Kyrgyz.</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0426</td>
            <td width="86%">Latvian</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0427</td>
            <td width="86%">Lithuanian</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0827</td>
            <td width="86%"><strong>Windows 98 only:</strong> Lithuanian (Classic)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x042f</td>
            <td width="86%">FYRO Macedonian</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x043e</td>
            <td width="86%">Malay (Malaysian)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x083e</td>
            <td width="86%">Malay (Brunei Darussalam)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x044e</td>
            <td width="86%"><strong>Windows 2000/XP: </strong>Marathi. This is Unicode only.</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0450</td>
            <td width="86%"><strong>Windows XP: </strong>Mongolian</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0414</td>
            <td width="86%">Norwegian (Bokmal)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0814</td>
            <td width="86%">Norwegian (Nynorsk)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0415</td>
            <td width="86%">Polish</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0416</td>
            <td width="86%">Portuguese (Brazil)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0816</td>
            <td width="86%">Portuguese (Portugal)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0446</td>
            <td width="86%"><strong>Windows XP: </strong>Punjabi. This is Unicode only.</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0418</td>
            <td width="86%">Romanian</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0419</td>
            <td width="86%">Russian</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x044f</td>
            <td width="86%"><strong>Windows 2000/XP: </strong>Sanskrit. This is Unicode only.</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0c1a</td>
            <td width="86%">Serbian (Cyrillic)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x081a</td>
            <td width="86%">Serbian (Latin)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x041b</td>
            <td width="86%">Slovak</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0424</td>
            <td width="86%">Slovenian</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x040a</td>
            <td width="86%">Spanish (Spain, Traditional Sort)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x080a</td>
            <td width="86%">Spanish (Mexican)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0c0a</td>
            <td width="86%">Spanish (Spain, International Sort)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x100a</td>
            <td width="86%">Spanish (Guatemala)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x140a</td>
            <td width="86%">Spanish (Costa Rica)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x180a</td>
            <td width="86%">Spanish (Panama)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x1c0a</td>
            <td width="86%">Spanish (Dominican Republic)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x200a</td>
            <td width="86%">Spanish (Venezuela)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x240a</td>
            <td width="86%">Spanish (Colombia)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x280a</td>
            <td width="86%">Spanish (Peru)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x2c0a</td>
            <td width="86%">Spanish (Argentina)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x300a</td>
            <td width="86%">Spanish (Ecuador)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x340a</td>
            <td width="86%">Spanish (Chile)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x380a</td>
            <td width="86%">Spanish (Uruguay)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x3c0a</td>
            <td width="86%">Spanish (Paraguay)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x400a</td>
            <td width="86%">Spanish (Bolivia)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x440a</td>
            <td width="86%">Spanish (El Salvador)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x480a</td>
            <td width="86%">Spanish (Honduras)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x4c0a</td>
            <td width="86%">Spanish (Nicaragua)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x500a</td>
            <td width="86%">Spanish (Puerto Rico)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0430</td>
            <td width="86%">Sutu</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0441</td>
            <td width="86%">Swahili (Kenya)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x041d</td>
            <td width="86%">Swedish</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x081d</td>
            <td width="86%">Swedish (Finland)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x045a</td>
            <td width="86%"><strong>Windows XP:</strong> Syriac. This is Unicode only.</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0449</td>
            <td width="86%"><strong>Windows 2000/XP: </strong>Tamil. This is Unicode only.</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0444</td>
            <td width="86%">Tatar (Tatarstan)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x044a</td>
            <td width="86%"><strong>Windows XP: </strong>Telugu. This is Unicode only.</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x041e</td>
            <td width="86%">Thai</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x041f</td>
            <td width="86%">Turkish</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0422</td>
            <td width="86%">Ukrainian</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0420</td>
            <td width="86%"><strong>Windows 98/Me, Windows 2000/XP:</strong> Urdu (Pakistan)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0820</td>
            <td width="86%">Urdu (India)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0443</td>
            <td width="86%">Uzbek (Latin)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x0843</td>
            <td width="86%">Uzbek (Cyrillic)</td>
        </tr>
        <tr vAlign=top>
            <td width="14%">0x042a</td>
            <td width="86%"><strong>Windows 98/Me, Windows NT 4.0 and later:</strong> Vietnamese</td>
        </tr>
    </tbody>
</table>
<br>
<p>The following three combinations of <em>usPrimaryLanguage</em> and <em>usSubLanguage</em> have special meaning. </p>
<table>
    <tbody>
        <tr vAlign=top>
            <th align=left width="28%">Primary language identifier</th>
            <th align=left width="36%">Sublanguage identifier</th>
            <th align=left width="36%">Meaning</th>
        </tr>
        <tr vAlign=top>
            <td width="28%">LANG_NEUTRAL</td>
            <td width="36%">SUBLANG_NEUTRAL</td>
            <td width="36%">Language neutral </td>
        </tr>
        <tr vAlign=top>
            <td width="28%">LANG_NEUTRAL</td>
            <td width="36%">SUBLANG_DEFAULT</td>
            <td width="36%">User default language </td>
        </tr>
        <tr vAlign=top>
            <td width="28%">LANG_NEUTRAL</td>
            <td width="36%">SUBLANG_SYS_DEFAULT</td>
            <td width="36%">System default language </td>
        </tr>
    </tbody>
</table>
<br><!-- Info Task Footer -->
<img src ="http://www.cppblog.com/ally-zheng-2009/aggbug/98570.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ally-zheng-2009/" target="_blank">ally-zheng</a> 2009-10-14 13:56 <a href="http://www.cppblog.com/ally-zheng-2009/articles/98570.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自绘按钮的实现</title><link>http://www.cppblog.com/ally-zheng-2009/articles/98487.html</link><dc:creator>ally-zheng</dc:creator><author>ally-zheng</author><pubDate>Tue, 13 Oct 2009 08:23:00 GMT</pubDate><guid>http://www.cppblog.com/ally-zheng-2009/articles/98487.html</guid><wfw:comment>http://www.cppblog.com/ally-zheng-2009/comments/98487.html</wfw:comment><comments>http://www.cppblog.com/ally-zheng-2009/articles/98487.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ally-zheng-2009/comments/commentRss/98487.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ally-zheng-2009/services/trackbacks/98487.html</trackback:ping><description><![CDATA[<p align=center><strong>自绘按钮的实现</strong><br>作者:<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#117;&#120;&#105;&#117;&#120;&#105;&#110;&#103;&#64;&#49;&#54;&#51;&#46;&#110;&#101;&#116;">杜修杏</a></p>
<p><a href="http://www.vckbase.com/code/downcode.asp?id=1793">下载本文示例工程</a><br><br>如果你希望能够在自己的程序中表现出新意，那么你一定不会仅仅满足于MFC提供那些标准控件。这时，我们就必须自己另外多做些工作了。就改变控件外观这一点来说，主要是利用控件的自绘功能（Owner Draw）实现的。本篇将和各位一起定义一个XP风格的CXPButton按钮类，目的不在于介绍CXPButton类的使用技巧，而在于向各位阐述实现自绘按钮的方法。当然如果你觉得CXPButton有用的话，也可以把它的源文件保存下来，直接加入到自己的项目中。<br><br>本篇要点：<br><a href="http://www.vckbase.com/document/viewdoc/?id=551#D1">一、准备工作</a><br><a href="http://www.vckbase.com/document/viewdoc/?id=551#D2">二、实现原理及难点</a><br><a href="http://www.vckbase.com/document/viewdoc/?id=551#D3">三、按钮类的使用</a><br><a href="http://www.vckbase.com/document/viewdoc/?id=551#D4">四、小结与提示</a><br><a href="http://www.vckbase.com/document/viewdoc/?id=551#D5">五、附录</a><br><br><strong><font color=#ff6600><a id=D1 name=D1></a></font><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 一、准备工作</strong><br><br>在开始编码之前，首先应该确定好，更准确的说应该是设计好按钮在各种状态下的外观。按钮控件的几中基本状态包括：<br>Normal状态，就是按钮一开始显示时的样子。<br>Over状态，鼠标指针移动到按钮上面时按钮显示的样子。<br>Down状态，按下按钮时显示的样子。<br>Focus状态，按钮按下后松开的样子，例如标准按钮按下松开之后会看到按钮内部有一个虚线框。<br>Disable状态，当然就是按钮被设置成无效的时候的样子啦。</p>
<p>我参考了一下WindowsXP中普通按钮的实际样子，设计出XP按钮各种状态的外观，如下图所示：</p>
<p><img height=206 src="http://www.vckbase.com/document/journal/vckbase18/images/XPButtonDemo1.gif" width=454><br>至于Down状态主要是在Over状态的基础上将文字往右下的方向稍微平移，以实现下压的效果。<br><br><strong><font color=#ff6600><a id=D2 name=D2></a></font><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 二、实现原理及难点</strong></p>
<p>下面我们开始类的创建，在Workspace的ClassView页中右击列表树的根结点，选择New Class&#8230;</p>
<p><img height=275 src="http://www.vckbase.com/document/journal/vckbase18/images/XPButtonDemo2.gif" width=339> <br><br>在弹出窗口中进行派生类的定义，如下图所示，注意，你需要填写的只有Name和Base class两项，其余的选项保持默认值就可以了。<br><br><img height=311 src="http://www.vckbase.com/document/journal/vckbase18/images/XPButtonDemo3.gif" width=409> <br><br>按OK按钮退出之后，我们可以在ClassView里面看到新创建的类的名字。接下来我们可以为CXPButton类添加各种成员变量。因为自绘控件说穿了就是画图，所以在成员变量中可以看到各种与画图有关的数据类型，一般来说成员变量会在类的构造函数中初始化，在类的析构函数中销毁。详细代码请参见本篇附带的源程序。<br>下面简要叙述一下按钮的实现原理：</p>
<p>1. 在控件初始化时为按钮添加Owner Draw的属性。这是因为在MFC中，要想激活控件的自绘功能，要求该控件的属性中必须包含属性值BS_OWNERDRAW，这一步我们可以通过类向导为CXPButton类添加PreSubclassWindow()函数，在该函数中完成属性值的设置。当激活控件的自绘功能之后，每次控件状态改变的时候都会运行函数DrawItem()，该函数的作用就是绘制控件在各种状态下的外观。</p>
<p>2. 添加WM_MOUSELEAVE消息函数，当鼠标指针离开按钮时，触发该消息函数，我们在函数中添加代码，通知DrawItem函数鼠标指针已经离开了，让按钮重绘。</p>
<p>3. 添加WM_MOUSEHOVER消息函数，当鼠标指针位于按钮之上时，触发该消息函数，我们在函数重添加代码，通知DrawItem函数鼠标指针现在正在按钮的上面，让按钮重绘。</p>
<p>4. 添加DrawItem函数。在DrawItem中根据按钮当前的状态绘制按钮的外观。可以说自绘控件的大部分功能都是在这个函数中实现的。DrawItem函数包含了一个LPDRAWITEMSTRUCT的指针，本篇会在稍后予以讲解。</p>
<p>&#160;</p>
<p>了解了基本的设计思路之后，剩下就看我们怎么去实现了。我本人觉得这里有两个难点，首先是WM_MOUSELEAVE和WM_MOUSEHOVER不是标准的Windows消息函数，它们不能通过类向导来添加，所有的添加工作都需要通过手工输入代码来完成。另一个难点是DrawItem中的LPDRAWITEMSTRUCT指针，它指向了一个DRAWITEMSTRUCT的结构，这个结构中包含了控件的各种细节，为我们提供了实现自绘功能的必要信息。</p>
<p><strong>难点一：</strong><br>事实上WM_MOUSELEAVE和WM_MOUSEHOVER两个Windows消息是通过WM_MOUSEMOVE消息触发的，而WM_MOUSEMOVE是标准的Windows消息，因此我们可以通过类向导来为CXPButton类添加WM_MOUSEMOVE消息函数。<br><img height=348 src="http://www.vckbase.com/document/journal/vckbase18/images/XPButtonDemo4.gif" width=586> <br><br>函数的代码见如下，这段代码非常有用，在其它的自绘控件中，如果想触发WM_MOUSELEAVE和WM_MOUSEHOVER消息，也是使用类似的方法实现的。<br></p>
<pre>void CXPButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (!m_bTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 1;
m_bTracking = _TrackMouseEvent(&amp;tme);
}
CButton::OnMouseMove(nFlags, point);
}</pre>
我们接着添加WM_MOUSELEAVE和WM_MOUSEHOVER消息消息函数。在CXPButton类的声明中（即在XPButton.h文件中）找到afx_msg void OnMouseMove(UINT nFlags, CPoint point);的函数声明，紧接其下输入
<pre>afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
</pre>
然后在XPButton.cpp文件中找到ON_WM_MOUSEMOVE()，紧接其后输入
<pre>ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
</pre>
当然最后还有函数的实现了，详细代码可见本篇提供的源程序，这里就不再重复了。<br><br><strong>难点二：</strong><br>下面我们看看DRAWITEMSTRUCE结构为我们提供了哪些有用信息呢？<br>DRAWITEMSTRUCT结构的定义如下：
<pre>typedef struct tagDRAWITEMSTRUCT {
UINT   CtlType;                       //控件类型
UINT   CtlID;                          //控件ID
UINT   itemID;                        //菜单项、列表框或组合框中某一项的索引值
UINT   itemAction;                   //控件行为
UINT   itemState;                     //控件状态
HWND   hwndItem;                 //父窗口句柄或菜单句柄
HDC    hDC;                           //控件对应的绘图设备句柄
RECT   rcItem;                        //控件所占据的矩形区域
DWORD  itemData;                  //列表框或组合框中某一项的值
} DRAWITEMSTRUCT, *PDRAWITEMSTRUCT, *LPDRAWITEMSTRUCT;</pre>
其实不仅是按钮控件，其它控件，如ComboBox、ListBox、StaticText等都是通过DRAWITEMSTRUCT来记录控件信息的。关于这个结构的详细文档可参考本篇的附录。 <br><br>也许你早已看到许多自绘按钮的例子，实际上自绘按钮本身的函数结构都是差不多的，它们显示效果的区别主要取决于代码编写者对GDI作图函数的运用与掌握程度。有兴趣的朋友可以研究一下CXPButton类中DrawItem函数的数据结构，其实只要修改一下其中GDI绘图函数的部分代码，马上又能做出另一个自绘按钮控件了。 <br><br><strong><font color=#ff6600><a id=D3 name=D3></a></font><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 三、按钮类的使用</strong>
<p>下面演示CXPButton类的使用。往对话框中添加一个按钮控件，假设它的ID值为IDC_BUTTON1。进入类向导（Class Wizard）的Member Variables属性页，为IDC_BUTTON1添加一个变量m_btnNormal。确定退出后再进行编译，就可以看到重新定义过XP风格按钮了。<br></p>
<img height=429 src="http://www.vckbase.com/document/journal/vckbase18/images/XPButtonDemo5.gif" width=625><br><br>如果你是之间把CXPButton的源文件引入自己的工程中的，那么在上图的Variable type中是看不到CXPButton选项的。但是可以通过以下方法加入：
<p>1. 首先保存工程后退出。<br>2. 在工程的目录下找到一个后缀名为.clw的文件，将其删除。但是为了以防万一还是建议你实现备份一下。<br>3. 重新打开工程，进入类向导，此时会看到一下一个弹出对话框，我们选择&#8220;是（Yes）&#8221;。<br><br><img height=124 src="http://www.vckbase.com/document/journal/vckbase18/images/XPButtonDemo6.gif" width=489> <br><br>4. 再选择&#8220;Add All&#8221;，这样我们就可以在类向导中使用CXPButton的变量类型了。<br><br><strong><font color=#ff6600><a id=D4 name=D4></a></font><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 四、小结与提示</strong><br><br>对于按钮来说，当按钮上面任何可见的部分发生变换的时候，都要调用DrawItem函数进行重绘。自绘制按钮必须设定BS_OWNERDRAW的属性，设置的代码在PreSubclassWindows函数中完成。另外为了防止系统字体设置的变化影响控件的表达效果，还可以在该函数中为控件指定某种固定的字体。但是要注意的是这个<br>让我们来回顾一下实现自绘按钮的基本步骤：<br>a. 确定设计方案；<br>b. 初始化，但是记得要在函数退出前恢复先前的GDI对象，并释放所占领的资源；<br>c. 添加相应消息函数；<br>d. 添加绘图函数DrawItem，在DrawItem中作图的顺序一般是先画外边框，再上底色，接着写文字，最后是画内边框。不过有些人也喜欢把边框放到最后画，这问题不大。<br><br><strong><font color=#ff6600><a id=D5 name=D5></a></font><img height=16 src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 五、附录</strong></p>
<p><strong>DRAWITEMSTRUCT结构文档</strong>（根据Msdn翻译）<br><br><strong>DRAWITEMSTRUCT</strong></p>
<p>DRAWITEMSTRUCT 为需要自绘的控件或者菜单项提供了必要的信息。在需要绘制的控件或者菜单项对应的WM_DRAWITEM消息函数中得到一个指向该结构的指针。 DRAWITEMSTRUCT结构的定义如下：<br>typedef struct tagDRAWITEMSTRUCT {<br>UINT <a href="http://www.vckbase.com/document/viewdoc/?id=551#DIS1">CtlType</a>; <br>UINT <a href="http://www.vckbase.com/document/viewdoc/?id=551#DIS2">CtlID</a>; <br>UINT <a href="http://www.vckbase.com/document/viewdoc/?id=551#DIS3">itemID</a>; <br>UINT <a href="http://www.vckbase.com/document/viewdoc/?id=551#DIS4">itemAction</a>; <br>UINT <a href="http://www.vckbase.com/document/viewdoc/?id=551#DIS5">itemState</a>; <br>HWND <a href="http://www.vckbase.com/document/viewdoc/?id=551#DIS6">hwndItem</a>; <br>HDC <a href="http://www.vckbase.com/document/viewdoc/?id=551#DIS7">hDC</a>; <br>RECT <a href="http://www.vckbase.com/document/viewdoc/?id=551#DIS8">rcItem</a>; <br>ULONG_PTR <a href="http://www.vckbase.com/document/viewdoc/?id=551#DIS9">itemData</a>; <br>} DRAWITEMSTRUCT; </p>
<p>结构成员：</p>
<p><strong><font color=#ff6600><a name=DIS1></a>CtlType</font> </strong><br>指定了控件的类型，其取值如下表所示。 </p>
<p>取值<br>描述</p>
<p>ODT_BUTTON<br>按钮控件<br><br>ODT_COMBOBOX<br>组合框控件<br><br>ODT_LISTBOX<br>列表框控件<br><br>ODT_LISTVIEW<br>列表视图控件<br><br>ODT_MENU<br>菜单项<br><br>ODT_STATIC<br>静态文本控件<br><br>ODT_TAB<br>Tab控件<br><br><strong><font color=#ff6600><a id=DIS2 name=DIS2></a>CtlID </font></strong></p>
<p>指定了自绘控件的ID值，而对于菜单项则不需要使用该成员 </p>
<p><strong><font color=#ff6600><a id=DIS3 name=DIS3></a>itemID</font></strong> <br>表示菜单项ID，也可以表示列表框或者组合框中某项的索引值。对于一个空的列表框或组合框，该成员的值为&#8211;1。这时应用程序只绘制焦点矩形（该矩形的坐标由rcItem 成员给出）虽然此时控件中没有需要显示的项，但是绘制焦点矩形还是很有必要的，因为这样做能够提示用户该控件是否具有输入焦点。当然也可以设置itemAction 成员为合适值，使得无需绘制焦点。 </p>
<p><strong><font color=#ff6600><a id=DIS4 name=DIS4></a>itemAction </font></strong><br>指定绘制行为，其取值可以为下表中所示值的一个或者多个的联合。 </p>
<p>取值<br>描述<br><br>ODA_DRAWENTIRE<br>当整个控件都需要被绘制时，设置该值<br><br>ODA_FOCUS<br>如果控件需要在获得或失去焦点时被绘制，则设置该值。此时应该检查itemState成员，以确定控件是否具有输入焦点。<br><br>ODA_SELECT<br>如果控件需要在选中状态改变时被绘制，则设置该值。此时应该检查itemState 成员，以确定控件是否处于选中状态。<br></p>
<p><strong><font color=#ff6600><a id=DIS5 name=DIS5></a>itemState </font></strong><br>指定了当前绘制操作完成后，所绘项的可见状态。例如，如果菜单项应该被灰色显示，则可以指定ODS_GRAYED状态标志。其取值可以为下表中所示值的一个或者多个的联合。</p>
<p>取值<br>描述<br><br>ODS_CHECKED<br>如果菜单项将被选中，则可设置该值。该值只对菜单项有用。<br><br>ODS_COMBOBOXEDIT<br>在自绘组合框控件中只绘制选择区域。<br><br>ODS_DEFAULT<br>默认值。<br><br>ODS_DISABLED<br>如果控件将被禁止，则设置该值。<br><br>ODS_FOCUS<br>如果控件需要输入焦点，则设置该值。<br><br>ODS_GRAYED<br>如果控件需要被灰色显示，则设置该值。该值只在绘制菜单时使用。<br><br>ODS_HOTLIGHT<br>Windows 98/Me, Windows 2000/XP: 如果鼠标指针位于控件之上，则设置该值，这时控件会显示高亮颜色。<br><br>ODS_INACTIVE<br>Windows 98/Me, Windows 2000/XP: 表示没有激活的菜单项。<br><br>ODS_NOACCEL<br>Windows 2000/XP: 控件是否有快速键盘。<br><br>ODS_NOFOCUSRECT<br>Windows 2000/XP: 不绘制捕获焦点的效果。<br><br>ODS_SELECTED<br>选中的菜单项。<br><br><font color=#ff6600><strong><font color=#ff6600><a id=DIS6 name=DIS6></a></font>hwndItem </strong></font><br>指定了组合框、列表框和按钮等自绘控件的窗口句柄；如果自绘的对象时菜单项，则表示包含该菜单项的菜单句柄。 </p>
<p><font color=#ff6600><strong><font color=#ff6600><a id=DIS7 name=DIS7></a></font>hDC</strong> </font><br>指定了绘制操作所使用的设备环境。 </p>
<p><font color=#ff6600><strong><font color=#ff6600><a id=DIS8 name=DIS8></a></font>rcItem</strong></font> <br>指定了将被绘制的矩形区域。这个矩形区域就是上面hDC的作用范围。系统会自动裁剪组合框、列表框或按钮等控件的自绘制区域以外的部分。也就是说rcItem中的坐标点（0，0）指的就是控件的左上角。但是系统不裁剪菜单项，所以在绘制菜单项的时候，必须先通过一定的换算得到该菜单项的位置，以保证绘制操作在我们希望的区域中进行。 </p>
<p><font color=#ff6600><strong><font color=#ff6600><a id=DIS9 name=DIS9></a></font>itemData</strong></font> <br>对于菜单项，该成员的取值可以是由</p>
<p>CMenu::AppendMenu、<br>CMenu::InsertMenu或者<br>CMenu::ModifyMenu</p>
<p>等函数传递给菜单的值。 </p>
<p>对于列表框或这组合框，该成员的值可以为由</p>
<p>ComboBox::AddString、<br>CComboBox::InsertString、<br>CListBox::AddString或者<br>CListBox::InsertString</p>
<p>等传递给控件的值。</p>
<p>如果ctlType 的取值是ODT_BUTTON或者ODT_STATIC, itemData的取值为0。 </p>
<img src ="http://www.cppblog.com/ally-zheng-2009/aggbug/98487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ally-zheng-2009/" target="_blank">ally-zheng</a> 2009-10-13 16:23 <a href="http://www.cppblog.com/ally-zheng-2009/articles/98487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows常见窗口样式和控件风格</title><link>http://www.cppblog.com/ally-zheng-2009/articles/98486.html</link><dc:creator>ally-zheng</dc:creator><author>ally-zheng</author><pubDate>Tue, 13 Oct 2009 08:08:00 GMT</pubDate><guid>http://www.cppblog.com/ally-zheng-2009/articles/98486.html</guid><wfw:comment>http://www.cppblog.com/ally-zheng-2009/comments/98486.html</wfw:comment><comments>http://www.cppblog.com/ally-zheng-2009/articles/98486.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ally-zheng-2009/comments/commentRss/98486.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ally-zheng-2009/services/trackbacks/98486.html</trackback:ping><description><![CDATA[<p>Windows常见窗口样式和控件风格</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 王佰营 徐丽红</p>
<p><br>一、窗口样式</p>
<p>WS_POPUP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用)<br>WS_CHILDWINDOW&nbsp; 子窗口(不能与WS_POPUP合用)<br>WS_MINIMIZE&nbsp;&nbsp;&nbsp;&nbsp; 创建窗口拥有最小化按钮<br>WS_MINIMIZEBOX&nbsp; 创建窗口拥有最小化按钮，须同时指定WS_SYSTEM样式<br>WS_VISIBLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可见状态<br>WS_DISABLED&nbsp;&nbsp;&nbsp;&nbsp; 不可用状态<br>WS_CLIPSIBLINGS 使窗口排除子窗口之间的相对区域<br>WS_CLIPCHILDREN 当在父窗口内绘图时,排除子窗口区域<br>WS_MAXIMIZE&nbsp;&nbsp;&nbsp;&nbsp; 具有最大化按钮<br>WS_MAXIMIZEBOX&nbsp; 创建窗口拥有最大化按钮，须同时指定WS_SYSTEM样式<br>WS_CAPTION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有标题框和边框(和WS_TILED样式相同)<br>WS_BORDER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有单边框<br>WS_DLGFRAME&nbsp;&nbsp;&nbsp;&nbsp; 带对话框边框样式,不带标题框<br>WS_VSCROLL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有垂直滚动条<br>WS_HSCROLL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有水平滚动条<br>WS_SYSMENU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标题框上带有窗口菜单(须指定WS_CAPTION样式)<br>WS_THICKFRAME&nbsp;&nbsp; 有可调边框(与WS_SIZEBOX样式相同)<br>WS_TILED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与WS_OVERLAPPED风格相同<br>WS_TILEDWINDOW&nbsp; 与WWS_OVERLAPPEDWINDOW风格相同<br>WS_GROUP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 组样式,每个组的第一个控件具有WS_TABSTOP样式<br>WS_TABSTOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可接受TAB键<br>WS_OVERLAPPED&nbsp;&nbsp; 创建一个重叠式窗口,拥有标题栏和边框<br>WS_OVERLAPPEDWINDOW 即:WS_OVERLAPPED风格,WS_CAPTION风格,WS_SYSMENU风格<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WS_THICKFRAME风格,WS_MINIMIZEBOX风格和WS_MAXIMIZEBOX<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 风格的组合</p>
<p>/* 窗口扩展样式参考列表：<br>WS_EX_DLGMODALFRAME -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 带双层边框<br>WS_EX_NOPARENTNOTIFY -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建/销毁时不通知父窗口<br>WS_EX_TOPMOST -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 窗口置顶(停留在所有非最高层窗口的上面)<br>WS_EX_ACCEPTFILES -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可接受文件拖放<br>WS_EX_TRANSPARENT - =&amp;H20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 透明样式,在同属窗口已重画时该窗口才可重画<br>WS_EX_MDICHILD -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MDI子窗口样式<br>WS_EX_TOOLWINDOW -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 工具条窗口样式<br>WS_EX_WINDOWEDGE -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 带凸起边缘的边框<br>WS_EX_CLIENTEDGE -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 带阴影的边缘<br>WS_EX_CONTEXTHELP -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有上下文帮助样式,标题栏包含一个问号标志<br>WS_EX_RIGHT - 右对齐<br>WS_EX_RTLREADING -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 窗口文本从右到左显示<br>WS_EX_LEFTSCROLLBAR -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 垂直滚动条在窗口左边界<br>WS_EX_CONTROLPARENT -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 允许用户使用TAB键在窗口的子窗口间搜索<br>WS_EX_STATICEDGE -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当窗口为不可用状态时创建一个三维边缘<br>WS_EX_APPWINDOW -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当窗口可见时将一个顶层窗口放置在任务栏上<br>WS_EX_OVERLAPPEDWINDOW -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 带凸起边缘的边框,边缘有阴影<br>WS_EX_PALETTEWINDOW -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 带立体边框,有工具条窗口样式,窗口在顶层<br>WS_EX_LAYERED&nbsp; =&amp;H80000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分层或透明窗口,该样式可使用混合特效<br>WS_EX_NOINHERITLAYOUT - 子控件不继承窗体或控件的布局<br>WS_EX_LAYOUTRTL - 窗体或控件将具有从右向左的布局(因而会被镜像)<br>WS_EX_COMPOSITED - 用双缓冲从下到上绘制窗口的所有子孙(WinXP以上)<br>WS_EX_NOACTIVATE - 处于顶层但不激活</p>
<p><br>二、按钮风格 <br>&nbsp;&nbsp;&nbsp; <br>BS_AUTOCHECKBOX&nbsp;&nbsp; 同复选按钮类似，点击一下选中，再次点击取消。<br>BS_AUTORADIOBUTTON同单选按钮类似，点击后选中标志将从同组的其他单选按钮处移到当前选项。<br>BS_CHECKBOX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 复选按钮<br>BS_DEFPUSHBUTTON&nbsp;&nbsp; 默认普通按钮，具有较黑的边框。<br>BS_GROUPBOX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分组框<br>BS_LEFTTEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同单选按钮或复选按钮配合使用，标题将显示在左侧。<br>BS_OWNERDRAW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可创建一个拥有者自绘按钮。<br>BS_PUSHBUTTON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 普通下压按钮<br>BS_RADIOBUTTON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 圆形单选按钮<br>BS_3STATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三态复选按钮,三种状态即：选中，未选中，未定<br>BS_AUTOCHECKBOX&nbsp;&nbsp; 检查框，按钮的状态会自动改变<br>BS_AUTORADIOBUTTON圆形选择按钮，按钮的状态会自动改变<br>BS_AUTO3STATE&nbsp;&nbsp;&nbsp;&nbsp; 允许按钮有三种状态即：选中，未选中，未定<br>BS_CHECKBOX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检查框<br>BS_LEFTTEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 左对齐文字</p>
<p>三、旋转按钮控件</p>
<p>UDS_HORZ 指定一个水平旋转按钮．若不指定该风格则创建一个垂直的旋转按钮．<br>UDS_WRAP 当旋转按钮增大到超过最大值时，自动重置为最小值，当减小至低于最小值时，自动重置为最大值．<br>UDS_ARROWKEYS 当用户按下向下或向上箭头键时，旋转按钮值递增或递减．<br>UDS_SETBUDDYINT 旋转按钮将自动更新伙伴控件中显示的数值，如果伙伴控件能接受输入，则可在伙伴控件中输入新的旋转按钮值．<br>UDS_NOTHOUSANDS 伙伴控件中显示的数值每隔三位没有千位分隔符．<br>UDS_AUTOBUDDY&nbsp; 自动使旋转按钮拥有一个伙伴控件．<br>UDS_ALIGNRIGHT 旋转按钮在伙伴控件的右侧．<br>UDS_ALIGNLEFT&nbsp; 旋转按钮在伙伴控件的左侧．</p>
<p>四、轨道条控件</p>
<p>TBS_HORZ 指定一个水平轨道条．该风格是默认的．<br>TBS_VERT 指定一个垂直轨道条．<br>TBS_AUTOTICKS 在范围设定后，自动为轨道条加上刻度．<br>TBS_NOTICKS 轨道条无刻度．<br>TBS_BOTTOM&nbsp; 在水平轨道条的底部显示刻度，可与TBS_TOP一起使用．<br>TBS_TOP 在水平轨道条的顶部显示刻度，可与TBS_BOTTOM一起使用．<br>TBS_RIGHT 在垂直轨道条的右侧显示刻度，可与TBS_LEFT一起使用．<br>TBS_LEFT 在垂直轨道条的左侧显示刻度，可与TBS_RIGHT一起使用．<br>TBS_BOTH 在轨道条的上下部或左右两侧都显示刻度．<br>TBS_ENABLESELRANGE 在轨道条中显示一个选择范围．</p>
<p>五、文本编辑框风格</p>
<p>ES_AUTOHSCROLL&nbsp;&nbsp;&nbsp;&nbsp; 当在行尾添加一个字符后自动向右滚动10个字符。<br>ES_AUTOVSCROLL&nbsp;&nbsp;&nbsp;&nbsp; 当输入回车后自动上滚一行。<br>ES_CENTER&nbsp;&nbsp;&nbsp;&nbsp; 字符居中显示。<br>ES_LEFT&nbsp;&nbsp;&nbsp;&nbsp; 字符左对齐。<br>ES_LOWERCASE&nbsp;&nbsp;&nbsp;&nbsp; 统一转化为小写字母。<br>ES_MULTILINE&nbsp;&nbsp;&nbsp;&nbsp; 允许多行显示。<br>ES_NOHIDESEL&nbsp;&nbsp;&nbsp;&nbsp; 当编辑失去焦点时隐藏对字符的选定，重新获得焦点后以反色显示选中内容。<br>ES_OEMCONVERT&nbsp;&nbsp;&nbsp;&nbsp; 将ANSI字符转化为OEM字符。<br>ES_PASSWORD&nbsp;&nbsp;&nbsp;&nbsp; 以星号显示字符，多用于回显密码。<br>ES_RIGHT&nbsp;&nbsp;&nbsp;&nbsp; 字符右对齐<br>ES_UPPERCASE&nbsp;&nbsp;&nbsp;&nbsp; 统一转化为大写字母。<br>ES_READONLY&nbsp;&nbsp;&nbsp;&nbsp; 设置字符为只读。<br>ES_WANTRETURN&nbsp;&nbsp;&nbsp;&nbsp; 接受回车键输入。</p>
<p>六、列表框风格 <br>&nbsp;&nbsp;&nbsp; <br>LBS_STANDARD&nbsp;&nbsp;&nbsp;&nbsp; 创建一个具有边界和垂直滚动条、当选择发生变化或条目被双击时能够通知父窗口的标准列表框。所有条目按字母排序。<br>LBS_SORT&nbsp;&nbsp;&nbsp;&nbsp; 按字母排序。<br>LBS_NOSEL&nbsp;&nbsp;&nbsp;&nbsp; 条目可视但不可选。<br>LBS_NOTIFY&nbsp;&nbsp;&nbsp;&nbsp; 当用户选择或双击一个串时，发出消息通知父窗口。<br>LBS_DISABLENOSCROLL&nbsp;&nbsp;&nbsp;&nbsp; 在条目不多时依然显示并不起作用的滚动条。<br>LBS_MULTIPLESEL&nbsp;&nbsp;&nbsp;&nbsp; 允许条目多选。<br>LBS_EXTENDEDSEL&nbsp;&nbsp;&nbsp;&nbsp; 可用SHIFT和鼠标或指定键组合来选择多个条目。<br>LBS_MULTICOLUMN&nbsp;&nbsp;&nbsp;&nbsp; 允许多列显示。<br>LBS_OWNERDRAWVARIABLE&nbsp;&nbsp;&nbsp;&nbsp; 创建一个拥有者画列表框，条目高度可以不同。<br>LBS_OWNERDRAWFIXED&nbsp;&nbsp;&nbsp;&nbsp; 创建一个具有相同条目高度的拥有者画列表框。<br>LBS_USETABSTOPS&nbsp;&nbsp;&nbsp;&nbsp; 允许使用TAB制表符。<br>LBS_NOREDRAW&nbsp;&nbsp;&nbsp;&nbsp; 当条目被增删后不自动更新列表显示。<br>LBS_HASSTRINGS&nbsp;&nbsp;&nbsp;&nbsp; 记忆了添加到列表中的字串。<br>LBS_WANTKEYBOARDINPUT&nbsp;&nbsp;&nbsp;&nbsp; 当有键按下时向父窗口发送WM_VKEYTOITEM或WM_CHARTOITEM消息。<br>LBS_NOINTEGRALHEIGHT&nbsp;&nbsp;&nbsp;&nbsp; 按程序设定尺寸创建列表框。</p>
<p>七、组合框风格</p>
<p>CBS_AUTOHSCROLL 当在行尾输入字符时自动将编辑框中的文字向右滚动。<br>CBS_DROPDOWN&nbsp;&nbsp;&nbsp;&nbsp; 同CBS_SIMPLE风格类似，只是只有在用户点击下拉图标时才会显示出下拉列表。<br>CBS_DROPDOWNLIST 同CBS_DROPDOWN类似，只是显示当前选项的编辑框为一静态框所代替。<br>CBS_HASSTRINGS&nbsp;&nbsp;&nbsp;&nbsp; 创建一个包含了由字串组成的项目的拥有者画组合框。<br>CBS_OEMCONVERT&nbsp;&nbsp;&nbsp;&nbsp; 将组合框中的ANSI字串转化为OEM字符。<br>CBS_OWNERDRAWFIXED 由下拉列表框的拥有者负责对内容的绘制；列表框中各项目高度相同。<br>CBS_OWNERDRAWVARIABLE 由下拉列表框的拥有者负责对内容的绘制；列表框中各项目高度可以不同。<br>CBS_SIMPLE&nbsp;&nbsp;&nbsp;&nbsp; 下拉列表始终显示。<br>CBS_SORT&nbsp;&nbsp;&nbsp;&nbsp; 自动对下拉列表中的项目进行排序。<br>CBS_DISABLENOSCROLL 当下拉列表显示内容过少时显示垂直滚动条。<br>CBS_NOINTEGRALHEIGHT在创建控件时以指定的大小来精确设定组合框尺寸。</p>
<p>八、树形视图控件</p>
<p>TVS_HASLINES 在父项与子项间连线以清楚地显示结构．<br>TVS_LINESATROOT 只在根部画线．<br>TVS_HASBUTTONS 显示带有＂+＂或＂-＂的小方框来表示某项能否被展开或已展开．<br>TVS_EDITLABELS 用户可以编辑表项的标题．<br>TVS_SHOWSELALWAYS 即使控件失去输入焦点，仍显示出项的选择状态．<br>TVS_DISABLEDRAGDROP 不支持拖动操作．</p>
<p>九、列表视图控件</p>
<p><br>LVS_ALIGNLEFT 当显示格式是大图标或小图标时，标题放在图标的左边．缺省情况下标题放在图标的下面．<br>LVS_ALIGNTOP 当显示格式是大图标或小图标时，标题放在图标的上边．<br>LVS_AUTOARRANGE 当显示格式是大图标或小图标时，自动排列控件中的表项．<br>LVS_EDITLABELS 用户可以修改标题．<br>LVS_ICON 指定大图标显示格式．<br>LVS_LIST 指定列表显示格式．<br>LVS_NOCOLUMNHEADER 在报告格式中不显示列的表头．<br>LVS_NOLABELWRAP 当显示格式是大图标时，使标题单行显示．缺省时是多行显示．<br>LVS_NOSCROLL 列表视图无滚动条．<br>LVS_NOSORTHEADER 报告列表视图的表头不能作为排序按钮使用．<br>LVS_OWNERDRAWFIXED 由控件的拥有者负责绘制表项．<br>LVS_REPORT 指定报告 显示格式．<br>LVS_SHAREIMAGELISTS 使列表视图共享图像序列．<br>LVS_SHOWSELALWAYS 即使控件失去输入焦点，仍显示出项的选择状态．<br>LVS_SINGLESEL 指定一个单选择列表视图．缺省时可以多项选择．<br>LVS_SMALLICON 指定小图标显示格式．<br>LVS_SORTASCENDING 按升序排列表项．<br>LVS_SORTDESCENDING 按降序排列表项．</p>
<p>十、静态文本框风格</p>
<p>SS_CENTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符居中显示。<br>SS_LEFT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符左对齐。<br>SS_LEFTNOWORADWRAP 字符左对齐,可处理TAB制表符，不支持自动换行，超过末尾字符被裁剪。<br>SS_BLACKRECT&nbsp;&nbsp;&nbsp; 用窗口边框色填充的矩形。<br>SS_BLSCKFRAME&nbsp;&nbsp; 矩形边框，与窗口边框同色。<br>SS_GRAYRECT&nbsp;&nbsp;&nbsp;&nbsp; 用屏幕背景色填充的矩行。<br>SS_GRAYFRAME&nbsp;&nbsp;&nbsp; 矩形边框，使用屏幕背景色。<br>SS_WHITERECT&nbsp;&nbsp;&nbsp; 用窗口背景色填充的矩行。<br>SS_RIGHT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符右对齐<br>SS_WHITEFRAME&nbsp;&nbsp; 矩形边框，使用窗口背景色。</p>
<p>/* 控件样式参考列表：<br>DS_ABSALIGN - 对话框的坐标为屏幕坐标(缺省为客户区坐标)<br>DS_SYSMODAL - 系统模式(仅支持16位程序),不能与DS_CONTROL同用<br>DS_LOCALEDIT - 在对话框内部为编辑框分配内存(仅支持16位程序)<br>DS_SETFONT - 可定制对话框字体<br>DS_MODALFRAME - 框架样式(不能与WS_CAPTION同用)<br>DS_NOIDLEMSG - 无空闲消息<br>DS_SETFOREGROUND - 使对话框在最前面显示<br>DS_3DLOOK - 四周有3维边框<br>DS_FIXEDSYS - 使用系统固定字体<br>DS_NOFAILCREATE - 忽略创建过程中的错误<br>DS_CONTROL - 控件模式,可作为其他对话框的子窗口<br>DS_CENTER - 在屏幕居中<br>DS_CENTERMOUSE - 在鼠标位置居中<br>DS_CONTEXTHELP - 有上下文帮助按钮 </p>
<p>近日来工作中需要类似于QQ聊天窗口那样，窗口最小化缩到任务栏，点任务栏上的按钮可以复原窗口，由于窗口是子窗口，所以我们重载了窗口的CreateParams方法如下：</p>
<p>procedure TsubForm2.CreateParams(var Params: TCreateParams);<br>begin<br>&nbsp;&nbsp;&nbsp; inherited CreateParams(Params); <br>&nbsp;&nbsp;&nbsp; with Params do begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExStyle := ExStyle or WS_EX_APPWINDOW;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WndParent := GetDesktopWindow();<br>&nbsp;&nbsp;&nbsp; end;<br>end;</p>
<p>这样窗口就可以在任务栏上显示了。</p>
<p>但是又碰到一个问题，就是由于窗口样式被我设置成了bs_None，为无边框窗口，所以我点任务栏上的窗口按钮的时候，窗口无法复原和收缩回任务栏。</p>
<p>后来仔细看了一下窗口样式，想想，我们的目的无非是能够响应普通窗口一样的消息，于是，我将窗口设置成bs_Sizeable，然后就能够实现QQ聊天窗口的那 个效果，于是，俺就想在bs_Sizeable的样式下减去窗口的边框样式，这样来测试，于是俺先减去了一个WS_Caption标题样式，此时窗口可以实现QQ聊天窗口的那种样式了，但是多了一个边框，又仔细查看了一下Windows的窗口样式，发现一个样式WS_THICKFRAME，该样式是用来拖动窗口大小的时候的一个窗口边框，于是俺在多减去该样式</p>
<p>最后效果实现</p>
<p>在窗口的Create事件中</p>
<p>加上一个样式设置的就可</p>
<p>SetWindowLong(Handle,GWL_STYLE,GetWindowLong(Handle,GWL_STYLE) and (not WS_CAPTION) and (not WS_THICKFRAME));</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/suiyunonghen/archive/2009/01/19/3835813.aspx">http://blog.csdn.net/suiyunonghen/archive/2009/01/19/3835813.aspx</a></p>
<img src ="http://www.cppblog.com/ally-zheng-2009/aggbug/98486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ally-zheng-2009/" target="_blank">ally-zheng</a> 2009-10-13 16:08 <a href="http://www.cppblog.com/ally-zheng-2009/articles/98486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取程序当前执行文件名-GetModuleFileName的用法 (转)</title><link>http://www.cppblog.com/ally-zheng-2009/articles/98347.html</link><dc:creator>ally-zheng</dc:creator><author>ally-zheng</author><pubDate>Mon, 12 Oct 2009 02:36:00 GMT</pubDate><guid>http://www.cppblog.com/ally-zheng-2009/articles/98347.html</guid><wfw:comment>http://www.cppblog.com/ally-zheng-2009/comments/98347.html</wfw:comment><comments>http://www.cppblog.com/ally-zheng-2009/articles/98347.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ally-zheng-2009/comments/commentRss/98347.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ally-zheng-2009/services/trackbacks/98347.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.cppblog.com/pwqonline/archive/2008/09/10/61489.html"><font color=#223355>获取程序当前执行文件名-GetModuleFileName的用法</font></a> </h2>
<div class=postbody>
<h2>&nbsp;</h2>
<div class=postbody>用GetModuleFileName获取程序当前执行文件名 <br><br>需要获得程序当前的运行目录，这时就可以使用GetModuleFileName函数<br>DWORD WINAPI GetModuleFileName(<br>&nbsp; HMODULE <em>hModule</em>,<br>&nbsp; LPTSTR <em>lpFileName</em>,<br>&nbsp; DWORD <em>nSize</em><br>);<br><br>hModule：要获取文件名的模块名柄,null表示当前模块<br>lpFileName:输出参数，存放取得的文件名<br>nSize:lpFileName参数的长度<br><br>例<br>void FileName()<br>{<br>&nbsp;&nbsp;&nbsp; TCHAR lpFileName[MAX_PATH];<br>&nbsp;&nbsp;&nbsp; ::GetModuleFileName(null, lpFileName, MAX_PATH);<br>&nbsp;&nbsp;&nbsp; SetDlgItemText(IDC_TEXTBOX, lpFileName);<br>}</div>
</div>
<img src ="http://www.cppblog.com/ally-zheng-2009/aggbug/98347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ally-zheng-2009/" target="_blank">ally-zheng</a> 2009-10-12 10:36 <a href="http://www.cppblog.com/ally-zheng-2009/articles/98347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息 收藏 </title><link>http://www.cppblog.com/ally-zheng-2009/articles/98307.html</link><dc:creator>ally-zheng</dc:creator><author>ally-zheng</author><pubDate>Sun, 11 Oct 2009 04:35:00 GMT</pubDate><guid>http://www.cppblog.com/ally-zheng-2009/articles/98307.html</guid><wfw:comment>http://www.cppblog.com/ally-zheng-2009/comments/98307.html</wfw:comment><comments>http://www.cppblog.com/ally-zheng-2009/articles/98307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ally-zheng-2009/comments/commentRss/98307.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ally-zheng-2009/services/trackbacks/98307.html</trackback:ping><description><![CDATA[&nbsp;MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息 <cite class=fav_csdnstylebykimi><a class=fav_csdnstylebykimi title=收藏到我的网摘中，并分享给我的朋友 href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'saveit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();"><font face=Tahoma color=#3939d8 size=2>收藏</font></a> </cite>
<div class=blogstory>
<script type=text/javascript>
document.body.oncopy = function() {
if (window.clipboardData) {
setTimeout(function() {
var text = clipboardData.getData("text");
if (text && text.length>300) {
text = text + "\r\n\n本文来自CSDN博客，转载请标明出处：" + location.href;
clipboardData.setData("text", text);
}
}, 100);
}
}
</script>
<script type=text/javascript>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
<p>对话框中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息</p>
<p>在对话框程序中添加工具栏其实很简单，网上能找到很多的例子。一般的步骤就是：1、在资源中添加工</p>
<p>具栏资源；2、在对话框类中定义一个工具栏变量；3、在对话框的OnInitDialog函数中Create工具栏。程</p>
<p>序如下：<br>在对话框类中定义工具栏成员变量：<br>CToolBar m_ToolBar;<br>在OnInitDialog函数中Create之：<br>if(!m_ToolBar.CreateEx(this, TBSTYLE_FLAT, </p>
<p>WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_SIZE_DYNAMIC)<br>&nbsp;&nbsp;||!m_ToolBar.LoadToolBar(IDR_TOOLBAR_GRAPHICS))<br>&nbsp;{<br>&nbsp;&nbsp;TRACE0(_T("创建工具条失败\n"));<br>&nbsp;&nbsp;return FALSE;<br>&nbsp;}<br>&nbsp;RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);</p>
<p>但是要让对话框中的工具栏响应UPDATE_COMMAND_UI消息，做到按下保持的状态仅仅重载</p>
<p>UPDATE_COMMAND_UI消息并使用SetCheck是不行的，因为此时的工具栏上的按钮属性为普通的按钮，可以</p>
<p>通过下面的方法测试：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_ToolBar.GetButtonStyle(0) == TBBS_BUTTON)<br>&nbsp;{<br>&nbsp;&nbsp;AfxMessageBox("This is Button Style");<br>&nbsp;}<br>必须添加以下的设置：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_ToolBar.SetButtonStyle(0,TBBS_CHECKBOX);<br>&nbsp;m_ToolBar.SetButtonStyle(1,TBBS_CHECKBOX);<br>SetButtonStyle函数的原型及其相关的说明：（引自MSDN）<br>1、void SetButtonStyle( int nIndex, UINT nStyle );</p>
<p>Parameters</p>
<p>nIndex</p>
<p>Index of the button or separator whose information is to be set.</p>
<p>nStyle</p>
<p>The button style. The following button styles are supported: </p>
<p>TBBS_BUTTON&nbsp;&nbsp; Standard pushbutton (default)</p>
<p><br>TBBS_SEPARATOR&nbsp;&nbsp; Separator</p>
<p><br>TBBS_CHECKBOX&nbsp;&nbsp; Auto check-box button</p>
<p><br>TBBS_GROUP&nbsp;&nbsp; Marks the start of a group of buttons</p>
<p><br>TBBS_CHECKGROUP&nbsp;&nbsp; Marks the start of a group of check-box buttons <br>Remarks</p>
<p>Call this member function to set the style of a button or separator, or to group buttons. A </p>
<p>button's style determines how the button appears and how it responds to user input.</p>
<p>2、还有一种修改Button属性的函数<br>void SetButtonInfo( int nIndex, UINT nID, UINT nStyle, int iImage );</p>
<p>Parameters</p>
<p>nIndex</p>
<p>Index of the button or separator whose information is to be set.</p>
<p>nID</p>
<p>The value to which the button&#8217;s command ID is set.</p>
<p>nStyle</p>
<p>The new button style. The following button styles are supported: </p>
<p>TBBS_BUTTON&nbsp;&nbsp; Standard pushbutton (default)</p>
<p><br>TBBS_SEPARATOR&nbsp;&nbsp; Separator</p>
<p><br>TBBS_CHECKBOX&nbsp;&nbsp; Auto check-box button</p>
<p><br>TBBS_GROUP&nbsp;&nbsp; Marks the start of a group of buttons</p>
<p><br>TBBS_CHECKGROUP&nbsp;&nbsp; Marks the start of a group of check-box buttons <br>iImage</p>
<p>New index for the button&#8217;s image within the bitmap.</p>
<p>Remarks</p>
<p>Call this member function to set the button's command ID, style, and image number. For </p>
<p>separators, which have the style TBBS_SEPARATOR, this function sets the separator's width in </p>
<p>pixels to the value stored in iImage.</p>
<p>For information on bitmap images and buttons, see the CToolBar Overview and </p>
<p>CToolBar::LoadBitmap. </p>
</div>
<img src ="http://www.cppblog.com/ally-zheng-2009/aggbug/98307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ally-zheng-2009/" target="_blank">ally-zheng</a> 2009-10-11 12:35 <a href="http://www.cppblog.com/ally-zheng-2009/articles/98307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>收藏：MFC修改程序框架 </title><link>http://www.cppblog.com/ally-zheng-2009/articles/98302.html</link><dc:creator>ally-zheng</dc:creator><author>ally-zheng</author><pubDate>Sun, 11 Oct 2009 03:52:00 GMT</pubDate><guid>http://www.cppblog.com/ally-zheng-2009/articles/98302.html</guid><wfw:comment>http://www.cppblog.com/ally-zheng-2009/comments/98302.html</wfw:comment><comments>http://www.cppblog.com/ally-zheng-2009/articles/98302.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ally-zheng-2009/comments/commentRss/98302.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ally-zheng-2009/services/trackbacks/98302.html</trackback:ping><description><![CDATA[<div class=entryTitle><a class=postTitle2 id=ctl04_TitleUrl href="http://www.cnblogs.com/haosw/archive/2009/09/02/1559066.html"><u><font color=#0000ff>MFC修改程序框架</font></u></a> </div>
<br>1.修改窗口大小：<br>BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp; cs)中修改cs值，例如cs.cx=100;cs.cy=200;<br><br>2.修改窗口标题：<br>cs.style&amp;=~FWS_ADDTOTITLE；<br>cs.lpszName="要添加的标题";<br><br>3.改变窗口类型：<br>在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加代码：<br>SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);<br><br>4.改变图标：<br>在BOOL CMainFrame::PreCreateWindow(CREATESTRUCT&amp; cs)中使用AfxRegisterWndClass函数<br>例如：cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,0,LoadIcon(NULL,IDI_WARNING));//将图标改为一个警告符号<br>注意：LoadIcon中若使用的是系统默认的图标，则第一个变量设置NULL,第二个变量设置为默认图标的ID<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LoadIcon中若使用的是自己设定的图标的话，第一个变量则为实例句柄：可以用全局函数AfxGetInstanceHandle()获得，第二个变量要通过MAKEINTRESOURCE改变变量类型<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如：m_hIcon1=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON1));其中theApp.m_hInstance是获得实例句柄的另外一种方法，不过要在类CMainFrame中声明全局变量theApp,在MainFrame.cpp中添加extern CStyleApp theApp;<br><br>5.修改光标、背景：<br>在BOOL CStyleView::PreCreateWindow(CREATESTRUCT&amp; cs)中添加代码：<br>&nbsp;cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0);<br>上面设置的光标为十字光标，背景采用的黑色画刷<br><br>6.修改图标、光标、背景也可以用SetClassLong函数，该函数有三个变量，第一个是对象变量，第二个是要改变值的索引，第三个是索引对应的属性值；<br>例如：SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));具体可以看MSDN中对SetClassLong函数的讲解；<br>注意：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 修改图标和外观要在MainFrame中进行，修改光标、背景要在View类中进行,SetClassLong函数要添加在OnCreate函数中<br><br>7.设置定时器：<br>对CMainFrame类添加WM_TIMER响应<br>在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中可以设置时钟变化间隔，例如SetTimer(1,1000,NULL);使时钟每个1000毫秒变化一次<br><br>8.设置一个可以在一定范围内变化的变量：<br>例如使index在0，1，2之间变化，可以在void CMainFrame::OnTimer(UINT nIDEvent) 中加入代码：<br>static int index=0;index=++index%3;<br><br>9.创建新的工具栏：<br>（1）在ResourceView中添加一个新的工具栏资源，IDR_TOOLBAR1<br>&nbsp; (2)构建一个CToolBar对象，在MainFrm.h中添加：CToolBar&nbsp;&nbsp;&nbsp; m_newToolBar;<br>（3）在MainFrm.cpp中调用OnCreate函数添加工具栏，并将它与构建的对象联系：代码如下：<br><br>if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_RIGHT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//CBRS_RIGHT表示新创建的工具栏靠在窗口的右侧<br>&nbsp;&nbsp;| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||<br>&nbsp;&nbsp;!m_newToolBar.LoadToolBar(IDR_TOOLBAR1))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //LoadToolBar(IDR_TOOLBAR1)将对象与工具栏联系<br>&nbsp;{<br>&nbsp;&nbsp;TRACE0("Failed to create toolbar\n");<br>&nbsp;&nbsp;return -1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // fail to create<br>&nbsp;}<br>&nbsp;&nbsp;&nbsp; m_newToolBar.EnableDocking(CBRS_ALIGN_ANY);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置工具栏可以停靠<br>&nbsp;&nbsp;&nbsp; DockControlBar(&amp;m_newToolBar);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //工具栏停靠<br><br>10.工具栏的隐藏：<br>在主菜单添加一个按钮，通过ClassWizarrd 对该按钮添加COMMAND响应，添加代码：<br>ShowControlBar(&amp;m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);<br><br>11.为主菜单的子按钮添加复选标记：<br>为按钮添加UPDATE COMMAND UI 响应，添加代码：<br>&nbsp;pCmdUI-&gt;SetCheck(m_newToolBar.IsWindowVisible());&nbsp;&nbsp;&nbsp; //设计的是将新工具栏隐藏<br><br>12.添加新的状态栏：<br>以添加时间状态栏为例<br>（1）在ResourceView的String Table中添加IDS_TIMER,属性改为：时钟；<br>（2）在MainFrm.cpp中的static UINT indicators[]中添加IDS_TIMER;<br>&nbsp;(3)需要使时间动起来，所以可利用void CMainFrame::OnTimer(UINT nIDEvent)函数，在里面添加代码：<br><br>CTime t = CTime::GetCurrentTime();&nbsp;//设置时间对象<br>&nbsp;CString str=t.Format("%H:%H:%S");&nbsp;//格式化时间<br>&nbsp;CClientDC dc(this);<br>&nbsp;CSize sz = dc.GetTextExtent(str);&nbsp;//设计字符串str存放所需窗格面板的宽度<br>&nbsp;m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx);&nbsp;&nbsp;&nbsp; //设置状态栏窗口属性，其中的1表示IDS_TIMER在static UINT indicators[]中索引为1<br>&nbsp;m_wndStatusBar.SetPaneText(1,str);//设置窗格面板文字<br><br>13.在状态栏中添加进度栏：<br>前两步类似12中的添加时钟状态栏<br>（1）在ResourceView的String Table中添加IDS_PROGRESS,属性改为：进度栏；<br>（2）在MainFrm.cpp中的static UINT indicators[]中添加IDS_PROGRESS;<br>&nbsp; (3)在MainFrm.h中添加CProgressCtrl&nbsp;&nbsp; m_progress；，类似9—（2）中添加的CToolBar&nbsp;&nbsp;&nbsp; m_newToolBar；<br>（4）在MainFrm.cpp中创建进度栏代码：<br>
<p>CRect rect;<br>&nbsp;m_wndStatusBar.GetItemRect(2,rect);//得到状态栏窗格的大小，2表示IDS_PROGRESS在static UINT indicators[]中索引为2<br>m_progress.Create(WS_CHILD | WS_VISIBLE,&nbsp; rect,&nbsp;&amp;m_wndStatusBar,&nbsp; 123/*进度栏ID号*//*);<br>m_progress.SetPos(50);//设置进度<br>(5)将其创建到状态栏的方法！如果在OnCreate()中创建，则不成立，因为获取矩形大小时失败。<br>&nbsp;&nbsp;&nbsp; 解决办法，用自定义消息：<br>&nbsp;&nbsp;&nbsp; 在MainFrm.h中#define UM_PROGRESS&nbsp; WM_USER+1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; afx_msg void OnProgress();<br>&nbsp;&nbsp;&nbsp; 在MainFrm.cpp中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON_MESSAGE(UM_PROGRESS,OnProgress)<br>然后实现这个函数<br>void CMainFrame::OnProgress()<br>{</p>
<div class=cnblogs_code><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #000000">CRect&nbsp;rect;<br>m_wndStatusBar.GetItemRect(</span><span style="COLOR: #800080">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rect);<br>m_progress.Create(WS_CHILD&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;WS_VISIBLE&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;PBS_SMOOTH,<br>&nbsp;&nbsp;rect,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">m_wndStatusBar,</span><span style="COLOR: #800080">123</span><span style="COLOR: #000000">);<br>m_progress.SetPos(</span><span style="COLOR: #800080">50</span><span style="COLOR: #000000">);</span></div>
<p>}<br>最后在OnCreate中调用 PostMessage(UM_PROGRESS);<br>(6)解决重绘时进度栏改变的问题。在OnPain()中重写代码<br>CRect rect;<br>m_wndStatusBar.GetItemRect(2,&amp;rect);<br>m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,<br>&nbsp; rect,&amp;m_wndStatusBar,123);<br>m_progress.SetPos(50);<br>然后在定时器消息处理函数中加入<br>m_progress.StepIt();<br><br>14.在状态栏中显示鼠标位置。<br>在View中增加OnMouseMove()处理函数</p>
<div class=cnblogs_code><img id=Code_Closed_Image_211124 onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_211124').style.display='none'; document.getElementById('Code_Open_Image_211124').style.display='inline'; document.getElementById('Code_Open_Text_211124').style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_211124 style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_211124').style.display='none'; getElementById('Code_Closed_Image_211124').style.display='inline'; getElementById('Code_Closed_Text_211124').style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span class=cnblogs_code_Collapse id=Code_Closed_Text_211124>Code</span><span id=Code_Open_Text_211124 style="DISPLAY: none"><br><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #000000">CString&nbsp;str;<br></span><span style="COLOR: #008080">2</span>&nbsp;<span style="COLOR: #000000">str.Format(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">x=%d,y=%d</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,point.x,point.y);<br></span><span style="COLOR: #008080">3</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">((CMainFrame*)GetParent())-&gt;m_wndStatusBar.SetWindowText(str);<br></span><span style="COLOR: #008080">4</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">((CMainFrame*)GetParent())-&gt;SetMessageText(str);<br></span><span style="COLOR: #008080">5</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">((CMainFrame*)GetParent())-&gt;GetMessageBar()-&gt;SetWindowText(str);</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">6</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">GetParent()</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetDescendantWindow(AFX_IDW_STATUS_BAR)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SetWindowText(str);</span></span></div>
<p><br>15.加入启动画面<br>&nbsp; Project-Component and -&gt;Visual C++ Components-&gt;SplashScreen-&gt;插入</p>
<img src ="http://www.cppblog.com/ally-zheng-2009/aggbug/98302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ally-zheng-2009/" target="_blank">ally-zheng</a> 2009-10-11 11:52 <a href="http://www.cppblog.com/ally-zheng-2009/articles/98302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>