??xml version="1.0" encoding="utf-8" standalone="yes"?>
2012-08-15 changshoumeng试验成功
1. 安装?br /> sc_vs.net_2003_prereq.iso
VS.Net_2003_Enar_CHS_CD1.ISO
VS.Net_2003_Enar_CHS_CD2.ISO
2. 安装步骤
2.1 安装 sc_vs.net_2003_prereq.iso
可能出现问题QFrontPage2000 服务器扩展安装失败?br /> 解决办法Q?br />
aQ下载关于iis的完整包
(说明Q这一步解决的问题是,xp上可能ƈ没有iis的安装文?
控制面板/d或删除文?d或删除windowslg/
b: 首先 N?[附g和工具] /详细信息D/取消N游?定
(说明Q这一步解决的问题是,安装IIS 时出现安装程序无法复制文件zClinettm.exe)
c: 然后 N?[Inernet信息服务(IIS)] /详细信息D/NFrontPage2000 服务扩展
点击下一?q行安装?br /> (说明Q这一步解决的问题ӞFrontPage2000 服务器扩展组件安装失?
2.2 安装VS.Net_2003_Enar_CHS_CD1.ISO
可能出现的问题:
错误 1308。未扑ֈ源文? d:\everbox\vs2003\vs.net_2003_enar_chs_cd1\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1
\Docs\2052\cpsamples.HxS。请验证文g是否存在以及是否可以讉K它?br /> 解决办法Q?br /> q些文gQ都来自于VS.Net_2003_Enar_CHS_CD2.ISO里;
只要从光?里把对应的文件拷贝到光盘1里,p了?br /> 但是Q如果这L话,q样的操作就会出现很多次Q颇为繁琐?br /> 于是我想Q假如能够光?与光?合ƈ一个光盘就好了。解军_法,使用文g同步工具 GoodSyncProQ?br /> 两个文件夹q行合ƈ?br /> l箋点击重试Q进行安装,q样安装ok了?/p>
参考网文:
http://hi.baidu.com/vc_net/item/086b31dff8ee4df792a97455
http://www.codesky.net/article/200911/125322.html
MFC应用E序中处理消息的序
1.AfxWndProc()
2.AfxCallWndProc()
3.WindowProc()
4.OnWndMsg()
5.OnCommand()
6.OnCmdMsg()
MFC应用E序创徏H口的过E?/strong>
1.PreCreateWindow()
2.PreSubclassWindow()
3.OnGetMinMaxInfo()
4.OnNcCreate()
5.OnNcCalcSize()
6.OnCreate()
7.OnSize()
8.OnMove()
9.OnChildNotify()
MFC应用E序关闭H口的顺?非模态窗?
1.OnClose()
2.OnDestroy()
3.OnNcDestroy()
4.PostNcDestroy()
MFC应用E序中打开模式对话框的函数调用序
1.DoModal()
2.PreSubclassWindow()
3.OnCreate()
4.OnSize()
5.OnMove()
6.OnSetFont()
7.OnInitDialog()
8.OnShowWindow()
9.OnCtlColor()
10. OnChildNotify()
MFC应用E序中关闭模式对话框的顺?/strong>
1.OnClose()
2.OnKillFocus()
3.OnDestroy()
4.OnNcDestroy()
5.PostNcDestroy()
打开无模式对话框的顺?/strong>
1.PreSubclassWindow()
2.OnCreate()
3.OnSize()
4.OnMove()
5.OnSetFont()
http://blog.sina.com.cn/s/blog_55cf5f230100p471.html
CPU三种模式
处理器有3U工作模式:实模式、保护模式和虚拟86模式。实模式和虚?/span>86模式是ؓ了和8086处理器兼容而设|的。在实模式下Q?/span>80386处理器就相当于一个快速的8086处理器。保护模式是80386处理器的主要工作模式。在此方式下Q?/span>80386可以d4GB的地址I间Q同Ӟ保护模式提供?/span>80386先进的多d、内存分늮理和优先U保护等机制。ؓ了在保护模式下l提供和8086处理器的兼容Q?/span>80386又设计了一U虚?/span>86模式Q以便可以在保护模式的多d条g下,有的dq行32位程序,有的dq行MS-DOSE序。在虚拟86模式下,同样支持d切换、内存分늮理和优先U,但内存的d方式?/span>8086相同Q也是可以寻址1 MB的空间?/span>
【批注:处理器从8086升?/span>80386Q工作模式也从实模式升C护模式,Z兼容8086产生虚拟86模式?/span>
由此可见Q?/span>80386处理器的3U工作模式各有特点且怺联系。实模式?/span>80386处理器工作的基础Q这?/span>80386当做一个快速的8086处理器工作?strong style="mso-bidi-font-weight: normal">在实模式下可以通过指o切换C护模式,也可以从保护模式退回到实模式?/span>虚拟86模式则以保护模式为基Q在保护模式和虚?/span>86模式之间可以互相切换Q但不能从实模式直接q入虚拟86模式或从虚拟86模式直接退到实模式?/span>
【批注:实模?#8594;保护模式→虚拟86模式?/span>
1. 实模?/span>
80386处理器被复位或加늚时候以实模式启动。这时候处理器中的各寄存器以实模式的初始化值工作?/span>80386处理器在实模式下的存储器d方式?/span>8086是一LQ由D寄存器的内容乘?/span>16当做基地址Q加上段内的偏移地址形成最l的物理地址Q这时候它?/span>32位地址U只使用了低20?/span>。在实模式下Q?/span>80386处理器不能对内存q行分页理Q所以指令寻址的地址是内存中实际的物理地址。在实模式下Q所有的D都是可以读、写和执行的?/span>
【批注:物理地址?/span>
实模式下80386不支持优先Q所有的指o相当于工作在ҎU(优先U?/span>0Q,所以它可以执行所有特权指令,包括d控制寄存?/span>CR0{。实际上Q?/span>80386是通过在实模式下初始化控制寄存器,GDTRQ?/span>LDTRQ?/span>IDTR?/span>TR{管理寄存器以及表Q然后再通过加蝲CR0使其中的保护模式使能位置位而进入保护模式的。实模式下不支持g上的多Q务切换?/span>
【批注:多Q务?/span>
实模式下的中断处理方式和8086处理器相同,也用中断向量表来定位中断服务E序地址。中断向量表的结构也?/span>8086处理器一P?/span>4个字节组成一个中断向量,其中包括两个字节的段地址和两个字节的偏移地址?/span>
【批注:中断向量?/span>
从编E的角度看,除了可以讉K80386新增的一些寄存器外,实模式的80386处理器和8086有什么进步呢Q?span style="COLOR: red">其实最大的好处是可以?/span>80386?/span>32位寄存器Q用32位的寄存器进行编E可以计算E序更加P加快了执行速度。比如在8086时代?/span>16位寄存器来完?/span>32位的乘法和除法时Q要q行的步骤实在是太多了,于是考试时出q一cȝ题目成了老师们的最爱,所以那时候当学生做梦都想着让寄存器的位数快快长Q现在梦想终于成真了Q用32位寄存器一条指令就可以完成Q问题是老师们也发现了这个投机取巧的办法Qؓ了达到让学生们基扎实的目的,也把题目换成?/span>64位的乘法和除法,所以现在晚上做的梦换成了寄存器忽然长到?/span>64位)Q其ơ,80386?span style="COLOR: red">增加的两个辅助段寄存?/span>FS?/span>GS在实模式下也可以使用Q这P同时可以讉K的段辑ֈ?/span>6个而不必考虑重新装入的问题;最后,很多80386?strong style="mso-bidi-font-weight: normal">新增指o也一些原来不很方便的操作得以?/span>Q如80386中可以用下q指令进行数l访问:
mov cx, [eax + ebx*2 + 数组基地址]
q相当于把数l中下标?/span>eax?/span>ebx的项目放?/span>cx中;ebx * 2中的2可以?/span>1Q?/span>2Q?/span>4?/span>8Q这样就可以支持8位到64位的数组。而在8086处理器中Q实现相同的功能要进行一ơ乘法和两次加法。另外,pushad?/span>popad指o可以一ơ把所?/span>8个通用寄存器的值压入或从堆栈中弹出Q比L下面的指令分别将8个寄存器入栈要快了很多:
push eax
push ebx
...
pop ebx
pop eax
当然Q用了q些新指令的E序是无法拿回到8086处理器上L行的Q因些指令的~码?/span>8086处理器上是未定义的?/span>
【批注:新增针对Q2位寄存器的指令,化操作?/span>
2. 保护模式
?/span>80386工作在保护模式下的时候,它的所有功能都是可用的。这?/span>80386所有的32根地址UK可供dQ物理寻址I间高达4 GB。在保护模式下,支持内存分页机制Q提供了对虚拟内存的良好支持。虽然与8086可寻址?/span>1 MB物理地址I间相比Q?/span>80386可寻址的物理地址I间可谓很大Q但实际的微机系l不可能安装如此大的物理内存。所以,Zq行大型E序和真正实现多dQ虚拟内存是一U必需的技术?/span>
【批注:虚拟内存?/span>
保护模式?/span>80386支持多Q?/span>Q可以依靠硬件仅在一条指令中实现d切换。Q务环境的保护工作是由处理器自动完成的。在保护模式下,80386处理器还支持优先U机?/span>Q不同的E序可以q行在不同的优先U上。优先一共分0?/span>3 4个别,操作pȝq行在最高的优先U?/span>0上,应用E序则运行在比较低的U别上;配合良好的检查机制后Q既可以在Q务间实现数据的安全共享也可以很好地隔d个Q务。从实模式切换到保护模式是通过修改控制寄存?/span>CR0的控制位PEQ位0Q来实现的。在q之前还需要徏立保护模式必需的一些数据表Q如全局描述W表GDT和中断描q符?/span>IDT{?/span>
DOS操作pȝq行于实模式下,?/span>Windows操作pȝq行于保护模式下?/span>
【批注:多Q务,优先U?/span>
3. 虚拟86模式
虚拟86模式是ؓ了在保护模式下执?/span>8086E序而设|的。虽?/span>80386处理器已l提供了实模式来兼容8086E序Q但q时8086E序实际上只是运行得快了一点,?/span>CPU的资源还是独占的。在保护模式的多d环境下运行这些程序时Q它们中的很多指令和保护模式环境格格不入Q如D寻址方式、对中断的处理和I/O操作的特权问题等。ؓ了在保护模式下工作而丢弃这些程序的代h是巨大的。设想一下,如果Windows?/span>80386处理器推出的时候宣布不能运行以前的MS-DOSE序Q那么就{于攑ּ了一个巨大的软g库,Windows以及80386处理器可能就会落得和ҎZL下场Q这?/span>Microsoft?/span>Intel都不愿看到的。所以,80386处理器又设计了一个虚?/span>86模式?/span>
【批注:在保护模式下Q兼?/span>8086?/span>
虚拟86模式是以d形式在保护模式上执行的,?/span>80386上可以同时支持由多个真正?/span>80386d和虚?/span>86模式构成的Q务。在虚拟86模式下,80386支持d切换和内存分c在Windows操作pȝ中,有一部分E序专门用来理虚拟86模式的Q务,UCؓ虚拟86理E序?/span>
既然虚拟86模式以保护模式ؓ基础Q它?strong style="mso-bidi-font-weight: normal">工作方式实际上是实模式和保护模式的?/span>。ؓ了和8086E序的寻址方式兼容Q虚?/span>86模式采用?/span>8086一Ld方式Q即用段寄存器乘?/span>16当做基址再配合偏Ud址形成U性地址Q寻址I间?/span>1 MB。但昄多个虚拟86d不能同时使用同一位置?/span>1 MB地址I间Q否则会引v冲突。操作系l利用分|制将不同虚拟86d的地址I间映射C同的物理地址上去Q这h个虚?/span>86d看v来都认ؓ自己在?/span>0?/span>1MB的地址I间?/span>
【批注:虚拟86模式 = 实模?/span> + 保护模式?/span>
8086代码中有相当一部分指o在保护模式下属于Ҏ指oQ如屏蔽中断?/span>cli和中断返回指?/span>iret{。这些指令在8086E序中是合法的。如果不让这些指令执行,8086代码无法工作。ؓ了解册个问题,虚拟86理E序采用模拟的方法来完成q些指o。这些特权指令执行的时候引起了保护异常。虚?/span>86理E序在异常处理程序中查生异常的指oQ如果是中断指oQ则从虚?/span>86d的中断向量表中取Z断处理程序的入口地址Qƈ控制{U过去;如果是危及操作系l的指oQ如cli{,则简单地忽略q些指oQ在异常处理E序q回的时候直接返回到下一条指令。通过q些措施Q?/span>8086E序既可以正常地q行下去Q在执行q些指o的时候又觉察不到已经被虚?/span>86理E序做了手脚?/span>MS-DOS应用E序?/span>Windows操作pȝ中就是这样工作的?/span>
CButtonSTcM要包括BtnST.h、BtnST.cpp、BCMenu.h和BCMenu.cpp四个文g。如果你打算使用CButtonST的窗口不止一个,那么我徏议你在VC++的Workspace | FileView中导入以上的四个文g之后Q然后在SdtAfx.h文g中添加合适的include语句Q如#include "BtnST.h"?br>
在接下来的几文章中Q我根据作者提供的演示E序向大家介lCButtonST的各U常用方法。在最后一文章中Q将为各位提供CButtonSTcȝ中文文档Q以供各位在以后的用中参考?/p>
效果一Q在按钮上加入IconQIcon和文字同时显C?
假设按钮ID为IDC_BUTTON1
1. d成员变量
CButtonST m_btn;
2. dIcon资源Q设其ID设ؓIDI_ICON1
3. 在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetIcon(IDI_ICON1); m_btn.SetFlat(FALSE);
注意:到最好效果,h据Icon的大调整按钮的大小?br>
实例Q演C程序中的Standar 按钮?br> 效果二:昄q面按钮
只需要在效果一的基上把m_btn.SetFlat(FALSE);语句L?br> 效果三:使按钮上的图标可?/strong>
假设按钮ID为IDC_BUTTON1
1. d成员变量
CButtonST m_btn;
2. d两个Icon资源QID设ؓIDI_ICON1和IDI_ICON2
IDI_ICON1是普通状态的图标QIDI_ICON2是按下时的图?br>
3. 在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetIcon(IDI_ICON2,IDI_ICON1);
实例Q演C程序中的Halloween 按钮? 效果四:讄按钮在不同状态下的底色和文字颜色
假设按钮ID为IDC_BUTTON1
1. d成员变量
CButtonST m_btn;
2. dIcon资源Q设其ID设ؓIDI_ICON1
3. 在OnInitDialog函数中初始化按钮
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);
提示QSetColor函数和OffsetColor函数的第一个参数表C按钮的各个状态,前景色就是文字的颜色Q它们的取DC:
BTNST_COLOR_BK_IN //鼠标攑֜按钮内时的背景色 BTNST_COLOR_FG_IN, //鼠标攑֜按钮内时的前景色 BTNST_COLOR_BK_OUT, //普通状态时的背景色 BTNST_COLOR_FG_OUT, //普通状态时的前景色 BTNST_COLOR_BK_FOCUS, //按钮被按下后的背景色 BTNST_COLOR_FG_FOCUS, //按钮被按下后的前景色
实例Q演C程序中?8×48 icon 按钮、Zip按钮{?br> 效果五:讄图标和文字的位置
假设按钮ID为IDC_BUTTON1
1.d成员变量
CButtonST m_btn;
2.dIcon资源QID设ؓIDI_ICON1
3.在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetIcon(IDI_ICON1); m_btn.SetAlign(CButtonST::ST_ALIGN_VERT);
提示QSetAlign函数的第一个参数表CZ|信息,~省情况下,文字在图标右?/p>
ST_ALIGN_HORIZ // 文字在右 ST_ALIGN_VERT //文字在下 ST_ALIGN_HORIZ_RIGHT// 文字在左
实例Q演C程序中的Search 按钮?br> 效果六:ҎIcon的Ş状设|按钮的形状
假设按钮ID为IDC_BUTTON1
1.d成员变量
CButtonST m_btn;
2.dIcon资源Q设其ID设ؓIDI_ICON1
3.在OnInitDialog函数中初始化按钮
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));
注意:到最好效果,h据Icon的大调整按钮的大小?br>
q根据实际情况设|背景颜艌Ӏ请事先按钮的文字L?br> 效果七:dTooltips
假设按钮ID为IDC_BUTTON1
1.d成员变量
CButtonST m_btn;
2.dIcon资源Q设其ID设ؓIDI_ICON1
3. 在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetIcon(IDI_ICON1); m_btn.SetTooltipText(_T("This is a tooltip.\r\nMultiline!"));
效果一Q改变鼠标进入按钮时的Ş?链接效?
假设按钮ID为IDC_BUTTON1
1. d成员变量
CButtonST m_btn;
2. dIcon资源Q设其ID设ؓIDI_ICON1
3. 在OnInitDialog函数中初始化按钮
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);
效果二:菜单按钮
假设按钮ID为IDC_BUTTON1
1.d成员变量
CButtonST m_btn;
2. dIcon资源Q设其ID设ؓIDI_ICON1
3. dMenuQID设ؓIDR_MENU
4. 在OnInitDialog函数中初始化按钮
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);
注意:菜单的效果类g右键菜单Q所有在讄菜单选项时只讄一列就够了。另外菜单的宽度与菜单的文字长度有关Q可以用I格占位的办法以辑ֈ最x果?br>
在菜单中引入位图的方?/strong>
1.dToolBarQ依ơ用Menu菜单ID作ؓToolBar按钮的ID?br>
2.ToolBar上的按钮图标显C在相应的菜单项中?br>
上面代码中的m_btn.SetMenu(IDR_MENU, m_hWnd);
改ؓm_btn.SetMenu(IDR_MENU, m_hWnd, TRUE, IDR_TOOLBAR);
IDR_TOOLBAR为相应ToolBar的ID?br> 效果三:位图按钮
假设按钮ID为IDC_BUTTON1
1.d成员变量
CButtonST m_btn;
2.d位图资源QID设ؓIDB_BITMAP1
3.在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetBitmaps(IDB_BITMAP1,RGB(0,0,0)); m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
提示: 上面的SetBitmaps函数会将囄中颜色gؓRGB(0,0,0)的点设ؓ透明?br> 效果四:按钮焦点
假设按钮ID为IDC_BUTTON1
1.d成员变量
CButtonST m_btn;
2. dIcon资源Q设其ID设ؓIDI_ICON1
3. 在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetIcon(IDI_ICON1); m_btn.SetAlign(CButtonST::ST_ALIGN_VERT); m_btn.DrawFlatFocus(TRUE);
效果五:CheckBox按钮
假设按钮ID为IDC_BUTTON1
1.d成员变量
CButtonST m_btn;
2. dIcon资源QID设ؓIDI_ICON1和IDI_ICON2
3.在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(IDC_CHECK1,this); m_btn.SetIcon(IDI_ICON1,IDI_ICON2); m_btn.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
提示:
IDI_ICON1为选中时候显C的图标
IDI_ICON2Zؓ选中时候的图标 效果六:透明按钮
假设按钮ID为IDC_BUTTON1
1.d成员变量
CButtonST m_btn;
2. dIcon资源QID设ؓIDI_ICON1
3.在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(IDC_BUTTON1,this); m_btn.SetIcon(IDI_ICON1); m_btn.DrawTransparent(TRUE);
效果七:Ҏ的PictureBox
利用CButtonST的特D显C风|完全可以把它当作一个PictureBox控g使用。这时一般会把按钮的属性设|ؓdisable?br>
实例Q演C程序的About中使用了CButtonST来代替PictureBox?/p>
一、CWinXPButtonSTc?br>
CWinXPButtonSTc?是一个CButtonST的派生类。它的特Ҏ使用了WindowsXP中的圆角、黑色边框的风格。它包括WinXPButtonST.h和WinXPButtonST.cpp两个文gQ而由于它是从CButtonSTz而来的,所以在引用它时,也要一q引入CButtonST的文件?br>
使用Q?br>
1. 引入文gQ添加文?br>
2. 导入文g后,在SdtAfx.h文g中添?/p>
#include "WinXPButtonST.h"
3. d成员变量
CWinXPButtonST m_btn2;
4. 假设按钮ID为IDC_BUTTON
dIcon资源QID设ؓIDI_ICON1
5. 在OnInitDialog函数中初始化按钮
m_btn2.SubclassDlgItem(IDC_BUTTON,this); m_btn2.SetIcon(IDI_ICON1); m_btn2.SetRounded(TRUE);
注意Q但是它存在一个不的地方Q就是按钮的圆角是画出来的,按钮的Ş状仍然是原来的矩形。所以如果在有背景色的窗口中使用该按钮的话就会显得相当碍眹{?br>
如图所C,在黑色的背景色中昄出难看的角Q?br>
解决的办法是通过SetColor函数使得按钮的底色与H口的底色一致? 二、CShadeButtonSTc?/strong>
CShadeButtonSTc?是CButtonST的另一个派生类。它的特Ҏ支持更ؓ多样化的背景Q通过SetShade函数可以为按钮设|?U不通的背景效果。它包括四个文gQ它们分别是CeXDib.h、CeXDib.cpp、ShadeButtonST.h和ShadeButtonST.cpp。在引用它时,同样要一q引入CButtonST的文件?br>
使用Q?br>
1.引入文gQ添加文?br>
2.导入文g后,在SdtAfx.h文g中添?br>
#include "ShadeButtonST.h"
3.d成员变量
CShadeButtonST m_btn3;
4.假设按钮ID为IDC_BUTTON3
dIcon资源QID设ؓIDI_ICON1
5.在OnInitDialog函数中初始化按钮
m_btn3.SubclassDlgItem(IDC_BUTTON3,this); m_btn3.SetIcon(IDI_ICON1); m_btn3.SetShade(CShadeButtonST::SHS_METAL);
下面l出各种背景效果和对应的参数倹{?br>