﻿<?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++博客-长寿梦的cppblog-随笔分类-windows编程</title><link>http://www.cppblog.com/changshoumeng/category/13004.html</link><description>程序之外，再无世界。</description><language>zh-cn</language><lastBuildDate>Wed, 15 Aug 2012 08:26:22 GMT</lastBuildDate><pubDate>Wed, 15 Aug 2012 08:26:22 GMT</pubDate><ttl>60</ttl><item><title>vs2003安装步骤与可能问题的解决</title><link>http://www.cppblog.com/changshoumeng/archive/2012/08/15/187273.html</link><dc:creator>长寿梦</dc:creator><author>长寿梦</author><pubDate>Wed, 15 Aug 2012 05:10:00 GMT</pubDate><guid>http://www.cppblog.com/changshoumeng/archive/2012/08/15/187273.html</guid><wfw:comment>http://www.cppblog.com/changshoumeng/comments/187273.html</wfw:comment><comments>http://www.cppblog.com/changshoumeng/archive/2012/08/15/187273.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/changshoumeng/comments/commentRss/187273.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/changshoumeng/services/trackbacks/187273.html</trackback:ping><description><![CDATA[<p>vs2003安装步骤与可能问题的解决</p>
<p>2012-08-15 changshoumeng试验成功</p>
<p>1. 安装盘<br />&nbsp;&nbsp; sc_vs.net_2003_prereq.iso<br />&nbsp;&nbsp; VS.Net_2003_Enar_CHS_CD1.ISO<br />&nbsp;&nbsp; VS.Net_2003_Enar_CHS_CD2.ISO<br />2. 安装步骤<br />2.1 安装 sc_vs.net_2003_prereq.iso<br />&nbsp;&nbsp;&nbsp; 可能出现问题：FrontPage2000 服务器扩展安装失败。<br />&nbsp;&nbsp;&nbsp; 解决办法：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a：下载关于iis的完整包<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (说明：这一步解决的问题是，xp上可能并没有iis的安装文件)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 控制面板/添加或删除文件/添加或删除windows组件/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b: 首先 勾选 [附件和工具] /详细信息D/取消勾选游戏/确定<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (说明：这一步解决的问题是，安装IIS 时出现安装程序无法复制文件zClinettm.exe)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c: 然后 勾选 [Inernet信息服务(IIS)] /详细信息D/勾选FrontPage2000 服务扩展<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击下一步 进行安装。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (说明：这一步解决的问题时，FrontPage2000 服务器扩展组件安装失败) <br />2.2 安装VS.Net_2003_Enar_CHS_CD1.ISO<br />&nbsp;&nbsp;&nbsp; 可能出现的问题：<br />&nbsp;&nbsp; 错误 1308。未找到源文件: d:\everbox\vs2003\vs.net_2003_enar_chs_cd1\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1</p>
<p>\Docs\2052\cpsamples.HxS。请验证文件是否存在以及是否可以访问它。<br />&nbsp;&nbsp;&nbsp;&nbsp; 解决办法：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这些文件，都来自于VS.Net_2003_Enar_CHS_CD2.ISO里；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只要从光盘2里把对应的文件拷贝到光盘1里，就行了。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是，如果这样的话，这样的操作就会出现很多次，颇为繁琐。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 于是我想，假如能够光盘1与光盘2合并一个光盘就好了。解决办法，使用文件同步工具 GoodSyncPro，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将两个文件夹进行合并。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 继续点击重试，进行安装，这样就安装ok了。</p>
<p>参考网文：<br /><a href="http://hi.baidu.com/vc_net/item/086b31dff8ee4df792a97455">http://hi.baidu.com/vc_net/item/086b31dff8ee4df792a97455</a></p>
<p><a href="http://www.codesky.net/article/200911/125322.html">http://www.codesky.net/article/200911/125322.html</a></p><img src ="http://www.cppblog.com/changshoumeng/aggbug/187273.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/changshoumeng/" target="_blank">长寿梦</a> 2012-08-15 13:10 <a href="http://www.cppblog.com/changshoumeng/archive/2012/08/15/187273.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC消息循环 (转)</title><link>http://www.cppblog.com/changshoumeng/archive/2012/05/30/176755.html</link><dc:creator>长寿梦</dc:creator><author>长寿梦</author><pubDate>Wed, 30 May 2012 06:49:00 GMT</pubDate><guid>http://www.cppblog.com/changshoumeng/archive/2012/05/30/176755.html</guid><wfw:comment>http://www.cppblog.com/changshoumeng/comments/176755.html</wfw:comment><comments>http://www.cppblog.com/changshoumeng/archive/2012/05/30/176755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/changshoumeng/comments/commentRss/176755.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/changshoumeng/services/trackbacks/176755.html</trackback:ping><description><![CDATA[<div>
<p><font size="2"><strong><font size="2"><strong></strong></font>MFC应用程序中处理消息的顺序</strong></font></p>
<p><font size="2">1.AfxWndProc()&nbsp;<wbr>&nbsp;<wbr>该函数负责接收消息，找到消息所属的CWnd对象，然后调用AfxCallWndProc。</font></p>
<p><font size="2">2.AfxCallWndProc()&nbsp;<wbr>该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用，然后调用WindowProc()函数。</font></p>
<p><font size="2">3.WindowProc()&nbsp;<wbr>&nbsp;<wbr>该函数负责发送消息到OnWndMsg()函数，如果未被处理，则调用DefWindowProc()函数。</font></p>
<p><font size="2">4.OnWndMsg()&nbsp;<wbr>&nbsp;<wbr>该函数的功能首先按字节对消息进行排序，对于WM_COMMAND消息，调用OnCommand()消息响应函数，对于WM_NOTIFY消息调用OnNotify()消息响应函数。任何被遗漏的消息将是一个窗口消息。OnWndMsg()函数搜索类的消息映像，以找到一个能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数的话，则把消息返回到WindowProc()函数，由它将消息发送给DefWindowProc()函数。</font></p>
<p><font size="2">5.OnCommand()&nbsp;<wbr>&nbsp;<wbr>该函数查看这是不是一个控件通知(lParam参数不为NULL，如果lParam参数为空的话，说明该消息不是控件通知)，如果它是，OnCommand()函数会试图将消息映射到制造通知的控件；如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数。</font></p>
<p><font size="2">6.OnCmdMsg() &nbsp;<wbr>&nbsp;<wbr>根据接收消息的类，OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。例如：如果拥有该窗口的类是一个框架类，则命令和通知消息也被传递到视图和文档类，并为该类寻找一个消息处理函数。</font></p>
<p><br /><font size="2"><strong>MFC应用程序创建窗口的过程</strong></font></p>
<p><font size="2">1.PreCreateWindow()&nbsp;<wbr>该函数是一个重载函数，在窗口被创建前，可以在该重载函数中改变创建参数(可以设置窗口风格等等)。</font></p>
<p><font size="2">2.PreSubclassWindow()&nbsp;<wbr>这也是一个重载函数，允许首先子分类一个窗口。</font></p>
<p><font size="2">3.OnGetMinMaxInfo()&nbsp;<wbr>该函数为消息响应函数，响应的是WM_GETMINMAXINFO消息，允许设置窗口的最大或者最小尺寸。</font></p>
<p><font size="2">4.OnNcCreate()&nbsp;<wbr>&nbsp;<wbr>该函数也是一个消息响应函数，响应WM_NCCREATE消息，发送消息以告诉窗口的客户区即将被创建。</font></p>
<p><font size="2">5.OnNcCalcSize()&nbsp;<wbr>该函数也是消息响应函数,响应WM_NCCALCSIZE消息，作用是允许改变窗口客户区大小。</font></p>
<p><font size="2">6.OnCreate()&nbsp;<wbr>&nbsp;<wbr>该函数也是一个消息响应函数，响应WM_CREATE消息，发送消息告诉一个窗口已经被创建。</font></p>
<p><font size="2">7.OnSize()&nbsp;<wbr>&nbsp;<wbr>该函数也是一个消息响应函数，响应WM_SIZE消息，发送该消息以告诉该窗口大小已经发生变化。</font></p>
<p><font size="2">8.OnMove()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应WM_MOVE消息，发送此消息说明窗口在移动。</font></p>
<p><font size="2">9.OnChildNotify()&nbsp;<wbr>该函数为重载函数，作为部分消息映射被调用，告诉父窗口即将被告知一个窗口刚刚被创建。</font></p>
<p><br /><font size="2"><strong>MFC应用程序关闭窗口的顺序(非模态窗口)</strong></font></p>
<p><font size="2">1.OnClose()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应窗口的WM_CLOSE消息，当关闭按钮被单击的时候发送此消息。</font></p>
<p><font size="2">2.OnDestroy()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应窗口的WM_DESTROY消息，当一个窗口将被销毁时，发送此消息。</font></p>
<p><font size="2">3.OnNcDestroy()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应窗口的WM_NCDESTROY消息，当一个窗口被销毁后发送此消息。</font></p>
<p><font size="2">4.PostNcDestroy()&nbsp;<wbr>重载函数，作为处理OnNcDestroy()函数的最后动作，被CWnd调用。</font></p>
<p><br /><font size="2"><strong>MFC应用程序中打开模式对话框的函数调用顺序</strong></font></p>
<p><font size="2">1.DoModal()&nbsp;<wbr>&nbsp;<wbr>重载函数，重载DoModal()成员函数。</font></p>
<p><font size="2">2.PreSubclassWindow()&nbsp;<wbr>重载函数，允许首先子分类一个窗口。</font></p>
<p><font size="2">3.OnCreate()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应WM_CREATE消息，发送此消息以告诉一个窗口已经被创建。</font></p>
<p><font size="2">4.OnSize()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应WM_SIZE消息，发送此消息以告诉窗口大小发生变化。</font></p>
<p><font size="2">5.OnMove()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应WM_MOVE消息，发送此消息，以告诉窗口正在移动。</font></p>
<p><font size="2">6.OnSetFont()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应WM_SETFONT消息，发送此消息，以允许改变对话框中控件的字体。</font></p>
<p><font size="2">7.OnInitDialog()&nbsp;<wbr>消息响应函数，响应WM_INITDIALOG消息，发送此消息以允许初始化对话框中的控件，或者是创建新控件。</font></p>
<p><font size="2">8.OnShowWindow()&nbsp;<wbr>消息响应函数，响应WM_SHOWWINDOW消息，该函数被ShowWindow()函数调用。</font></p>
<p><font size="2">9.OnCtlColor()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应WM_CTLCOLOR消息，被父窗口发送已改变对话框或对话框上面控件的颜色。</font></p>
<p><font size="2">10. OnChildNotify()&nbsp;<wbr>重载函数，作为WM_CTLCOLOR消息的结果发送。</font></p>
<p><br /><font size="2"><strong>MFC应用程序中关闭模式对话框的顺序</strong></font></p>
<p><font size="2">1.OnClose()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应WM_CLOSE消息，当"关闭"按钮被单击的时候，该函数被调用。</font></p>
<p><font size="2">2.OnKillFocus()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应WM_KILLFOCUS消息，当一个窗口即将失去键盘输入焦点以前被发送。</font></p>
<p><font size="2">3.OnDestroy()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应WM_DESTROY消息，当一个窗口即将被销毁时，被发送。</font></p>
<p><font size="2">4.OnNcDestroy()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应WM_NCDESTROY消息，当一个窗口被销毁以后被发送。</font></p>
<p><font size="2">5.PostNcDestroy()&nbsp;<wbr>重载函数，作为处理OnNcDestroy()函数的最后动作被CWnd调用。</font></p>
<p><br /><font size="2"><strong>打开无模式对话框的顺序</strong></font></p>
<p><font size="2">1.PreSubclassWindow()&nbsp;<wbr>重载函数，允许用户首先子分类一个窗口。</font></p>
<p><font size="2">2.OnCreate()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应WM_CREATE消息，发送此消息以告诉一个窗口已经被创建。</font></p>
<p><font size="2">3.OnSize()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应WM_SIZE消息，发送此消息以告诉窗口大小发生变化。</font></p>
<p><font size="2">4.OnMove()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应WM_MOVE消息，发送此消息以告诉窗口正在移动。</font></p>
<p><font size="2">5.OnSetFont()&nbsp;<wbr>&nbsp;<wbr>消息响应函数，响应WM_SETFONT消息，发送此消息以允许改变对话框中控件的字体。<br /><br /><a href="http://blog.sina.com.cn/s/blog_55cf5f230100p471.html">http://blog.sina.com.cn/s/blog_55cf5f230100p471.html</a></font></p></div><img src ="http://www.cppblog.com/changshoumeng/aggbug/176755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/changshoumeng/" target="_blank">长寿梦</a> 2012-05-30 14:49 <a href="http://www.cppblog.com/changshoumeng/archive/2012/05/30/176755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CPU三种工作模式总结</title><link>http://www.cppblog.com/changshoumeng/archive/2010/09/15/126699.html</link><dc:creator>长寿梦</dc:creator><author>长寿梦</author><pubDate>Wed, 15 Sep 2010 14:32:00 GMT</pubDate><guid>http://www.cppblog.com/changshoumeng/archive/2010/09/15/126699.html</guid><wfw:comment>http://www.cppblog.com/changshoumeng/comments/126699.html</wfw:comment><comments>http://www.cppblog.com/changshoumeng/archive/2010/09/15/126699.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/changshoumeng/comments/commentRss/126699.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/changshoumeng/services/trackbacks/126699.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 14pt"><font face=Calibri>CPU</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">三种工作模式总结</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US><font face=Calibri>CPU</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">三种模式</span><span lang=EN-US><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><strong style="mso-bidi-font-weight: normal"><em style="mso-bidi-font-style: normal"><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器有</span><span lang=EN-US style="COLOR: red"><font face=Calibri>3</font></span></em></strong><strong style="mso-bidi-font-weight: normal"><em style="mso-bidi-font-style: normal"><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">种工作模式：实模式、保护模式和虚拟</span><span lang=EN-US style="COLOR: red"><font face=Calibri>86</font></span></em></strong><strong style="mso-bidi-font-weight: normal"><em style="mso-bidi-font-style: normal"><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式</span></em></strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">。实模式和虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式是为了和</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器兼容而设置的。在实模式下，</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器就相当于一个快速的</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器。保护模式是</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器的主要工作模式。在此方式下，</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">可以寻址</span><span lang=EN-US><font face=Calibri>4GB</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的地址空间，同时，保护模式提供了</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">先进的多任务、内存分页管理和优先级保护等机制。为了在保护模式下继续提供和</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器的兼容，</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">又设计了一种虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式，以便可以在保护模式的多任务条件下，有的任务运行</span><span lang=EN-US><font face=Calibri>32</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">位程序，有的任务运行</span><span lang=EN-US><font face=Calibri>MS-DOS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">程序。在虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式下，同样支持任务切换、内存分页管理和优先级，但内存的寻址方式和</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">相同，也是可以寻址</span><span lang=EN-US><font face=Calibri>1 MB</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的空间。</span><span lang=EN-US><font face=Calibri> </font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">【批注：处理器从</span><span lang=EN-US style="COLOR: blue"><font face=Calibri>8086</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">升级到</span><span lang=EN-US style="COLOR: blue"><font face=Calibri>80386</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，工作模式也从实模式升级到保护模式，为了兼容</span><span lang=EN-US style="COLOR: blue"><font face=Calibri>8086</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">产生虚拟</span><span lang=EN-US style="COLOR: blue"><font face=Calibri>86</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式】</span><span lang=EN-US style="COLOR: blue"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><em style="mso-bidi-font-style: normal"><span lang=EN-US><font face=Calibri><span style="mso-spacerun: yes">&nbsp;&nbsp; </span><o:p></o:p></font></span></em></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">由此可见，</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器的</span><span lang=EN-US><font face=Calibri>3</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">种工作模式各有特点且相互联系。实模式是</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器工作的基础，这时</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">当做一个快速的</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器工作。<strong style="mso-bidi-font-weight: normal"><em style="mso-bidi-font-style: normal"><span style="COLOR: red">在实模式下可以通过指令切换到保护模式，也可以从保护模式退回到实模式。</span></em></strong>虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式则以保护模式为基础，在保护模式和虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式之间可以互相切换，但不能从实模式直接进入虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式或从虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式直接退到实模式。</span><span lang=EN-US><font face=Calibri> </font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">【批注：实模式&#8594;保护模式&#8594;虚拟</span><span lang=EN-US style="COLOR: blue"><font face=Calibri>86</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式】</span><span lang=EN-US style="COLOR: blue"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US><font face=Calibri>1.<span style="mso-spacerun: yes">&nbsp;&nbsp; </span></font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">实模式</span><span lang=EN-US><font face=Calibri> <o:p></o:p></font></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器被复位或加电的时候以实模式启动。这时候处理器中的各寄存器以实模式的初始化值工作。</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器在实模式下的存储器寻址方式和</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">是一样的，由段寄存器的内容乘以</span><span lang=EN-US><font face=Calibri>16</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">当做基地址，加上段内的偏移地址形成最终的物理地址，这时候它的</span><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="COLOR: red"><font face=Calibri>32</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">位地址线只使用了低</span><span lang=EN-US style="COLOR: red"><font face=Calibri>20</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">位</span></strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">。在实模式下，</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器不能对内存进行分页管理，所以指令寻址的地址就是内存中实际的物理地址。在实模式下，所有的段都是可以读、写和执行的。</span><font face=Calibri> </font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">【批注：物理地址】</span><span lang=EN-US style="COLOR: blue"><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">实模式下</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">不支持优先级，所有的指令相当于工作在特权级（优先级</span><span lang=EN-US><font face=Calibri>0</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">），所以它可以执行所有特权指令，包括读写控制寄存器</span><span lang=EN-US><font face=Calibri>CR0</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">等。实际上，</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">就是通过在实模式下初始化控制寄存器，</span><span lang=EN-US><font face=Calibri>GDTR</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，</span><span lang=EN-US><font face=Calibri>LDTR</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，</span><span lang=EN-US><font face=Calibri>IDTR</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">与</span><span lang=EN-US><font face=Calibri>TR</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">等管理寄存器以及页表，然后再通过加载</span><span lang=EN-US><font face=Calibri>CR0</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">使其中的保护模式使能位置位而进入保护模式的。实模式下不支持硬件上的多任务切换。</span><span lang=EN-US><font face=Calibri> </font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">【批注：多任务】</span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">实模式下的中断处理方式和</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器相同，也用中断向量表来定位中断服务程序地址。中断向量表的结构也和</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器一样，每</span><span lang=EN-US><font face=Calibri>4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">个字节组成一个中断向量，其中包括两个字节的段地址和两个字节的偏移地址。</span><span lang=EN-US><font face=Calibri> </font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">【批注：中断向量】</span><span lang=EN-US style="COLOR: blue"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">从编程的角度看，除了可以访问</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">新增的一些寄存器外，<strong style="mso-bidi-font-weight: normal"><em style="mso-bidi-font-style: normal">实模式的</em></strong></span><strong style="mso-bidi-font-weight: normal"><em style="mso-bidi-font-style: normal"><span lang=EN-US><font face=Calibri>80386</font></span></em></strong><strong style="mso-bidi-font-weight: normal"><em style="mso-bidi-font-style: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器和</span><span lang=EN-US><font face=Calibri>8086</font></span></em></strong><strong style="mso-bidi-font-weight: normal"><em style="mso-bidi-font-style: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">有什么进步呢？<span style="COLOR: red">其实最大的好处是可以使用</span></span><span lang=EN-US style="COLOR: red"><font face=Calibri>80386</font></span></em></strong><strong style="mso-bidi-font-weight: normal"><em style="mso-bidi-font-style: normal"><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的</span><span lang=EN-US style="COLOR: red"><font face=Calibri>32</font></span></em></strong><strong style="mso-bidi-font-weight: normal"><em style="mso-bidi-font-style: normal"><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">位寄存器</span></em></strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，用</span><span lang=EN-US><font face=Calibri>32</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">位的寄存器进行编程可以使计算程序更加简捷，加快了执行速度。比如在</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">时代用</span><span lang=EN-US><font face=Calibri>16</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">位寄存器来完成</span><span lang=EN-US><font face=Calibri>32</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">位的乘法和除法时，要进行的步骤实在是太多了，于是考试时出这一类的题目就成了老师们的最爱，所以那时候当学生做梦都想着让寄存器的位数快快长，现在梦想终于成真了，用</span><span lang=EN-US><font face=Calibri>32</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">位寄存器一条指令就可以完成（问题是老师们也发现了这个投机取巧的办法，为了达到让学生们基础扎实的目的，也把题目换成了</span><span lang=EN-US><font face=Calibri>64</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">位的乘法和除法，所以现在晚上做的梦换成了寄存器忽然长到了</span><span lang=EN-US><font face=Calibri>64</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">位）；其次，</span><strong style="mso-bidi-font-weight: normal"><em style="mso-bidi-font-style: normal"><span lang=EN-US><font face=Calibri>80386</font></span></em></strong><strong style="mso-bidi-font-weight: normal"><em style="mso-bidi-font-style: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">中<span style="COLOR: red">增加的两个辅助段寄存器</span></span><span lang=EN-US style="COLOR: red"><font face=Calibri>FS</font></span></em></strong><strong style="mso-bidi-font-weight: normal"><em style="mso-bidi-font-style: normal"><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">和</span><span lang=EN-US style="COLOR: red"><font face=Calibri>GS</font></span></em></strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">在实模式下也可以使用，这样，同时可以访问的段达到了</span><span lang=EN-US><font face=Calibri>6</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">个而不必考虑重新装入的问题；最后，很多</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的<strong style="mso-bidi-font-weight: normal"><em style="mso-bidi-font-style: normal"><span style="COLOR: red">新增指令也使一些原来不很方便的操作得以简化</span></em></strong>，如</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">中可以使用下述指令进行数组访问：</span><span lang=EN-US><font face=Calibri> </font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face=Calibri><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong style="mso-bidi-font-weight: normal"><span style="mso-spacerun: yes">&nbsp;&nbsp;</span>mov </strong><span style="mso-spacerun: yes">&nbsp;&nbsp;</span><span style="COLOR: blue">cx,</span></font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">　</span><span lang=EN-US style="COLOR: blue"><font face=Calibri>[eax + ebx*2 + </font></span><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">数组基地址</span><span lang=EN-US style="COLOR: blue"><font face=Calibri>] </font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">这相当于把数组中下标为</span><span lang=EN-US><font face=Calibri>eax</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">和</span><span lang=EN-US><font face=Calibri>ebx</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的项目放入</span><span lang=EN-US><font face=Calibri>cx</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">中；</span><span lang=EN-US><font face=Calibri>ebx * 2</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">中的</span><span lang=EN-US><font face=Calibri>2</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">可以是</span><span lang=EN-US><font face=Calibri>1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，</span><span lang=EN-US><font face=Calibri>2</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，</span><span lang=EN-US><font face=Calibri>4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">或</span><span lang=EN-US><font face=Calibri>8</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，这样就可以支持</span><span lang=EN-US><font face=Calibri>8</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">位到</span><span lang=EN-US><font face=Calibri>64</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">位的数组。而在</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器中，实现相同的功能要进行一次乘法和两次加法。另外，</span><span lang=EN-US><font face=Calibri>pushad</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">和</span><span lang=EN-US><font face=Calibri>popad</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">指令可以一次把所有</span><span lang=EN-US><font face=Calibri>8</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">个通用寄存器的值压入或从堆栈中弹出，比起用下面的指令分别将</span><span lang=EN-US><font face=Calibri>8</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">个寄存器入栈要快了很多：</span><span lang=EN-US><font face=Calibri> </font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face=Calibri><span style="mso-spacerun: yes">&nbsp;&nbsp; </span><span style="COLOR: blue"><o:p></o:p></span></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: blue"><font face=Calibri><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>push<span style="mso-spacerun: yes">&nbsp; </span>eax<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><o:p></o:p></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: blue"><font face=Calibri><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>push <span style="mso-spacerun: yes">&nbsp;</span>ebx<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><o:p></o:p></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: blue"><font face=Calibri><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>...<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><o:p></o:p></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: blue"><font face=Calibri><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pop<span style="mso-spacerun: yes">&nbsp;&nbsp; </span>ebx<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><o:p></o:p></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: blue"><font face=Calibri><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pop<span style="mso-spacerun: yes">&nbsp;&nbsp; </span>eax <o:p></o:p></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">当然，使用了这些新指令的程序是无法拿回到</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器上去执行的，因为这些指令的编码在</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器上是未定义的。</span><span lang=EN-US><font face=Calibri> </font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">【批注：新增针对３２位寄存器的指令，简化操作】</span><span lang=EN-US style="COLOR: blue"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="COLOR: blue"><o:p><font face=Calibri>&nbsp;</font></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US><font face=Calibri>2.<span style="mso-spacerun: yes">&nbsp;&nbsp; </span></font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">保护模式</span><span lang=EN-US><font face=Calibri> <o:p></o:p></font></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">当</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">工作在保护模式下的时候，它的所有功能都是可用的。这时</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">所有的</span><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="COLOR: red"><font face=Calibri>32</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">根地址线都可供寻址，物理寻址空间高达</span><span lang=EN-US style="COLOR: red"><font face=Calibri>4 GB</font></span></strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">。在保护模式下，<strong style="mso-bidi-font-weight: normal"><span style="COLOR: red">支持内存分页机制，提供了对虚拟内存的良好支持</span></strong>。虽然与</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">可寻址的</span><span lang=EN-US><font face=Calibri>1 MB</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">物理地址空间相比，</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">可寻址的物理地址空间可谓很大，但实际的微机系统不可能安装如此大的物理内存。所以，为了运行大型程序和真正实现多任务，虚拟内存是一种必需的技术。</span><span lang=EN-US><font face=Calibri> </font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">【批注：虚拟内存】</span><span lang=EN-US style="COLOR: blue"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">保护模式下</span><span lang=EN-US><font face=Calibri>80386</font></span><strong style="mso-bidi-font-weight: normal"><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">支持多任务</span></strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">，可以依靠硬件仅在一条指令中实现任务切换。任务环境的保护工作是由处理器自动完成的。在保护模式下，</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器还<strong style="mso-bidi-font-weight: normal"><span style="COLOR: red">支持优先级机制</span></strong>，不同的程序可以运行在不同的优先级上。优先级一共分</span><span lang=EN-US><font face=Calibri>0</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">～</span><span lang=EN-US><font face=Calibri>3<span style="mso-spacerun: yes">&nbsp;&nbsp; </span>4</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">个级别，操作系统运行在最高的优先级</span><span lang=EN-US><font face=Calibri>0</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">上，应用程序则运行在比较低的级别上；配合良好的检查机制后，既可以在任务间实现数据的安全共享也可以很好地隔离各个任务。从实模式切换到保护模式是通过修改控制寄存器</span><span lang=EN-US><font face=Calibri>CR0</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的控制位</span><span lang=EN-US><font face=Calibri>PE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">（位</span><span lang=EN-US><font face=Calibri>0</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">）来实现的。在这之前还需要建立保护模式必需的一些数据表，如全局描述符表</span><span lang=EN-US><font face=Calibri>GDT</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">和中断描述符表</span><span lang=EN-US><font face=Calibri>IDT</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">等。</span><span lang=EN-US><font face=Calibri> </font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face=Calibri>DOS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">操作系统运行于实模式下，而</span><span lang=EN-US><font face=Calibri>Windows</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">操作系统运行于保护模式下。</span><span lang=EN-US><font face=Calibri> </font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">【批注：多任务，优先级】</span><span lang=EN-US style="COLOR: blue"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US><font face=Calibri>3.<span style="mso-spacerun: yes">&nbsp;&nbsp; </span></font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">虚拟</span><span lang=EN-US><font face=Calibri>86</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式</span><span lang=EN-US><font face=Calibri> <o:p></o:p></font></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><strong style="mso-bidi-font-weight: normal"><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">虚拟</span><span lang=EN-US style="COLOR: red"><font face=Calibri>86</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式是为了在保护模式下执行</span><span lang=EN-US style="COLOR: red"><font face=Calibri>8086</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">程序而设置的</span></strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">。虽然</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器已经提供了实模式来兼容</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">程序，但这时</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">程序实际上只是运行得快了一点，对</span><span lang=EN-US><font face=Calibri>CPU</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的资源还是独占的。在保护模式的多任务环境下运行这些程序时，它们中的很多指令和保护模式环境格格不入，如段寻址方式、对中断的处理和</span><span lang=EN-US><font face=Calibri>I/O</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">操作的特权问题等。为了在保护模式下工作而丢弃这些程序的代价是巨大的。设想一下，如果</span><span lang=EN-US><font face=Calibri>Windows</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">或</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器推出的时候宣布不能运行以前的</span><span lang=EN-US><font face=Calibri>MS-DOS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">程序，那么就等于放弃了一个巨大的软件库，</span><span lang=EN-US><font face=Calibri>Windows</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">以及</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器可能就会落得和苹果机一样的下场，这是</span><span lang=EN-US><font face=Calibri>Microsoft</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">和</span><span lang=EN-US><font face=Calibri>Intel</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">都不愿看到的。所以，</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">处理器又设计了一个虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式。</span><span lang=EN-US><font face=Calibri> </font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face=Calibri><span style="mso-spacerun: yes">&nbsp; </span><span style="COLOR: blue"><span style="mso-spacerun: yes">&nbsp;</span></span></font></span><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">【批注：在保护模式下，兼容</span><span lang=EN-US style="COLOR: blue"><font face=Calibri>8086</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">】</span><span lang=EN-US style="COLOR: blue"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式是以任务形式在保护模式上执行的，在</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">上可以同时支持由多个真正的</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">任务和虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式构成的任务。在虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式下，</span><span lang=EN-US><font face=Calibri>80386</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">支持任务切换和内存分页。在</span><span lang=EN-US><font face=Calibri>Windows</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">操作系统中，有一部分程序专门用来管理虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式的任务，称为<strong style="mso-bidi-font-weight: normal"><span style="COLOR: red">虚拟</span></strong></span><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="COLOR: red"><font face=Calibri>86</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">管理程序</span></strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">。</span><span lang=EN-US><font face=Calibri> </font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">既然虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式以保护模式为基础，它的<strong style="mso-bidi-font-weight: normal"><span style="COLOR: red">工作方式实际上是实模式和保护模式的混合</span></strong>。为了和</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">程序的寻址方式兼容，虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式采用和</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">一样的寻址方式，即用段寄存器乘以</span><span lang=EN-US><font face=Calibri>16</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">当做基址再配合偏移地址形成线性地址，寻址空间为</span><span lang=EN-US><font face=Calibri>1<span style="mso-spacerun: yes">&nbsp; </span>MB</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">。但显然多个虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">任务不能同时使用同一位置的</span><span lang=EN-US><font face=Calibri>1 MB</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">地址空间，否则会引起冲突。操作系统利用分页机制将不同虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">任务的地址空间映射到不同的物理地址上去，这样每个虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">任务看起来都认为自己在使用</span><span lang=EN-US><font face=Calibri>0</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">～</span><span lang=EN-US><font face=Calibri>1MB</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">的地址空间。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">【批注：虚拟</span><span lang=EN-US style="COLOR: blue"><font face=Calibri>86</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">模式</span><span lang=EN-US style="COLOR: blue"><font face=Calibri> = </font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">实模式</span><span lang=EN-US style="COLOR: blue"><font face=Calibri> + </font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">保护模式】</span><span lang=EN-US style="COLOR: blue"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes"><font face=Calibri>&nbsp;&nbsp; </font></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">代码中有相当一部分指令在保护模式下属于特权指令，如屏蔽中断的</span><span lang=EN-US><font face=Calibri>cli</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">和中断返回指令</span><span lang=EN-US><font face=Calibri>iret</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">等。这些指令在</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">程序中是合法的。如果不让这些指令执行，</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">代码就无法工作。为了解决这个问题，虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">管理程序采用模拟的方法来完成这些指令。这些特权指令执行的时候引起了保护异常。虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">管理程序在异常处理程序中检查产生异常的指令，如果是中断指令，则从虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">任务的中断向量表中取出中断处理程序的入口地址，并将控制转移过去；如果是危及操作系统的指令，如</span><span lang=EN-US><font face=Calibri>cli</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">等，则简单地忽略这些指令，在异常处理程序返回的时候直接返回到下一条指令。通过这些措施，</span><span lang=EN-US><font face=Calibri>8086</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">程序既可以正常地运行下去，在执行这些指令的时候又觉察不到已经被虚拟</span><span lang=EN-US><font face=Calibri>86</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">管理程序做了手脚。</span><span lang=EN-US><font face=Calibri>MS-DOS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">应用程序在</span><span lang=EN-US><font face=Calibri>Windows</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri">操作系统中就是这样工作的。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><font face=Calibri>&nbsp;</font></o:p></span></p>
<img src ="http://www.cppblog.com/changshoumeng/aggbug/126699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/changshoumeng/" target="_blank">长寿梦</a> 2010-09-15 22:32 <a href="http://www.cppblog.com/changshoumeng/archive/2010/09/15/126699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CButtonST使用技巧: CButtonST简介</title><link>http://www.cppblog.com/changshoumeng/archive/2010/05/12/115219.html</link><dc:creator>长寿梦</dc:creator><author>长寿梦</author><pubDate>Wed, 12 May 2010 12:25:00 GMT</pubDate><guid>http://www.cppblog.com/changshoumeng/archive/2010/05/12/115219.html</guid><wfw:comment>http://www.cppblog.com/changshoumeng/comments/115219.html</wfw:comment><comments>http://www.cppblog.com/changshoumeng/archive/2010/05/12/115219.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/changshoumeng/comments/commentRss/115219.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/changshoumeng/services/trackbacks/115219.html</trackback:ping><description><![CDATA[<p>文章本人转自：<a href="http://www.vckbase.com/document/viewdoc/?id=517"><u><font color=#800080>http://www.vckbase.com/document/viewdoc/?id=517</font></u></a></p>
<br>
<p>CButtonST类主要包括BtnST.h、BtnST.cpp、BCMenu.h和BCMenu.cpp四个文件。如果你打算使用CButtonST的窗口不止一个，那么我建议你在VC++的Workspace | FileView中导入以上的四个文件之后，然后在SdtAfx.h文件中添加合适的include语句，如#include "BtnST.h"。<br><br><br><br>在接下来的几篇文章中，我将根据作者提供的演示程序向大家介绍CButtonST的各种常用方法。在最后一篇文章中，将为各位提供CButtonST类的中文文档，以供各位在以后的使用中参考。</p>
<br>
<p><strong>效果一：在按钮上加入Icon，使Icon和文字同时显示 <br><br><br><br></strong>假设按钮ID为IDC_BUTTON1<br><br>1. 添加成员变量</p>
<br>
<pre>CButtonST	m_btn;</pre>
<br>
<p>2. 添加Icon资源，设其ID设为IDI_ICON1<br><br>3. 在OnInitDialog函数中初始化按钮</p>
<br>
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetFlat(FALSE);</pre>
<br>
<p>注意:为达到最好效果，请根据Icon的大小调整按钮的大小。<br><br>实例：演示程序中的Standar 按钮。<br><br><a name=F2></a><br><br><img height=16 alt="" src="http://www.vckbase.com/document/image/paragraph.gif" width=14> <strong>效果二：显示平面按钮</strong><br><br>只需要在效果一的基础上把m_btn.SetFlat(FALSE);语句去掉。<br><br><a id=F3 name=F3></a><br><br><img height=16 alt="" src="http://www.vckbase.com/document/image/paragraph.gif" width=14> <strong>效果三：使按钮上的图标可变</strong><br><br>假设按钮ID为IDC_BUTTON1<br><br>1. 添加成员变量</p>
<br>
<pre>CButtonST	m_btn;</pre>
<br>
<p>2. 添加两个Icon资源，ID设为IDI_ICON1和IDI_ICON2<br><br>IDI_ICON1是普通状态的图标，IDI_ICON2是按下时的图标<br><br><br><br>3. 在OnInitDialog函数中初始化按钮</p>
<br>
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON2,IDI_ICON1);</pre>
<br>
<p>实例：演示程序中的Halloween 按钮。 <br><br><a id=F4 name=F4></a><br><br><img height=16 alt="" src="http://www.vckbase.com/document/image/paragraph.gif" width=14> <strong>效果四：设置按钮在不同状态下的底色和文字颜色</strong> <br><br><br><br>假设按钮ID为IDC_BUTTON1<br><br>1. 添加成员变量</p>
<br>
<pre>CButtonST	m_btn;</pre>
<br>
<p>2. 添加Icon资源，设其ID设为IDI_ICON1<br><br>3. 在OnInitDialog函数中初始化按钮</p>
<br>
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(208,208,208));
m_btn.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS, RGB(208,208,208));
m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);</pre>
<br>
<p>提示：SetColor函数和OffsetColor函数的第一个参数表示按钮的各个状态，前景色就是文字的颜色，它们的取值表示：</p>
<br>
<pre>BTNST_COLOR_BK_IN	//鼠标放在按钮内时的背景色
BTNST_COLOR_FG_IN,	//鼠标放在按钮内时的前景色
BTNST_COLOR_BK_OUT,	//普通状态时的背景色
BTNST_COLOR_FG_OUT,	//普通状态时的前景色
BTNST_COLOR_BK_FOCUS,	//按钮被按下后的背景色
BTNST_COLOR_FG_FOCUS,	//按钮被按下后的前景色</pre>
<br>
<p>实例：演示程序中的48&#215;48 icon 按钮、Zip按钮等。<br><br><a id=F5 name=F5></a><br><br><img height=16 alt="" src="http://www.vckbase.com/document/image/paragraph.gif" width=14> <strong>效果五：设置图标和文字的位置</strong><br><br><br><br>假设按钮ID为IDC_BUTTON1<br><br>1.添加成员变量</p>
<br>
<pre>CButtonST	m_btn;</pre>
<br>
<p>2.添加Icon资源，ID设为IDI_ICON1<br><br>3.在OnInitDialog函数中初始化按钮</p>
<br>
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetAlign(CButtonST::ST_ALIGN_VERT);
</pre>
<br>
<p>提示：SetAlign函数的第一个参数表示位置信息，缺省情况下，文字在图标右边</p>
<br>
<pre>ST_ALIGN_HORIZ	// 文字在右
ST_ALIGN_VERT	//文字在下
ST_ALIGN_HORIZ_RIGHT// 文字在左
</pre>
<br>
<p>实例：演示程序中的Search 按钮。<br><br><a id=F6 name=F6></a><br><br><img height=16 alt="" src="http://www.vckbase.com/document/image/paragraph.gif" width=14> <strong>效果六：根据Icon的形状设置按钮的形状</strong><br><br><br><br>假设按钮ID为IDC_BUTTON1<br><br>1.添加成员变量</p>
<br>
<pre>CButtonST	m_btn;</pre>
<br>
<p>2.添加Icon资源，设其ID设为IDI_ICON1<br><br>3.在OnInitDialog函数中初始化按钮</p>
<br>
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.DrawBorder(FALSE);
m_btn.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(208,208,208));
m_btn.SetColor(CButtonST::BTNST_COLOR_BK_IN, RGB(208,208,208));
m_btn.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS, RGB(208,208,208));</pre>
<br>
<p>注意:为达到最好效果，请根据Icon的大小调整按钮的大小。<br><br>并根据实际情况设置背景颜色。请事先将按钮的文字去掉。<br><br><a id=F7 name=F7></a><br><br><img height=16 alt="" src="http://www.vckbase.com/document/image/paragraph.gif" width=14> <strong>效果七：添加Tooltips</strong><br><br><br><br>假设按钮ID为IDC_BUTTON1<br><br>1.添加成员变量</p>
<br>
<pre>CButtonST	m_btn;</pre>
<br>
<p>2.添加Icon资源，设其ID设为IDI_ICON1<br><br>3. 在OnInitDialog函数中初始化按钮</p>
<br>
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetTooltipText(_T("This is a tooltip.\r\nMultiline!"));</pre>
<br>
<p><br><br><strong>效果一：改变鼠标进入按钮时的形状(超链接效果)<br><br></strong>假设按钮ID为IDC_BUTTON1<br><br>1. 添加成员变量</p>
<br>
<pre>CButtonST    m_btn;</pre>
<br>
<p>2. 添加Icon资源，设其ID设为IDI_ICON1<br><br>3. 在OnInitDialog函数中初始化按钮</p>
<br>
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_btn.SetURL("www.scut.edu.cn");
m_btn.SetTooltipText("www.scut.edu.cn");
m_btn.SetBtnCursor(IDC_CURSOR1);
</pre>
<br>
<p><strong><a id=F2 name=F2></a><br><br><img height=16 alt="" src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 效果二：菜单按钮</strong><br><br><br><br>假设按钮ID为IDC_BUTTON1<br><br>1.添加成员变量<br><br>&nbsp;</p>
<br>
<pre>CButtonST    m_btn;</pre>
<br>
<p>2. 添加Icon资源，设其ID设为IDI_ICON1<br><br>3. 添加Menu，ID设为IDR_MENU<br><br>4. 在OnInitDialog函数中初始化按钮</p>
<br>
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_btn.SetMenu(IDR_MENU, m_hWnd);</pre>
<br>
<p>注意:菜单的效果类似与右键菜单，所有在设置菜单选项时只设置一列就够了。另外菜单的宽度与菜单的文字长度有关，可以用空格占位的办法以达到最佳效果。<br><br><br><br><strong>在菜单中引入位图的方法</strong><br><br><br><br>1.添加ToolBar，依次使用Menu菜单项ID作为ToolBar按钮的ID。<br><br>2.ToolBar上的按钮图标将显示在相应的菜单项中。<br><br>将上面代码中的m_btn.SetMenu(IDR_MENU, m_hWnd);<br><br>改为m_btn.SetMenu(IDR_MENU, m_hWnd, TRUE, IDR_TOOLBAR);<br><br>IDR_TOOLBAR为相应ToolBar的ID。<br><br><a id=F3 name=F3></a><br><br><strong><img height=16 alt="" src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 效果三：位图按钮</strong><br><br>假设按钮ID为IDC_BUTTON1<br><br>1.添加成员变量<br><br>&nbsp;</p>
<br>
<pre>CButtonST    m_btn;</pre>
<br>
<p>2.添加位图资源，ID设为IDB_BITMAP1<br><br>3.在OnInitDialog函数中初始化按钮</p>
<br>
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetBitmaps(IDB_BITMAP1,RGB(0,0,0));
m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);</pre>
<br>
<p><strong>提示:</strong> 上面的SetBitmaps函数会将图片中颜色值为RGB(0,0,0)的点设为透明。<br><br><a id=F4 name=F4></a><br><br><strong><img height=16 alt="" src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 效果四：按钮焦点</strong><br><br><br><br>假设按钮ID为IDC_BUTTON1<br><br>1.添加成员变量<br><br>&nbsp;</p>
<br>
<pre>CButtonST    m_btn;</pre>
<br>
<p>2. 添加Icon资源，设其ID设为IDI_ICON1<br><br>3. 在OnInitDialog函数中初始化按钮</p>
<br>
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.SetAlign(CButtonST::ST_ALIGN_VERT);
m_btn.DrawFlatFocus(TRUE);</pre>
<br>
<p><a id=F5 name=F5></a><br><br><strong><img height=16 alt="" src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 效果五：CheckBox按钮</strong><br><br><br><br>假设按钮ID为IDC_BUTTON1<br><br>1.添加成员变量<br><br>&nbsp;</p>
<br>
<pre>CButtonST    m_btn;</pre>
<br>
<p>2. 添加Icon资源，ID设为IDI_ICON1和IDI_ICON2<br><br>3.在OnInitDialog函数中初始化按钮</p>
<br>
<pre>m_btn.SubclassDlgItem(IDC_CHECK1,this);
m_btn.SetIcon(IDI_ICON1,IDI_ICON2);
m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
</pre>
<br>
<p><strong>提示:</strong><br><br>IDI_ICON1为选中时候显示的图标<br><br>IDI_ICON2为为选中时候的图标<br><br><a id=F6 name=F6></a><br><br><strong><img height=16 alt="" src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 效果六：透明按钮</strong><br><br><br><br>假设按钮ID为IDC_BUTTON1<br><br>1.添加成员变量<br><br>&nbsp;</p>
<br>
<pre>CButtonST    m_btn;</pre>
<br>
<p>2. 添加Icon资源，ID设为IDI_ICON1<br><br>3.在OnInitDialog函数中初始化按钮</p>
<br>
<pre>m_btn.SubclassDlgItem(IDC_BUTTON1,this);
m_btn.SetIcon(IDI_ICON1);
m_btn.DrawTransparent(TRUE);</pre>
<br>
<p><strong><a id=F7 name=F7></a><br><br><img height=16 alt="" src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 效果七：特殊的PictureBox</strong><br><br><br><br>利用CButtonST的特殊显示风格，完全可以把它当作一个PictureBox控件使用。这时一般会把按钮的属性设置为disable。<br><br>实例：演示程序的About页中使用了CButtonST来代替PictureBox。</p>
<br>
<p><strong>一、CWinXPButtonST类<br><br><br><br></strong>CWinXPButtonST类 是一个CButtonST的派生类。它的特点是使用了WindowsXP中的圆角、黑色边框的风格。它包括WinXPButtonST.h和WinXPButtonST.cpp两个文件，而由于它是从CButtonST派生而来的，所以在引用它时,也要一并引入CButtonST的文件。<br><br>使用：<br><br>1. 引入文件，添加文件<br><br>2. 导入文件后，在SdtAfx.h文件中添加</p>
<br>
<pre>#include "WinXPButtonST.h"</pre>
<br>
<p>3. 添加成员变量</p>
<br>
<pre>CWinXPButtonST	  m_btn2;</pre>
<br>
<p>4. 假设按钮ID为IDC_BUTTON<br><br>添加Icon资源，ID设为IDI_ICON1<br><br>5. 在OnInitDialog函数中初始化按钮<br><br>&nbsp;</p>
<br>
<pre>m_btn2.SubclassDlgItem(IDC_BUTTON,this);
m_btn2.SetIcon(IDI_ICON1);
m_btn2.SetRounded(TRUE);
</pre>
<br>
<p>注意：但是它存在一个不足的地方，就是按钮的圆角是画出来的，按钮的形状仍然是原来的矩形。所以如果在有背景色的窗口中使用该按钮的话就会显得相当碍眼。<br><br>如图所示，在黑色的背景色中显示出难看的尖角：<br><br><img height=168 alt="" src="http://www.vckbase.com/document/journal/vckbase17/images/CButtonST3a.gif" width=536><br><br><br><br>解决的办法是通过SetColor函数使得按钮的底色与窗口的底色一致。 <br><br><br><br><strong><img height=16 alt="" src="http://www.vckbase.com/document/image/paragraph.gif" width=14> 二、CShadeButtonST类</strong><br><br><br><br>CShadeButtonST类 是CButtonST的另一个派生类。它的特点是支持更为多样化的背景，通过SetShade函数可以为按钮设置9种不通的背景效果。它包括四个文件，它们分别是CeXDib.h、CeXDib.cpp、ShadeButtonST.h和ShadeButtonST.cpp。在引用它时,同样要一并引入CButtonST的文件。<br><br>使用：<br><br>1.引入文件，添加文件<br><br>2.导入文件后，在SdtAfx.h文件中添加<br><br>&nbsp;</p>
<br>
<pre>#include "ShadeButtonST.h"</pre>
<br>
<p>3.添加成员变量</p>
<br>
<pre>CShadeButtonST	m_btn3;</pre>
<br>
<p>4.假设按钮ID为IDC_BUTTON3<br><br>添加Icon资源，ID设为IDI_ICON1<br><br><br><br>5.在OnInitDialog函数中初始化按钮</p>
<br>
<pre>m_btn3.SubclassDlgItem(IDC_BUTTON3,this);
m_btn3.SetIcon(IDI_ICON1);
m_btn3.SetShade(CShadeButtonST::SHS_METAL);
</pre>
<br>
<p>下面给出各种背景效果和对应的参数值。<br><br><img height=336 alt="" src="http://www.vckbase.com/document/journal/vckbase17/images/CButtonST4.gif" width=497><br><br><img height=318 alt="" src="http://www.vckbase.com/document/journal/vckbase17/images/CButtonST4a.gif" width=491>&nbsp;</p>
<br>
<img src ="http://www.cppblog.com/changshoumeng/aggbug/115219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/changshoumeng/" target="_blank">长寿梦</a> 2010-05-12 20:25 <a href="http://www.cppblog.com/changshoumeng/archive/2010/05/12/115219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC下ADO数据库操作的封装类</title><link>http://www.cppblog.com/changshoumeng/archive/2010/05/12/115216.html</link><dc:creator>长寿梦</dc:creator><author>长寿梦</author><pubDate>Wed, 12 May 2010 11:35:00 GMT</pubDate><guid>http://www.cppblog.com/changshoumeng/archive/2010/05/12/115216.html</guid><wfw:comment>http://www.cppblog.com/changshoumeng/comments/115216.html</wfw:comment><comments>http://www.cppblog.com/changshoumeng/archive/2010/05/12/115216.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/changshoumeng/comments/commentRss/115216.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/changshoumeng/services/trackbacks/115216.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: /**//******************************************************************&nbsp;模块名称：数据库操作类；&nbsp;实现功能：提供接口，实现数据的索引，和操作。&nbsp;研究人员：长寿梦；&nbsp;最后更新：2010-05-12&nbsp;预先操作：&nbsp;【1】在stdafx.h中添加&nbsp;&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.cppblog.com/changshoumeng/archive/2010/05/12/115216.html'>阅读全文</a><img src ="http://www.cppblog.com/changshoumeng/aggbug/115216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/changshoumeng/" target="_blank">长寿梦</a> 2010-05-12 19:35 <a href="http://www.cppblog.com/changshoumeng/archive/2010/05/12/115216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>