??xml version="1.0" encoding="utf-8" standalone="yes"?>
---- Ҏ(gu)一Q调?/span>CWinAppcȝ成员函数SetDialogBkColor来实现?/span>
---- 其中函数的第一个参数指定了背景颜色Q第二个参数指定?span style="COLOR: red">文本颜色?/span>
下面的例子是应用程序对话框讄色背景和U色文本Q步骤如下:
---- ?/span> 新徏一个基?/span>Dialog?/span>MFC AppWizard应用E序ExampleDlg?/span>
---- ?/span> ?/span>CExampleDlgApp ::InitInstance()中添加如下代码:
BOOL CExampleDlgApp: : InitInstance ( )
{
…
CExampleDlgDlg dlg;
m_pMainWnd = &dlg;
//先于DoModal()调用Q将对话框设|ؓ蓝色背景、红色文?/span>
SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));
int nResponse = dlg.DoModal();
…
}
---- ~译q运行,此时对话框的背景色和文本色已发生了改变。值得注意的是Q在调用DoModal()之前必须先调?/span>SetDialogBkColorQ且此方法是改变应用程序中所有的对话框颜Ԍq不能针Ҏ(gu)一个指定的对话框?/span>
---- Ҏ(gu)二:重蝲OnPaint()Q即WM_PAINT消息。有关代码如下(以上例工Eؓ准)Q?/span>
void CExampleDlgDlg::OnPaint()
{
if (IsIconic())
…
else
{
CRect rect;
CPaintDC dc(this);
GetClientRect(rect);
dc.FillSolidRect(rect,RGB(0,255,0)); //讄为绿色背?/span>
CDialog::OnPaint();
}
---- Ҏ(gu)三:重蝲OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor)Q即WM_CTLCOLOR消息?/span>
具体步骤如下Q以上例工程为准Q:
---- ①在CExampleDlgDlg的头文g中,d一CBrush的成员变量:
class CExampleDlgDlg : public CDialog
{
...
protected:
CBrush m_brush;
...
} ;
---- ②在OnInitDialog()函数中添加如下代码:
BOOL CExampleDlgDlg::OnInitDialog()
{
...
// TODO: Add extra initialization here
m_brush.CreateSolidBrush(RGB(0, 255, 0)); // 生成一l色刷子
...
}
---- ③利?/span>ClassWizard重蝲OnCtlColor(…)Q即WM_CTLCOLOR消息Q?/span>
HBRUSH CExampleDlgDlg::OnCtlColor
(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
/*
** q里不必~写M代码Q?/span>
**下行代码要注释掉
** HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
*/
return m_brush; //q加l色刷子
}
---- Ҏ(gu)四:q是重蝲OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor)Q即WM_CTLCOLOR消息?/span>
具体步骤如下Q以上例工程为准Q:
---- 步骤①、②同上Ҏ(gu)三中的步骤①、②?/span>
---- 步骤③利?/span>ClassWizard重蝲OnCtlColor(…)Q即WM_CTLCOLOR消息Q时则有些不同:
HBRUSH CExampleDlgDlg::OnCtlColor
(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
//在这加一条是否ؓ对话框的判断语句
if(nCtlColor ==CTLCOLOR_DLG)
return m_brush; //q加l色刷子
return hbr;
}
---- ~译q运行即可?/span>
---- 关于如何改变对话框背景颜色的问题Q可能还有很多种不同Ҏ(gu)可以实现Q笔者在q仅丑և四种常见的方法。其中方法三的编E似乎有点不太规范,Ҏ(gu)四则要比Ҏ(gu)三正l些Q笔者这LҎ(gu)举例是ؓ了拓?/span>VC~程爱好者特别是初学者的~程思\Q?/span>
资源|络攉 感谢原创?/span>
转自http://blog.sina.com.cn/s/blog_5678943c0100d4po.html
本章回答了如下几个问题:
?什么是多Q务操作系l?多Q务操作系l有哪些cdQ它们有何区别?
?Z么要使用多线E呢Qؓ什么不使用多进E?U程、进E,它们到底是什么样的东东?
?多线E是如何实现的?U程是如何切换的Q效率怎样Q?/span>
?多线E设计是如此的诱人,N什么代价也不用付出Q怎样才能很好地进行多U程设计呢?
合作?/span>[cooperative]多Q务和抢先?/span>[preemptive]多Q务有何不同?
两者的最大区别是谁来把握CPU的分?/span>。前者由E序员的“举止良好”才可做到Q后者则由操作系l决定,可以应用E序?/span>CPU分nl别人?/span>
Microsoft Windows的前三个版本Q?/span>1?/span>2?/span>3Q属于合作型多Q务操作系l,Windows4.0Q即WindowsQ?/span>95后均属于强先式多d操作pȝ?/span>
CQ一个永q有反映?/span>UIQ?/span>User InterfaceQ是很重要的?/span>
U程和进E有何不同?
?/span>Win32的角度看Q?span style="BACKGROUND: lime; mso-highlight: lime">q程拥有内存和资源?/span>资源则包括核心对象(如文件句柄和U程Q、用戯源(如对话框和字W串Q?/span>GDI资源Q如Device Context?/span>brushesQ?/span>
q程本nq不能够执行Q它只是提供一个安|内存和U程的地斏V?/span>Q进E就是一大堆对象的拥有权的集合。也是_q程可以拥有内存上下文、文件句柄、线E及一大串DLL模块Q被载入到这一q程地址I间中)?/span>
q程和内存ƈ没有真正“?/span>”什么事情?span style="BACKGROUND: lime; mso-highlight: lime">一?/span>CPU开始执行代码,你就拥有了一?/span>“U程”。在同一旉同一q程Q你可以拥有一大把U程Q执行同一D代?/span>?/span>
Z么不使用多个q程Q?/span>
较之q程Q线E轻ѝh(hun)廉,启动速度快,退出比较快Q对pȝ资源的冲L较小?/span>
如果使用多进E,最困难的问题是如何把窗口句柄交l另一个进E。在Win32中,句柄只在其诞生地Q进E中Q才有意义。这是一U安全警戒,避免某个q程有意无意地危及到另一个进E的资源?/span>
Z分nH口句柄Q你必须明明白白C生该句柄的一个副本,q且可以被其他进E用。在一个多U程E序中,所有线E都可以使用q个H口的句?/span>Q因为句柄和U程生活在同一个进E中?/span>
如果两个U程分属不同的进E,那它们通常没有办法׃nM内存。不?span style="BACKGROUND: lime; mso-highlight: lime">q程间如果要通讯Q唯有依赖特别的设计Q之拥有共享内存(shared memoryQ?/span>
如果两线E属于同一q程Q它们将׃n所有的内存Q包括全局变量、静态变?/span>Q?/span>
Context Switching?/span>Context Switch效率
要切换不同的U程Q操作系l应先切换该U程所隶属之进E的内存Q然后恢复该U程存放?/span>CONTEXTl构中的寄存器倹{此q程UCؓcontext switch?/span>
注:CONTEXTl构中保存了该线E上ơ被打断时线E当时的状态,也就?/span>CPU内所有寄存器的内宏V?/span>
当然Q天下没有免费的午餐Q线E切换时都要~点效率E金?/span>
对于?/span>CPU而言Q抢先式多Q务?sh)脑看v来可以同时处理多个Q务。但微观上看QQ一时刻Q?/span>CPU只能做一件事?/span>
?/span>CPU的好处是Q?/span>CPU多Q就有越多线E可以同时执行,不需?/span>context switchQ从而提高了pȝ效率?/span>
竞争条gQ?/span>Race ConditionsQ和原子操作Q?/span>Atomic OperationsQ?/span>
注意在多d操作pȝ中,一?/span>C指o一定可以安全执行完?/span>Q而不在乎context switch是否发生?/span>
好消息与坏消?/span>
使用U程q没有代h(hun)?span style="BACKGROUND: lime; mso-highlight: lime">采用多线E设计往往会加大程序设计的复杂性,必须做到心_ֿ安排Q才能实现预期目标?/span>
成功的秘诀是小心地规划Q谁要什么?何时要?怎么要?
d概念Q?/span>taskQ?/span>
d是由软g完成的一个活动,是一pd辑ֈ某种共同目的的操?/span>。一个Q务既可以׃个进E实玎ͼ也可以作Z个线E来实现?/span>
q程概念 Q?/span>processQ?/span>
q程是表C源分配的基本单位Q?/strong>又是调度q行的基本单位。例如,用户q行自己的程序,pȝ创Z个进E,qؓ它分配资源,包括各种表格、内存空间、磁盘空间?/span>IQ?/span>O讑֤{。然后,把该q程放hq程的就l队列。进E调度程序选中它,为它分配CPU以及其它有关资源Q该q程才真正运行。所以,q程是系l中的ƈ发执行的单位?/span>
?/span>Mac?/span>Windows NT{采用微内核l构的操作系l中Q进E的功能发生了变化:它只是资源分配的单位Q而不再是调度q行的单位。在微内核系l中Q真正调度运行的基本单位是线E。因此,实现q发功能的单位是U程?/span>
U程概念Q?/span>treadQ?/span>
U程是进E中执行q算的最单位,亦即执行处理度的基本单位。如果把q程理解为在逻辑上操作系l所完成的Q务,那么U程表示完成该Q务的许多可能的子d之一。例如,假设用户启动了一个窗口中的数据库应用E序Q操作系l就对数据库的调用表示Z个进E。假讄戯从数据库中生一份工资单报表Qƈ传到一个文件中Q这是一个子dQ在产生工资单报表的q程中,用户又可以输人数据库查询hQ这又是一个子d。这P操作pȝ则把每一个请求――工资单报表和新输h的数据查询表CZؓ数据库进E中的独立的U程。线E可以在处理器上独立调度执行Q这P在多处理器环境下允许几个线E各自在单独处理器上q行?span style="COLOR: red">操作pȝ提供U程是Z方便而有效地实现q种q发?/span>
q程和线E的关系
Q?/span>1Q一个线E只能属于一个进E,而一个进E可以有多个U程Q但臛_有一个线E?/span>
Q?/span>2Q资源分配给q程Q同一q程的所有线E共享该q程的所有资源?/span>
Q?/span>3Q处理机分给U程Q即真正在处理机上运行的是线E?/span>
Q?/span>4Q线E在执行q程中,需要协作同步。不同进E的U程间要利用消息通信的办法实现同步?/span>
引入U程的好?/span>
Q?/span>1Q易于调度?/span>
Q?/span>2Q提高ƈ发性。通过U程可方便有效地实现q发性。进E可创徏多个U程来执行同一E序的不同部分?/span>
Q?/span>3Q开销。创建线E比创徏q程要快Q所需开销很少。?/span>
Q?/span>4Q利于充分发挥多处理器的功能。通过创徏多线E进E(即一个进E可h两个或更多个U程Q,每个U程在一个处理器上运行,从而实现应用程序的q发性,使每个处理器都得到充分运行?/span>
多线E技?/span>
多线E应用程序将E序划分为多个独立的dQ每个Q务由一个线E处理。多U程处理可以同时q行多个U程?/span>
多线E技术的优点
(1)多线E技术ɽE序的响应速度更快 ,因ؓ用户界面可以在进行其它工作的同时一直处于活动状?/span>;
(2)当前没有q行处理的Q务时可以处理器旉让给其它d;
(3)占用大量处理旉的Q务可以定期将处理器时间让l其它Q?/span>;
(4)可以随时停止d;
(5)可以分别讄各个d的优先以优化性能?/span>
是否需要创建多个线E取决于各种因素。在以下情况?/span>,最适合采用多线E处?/span>:
(1)耗时或大量占用处理器的Q务阻塞用L面操?/span>;
(2)各个d必须{待外部资源 (如远E文件或 Internetq接)?/span>
多线E技术的~点
1){候用共享资源时造成E序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机{?/span>
(2)对线E进行管理要求额外的 CPU开销。线E的使用会给pȝ带来上下文切换的额外负担。当q种负担过一定程度时,多线E的特点主要表现在其~点?/span>,比如用独立的U程来更新数l内每个元素?/span>
(3)U程的死锁。即较长旉的等待或资源竞争以及死锁{多U程症状?/span>
(4)对公有变量的同时L写。当多个U程需要对公有变量q行写操作时,后一个线E往往会修Ҏ(gu)前一个线E存攄数据,从而前一个线E的参数被修?/span>;另外 ,当公用变量的d操作是非原子性时,在不同的机器?/span>,中断旉的不定?/span>,会导致数据在一个线E内的操作生错?/span>,从而生莫名其妙的错误,而这U错误是E序员无法预知的?/span>
Z么不使用多进E?
较之q程Q线E轻ѝh(hun)廉,启动速度快,退出比较快Q对pȝ资源的冲L较小?/span>
如果使用多进E,最困难的问题是如何把窗口句柄交l另一个进E。在Win32中,句柄只在其诞生地Q进E中Q才有意义。这是一U安全警戒,避免某个q程有意无意地危及到另一个进E的资源?/span>
Z分nH口句柄Q你必须明明白白C生该句柄的一个副本,q且可以被其他进E用。在一个多U程E序中,所有线E都可以使用q个H口的句柄,因ؓ句柄和线E生zd同一个进E中?/span>
如果两个U程分属不同的进E,那它们通常没有办法׃nM内存?span style="COLOR: red">不同q程间如果要通讯Q唯有依赖特别的设计Q之拥有共享内存(shared memoryQ?/span>
如果两线E属于同一q程Q它们将׃n所有的内存Q包括全局变量、静态变量)Q很Ҏ(gu)实CU程之间的通讯?/span>
NoteQ主要是资源׃n问题
zhangtaolmq
VC习题1
1.2 下列对于WinMain函数的描qCQ错误的是( C Q?/span>
AQ?/span>WinMain函数的名U是固定?/span>
BQ?/span>WinMain函数?/span>WindowsE序的入口点
CQ?/span>WinMain函数不能有参?/span>
DQ窗口函CWinMain的关联是通过H口cȝ注册实现?/span>
1.3 以下四个Ҏ(gu)中哪一个不属于面向对象的三大特性( AQ?/span>
AQ封装?/span> BQ多态?/span> CQ抽象?/span> DQ承?/span>
1.4 下列关键字中哪一个不是用于类的访问控制的Q?/span> B Q?/span>
AQ?/span>public BQ?/span>friend CQ?/span>private DQ?/span>protected
1.5 下面四个MFCcM哪一个是理MFC应用E序的( AQ?/span>
AQ?/span>CWinApp BQ?/span>CMainFrame CQ?/span>CDocument DQ?/span>CView
1.6 下列cM不属?/span>MFC框架基本cȝ是(D Q?/span>
AQ?/span>CWinApp BQ?/span>CFrameWnd CQ?/span>CView DQ?/span>CObject
1.7 传统的Y件开发主要采?/span> q程 驱动的方法,?/span>WindowsE序的开发用消?/span> 驱动模型Q该模型?u>事g机制来实现其功能?/span>
1.8 L架类是应用程序中负责控制菜单、工h和状态栏{界面元素的最主要的类?/span>
习题2
2.1 Windows 应用E序的消息来源主要包?/span> 输入消息、控制消息和pȝ消息、用h?/span>
2.2 SendMessage ?/span>CWnd对象发送一个消息,直到q条消息被处理之后才q回
PostMessage 一条消息放入应用程序的消息队列Q然后不{窗口处理这条消息直接返?/span>
2.3 CCmdUIcȝ主要功能是主要用?u>更新命o用户接口的状?/span>。如子菜单。工h上的按钮{?/span> ?/span>
2.4 代码ON_UPDATE_COMMAND_UIQ?/span>ID_TEST, OnUpdateTestQ的功能是:对ID_TEST的更新命令接口消息的处理映射?/span>OnUpdateTest函数上?/span>
2.5 CStringcȝ功能是处理字W串Q其Format函数的功能是格式化字W串 ?/span>
2.6 CTimecȝ功能?/span> 处理日期旉Q其Format函数的功能是时间对象格式化为字W串
2.7 MessageBox函数的第一个参数表C?/span> 消息文字Q第二个参数表示 标题文字Q第三个参数表示 图标与按钮组?/span> ?/span>
2.8 ?/span>windows中,按下一个字W键Q会依次触发WM_KEYDOWN WM_CHAR、和WM_KEYUP三个消息?/span>
2.9 ?/span>WindowsH口内部需要重新绘制时Q会得到一?/span> WM_PAINT 消息Q当释放鼠标右键Ӟ会得C?/span> WM_RBUTTONUP 消息?/span>
习题?/span>
3.1 Visual C++提供的资源编辑器不能~辑下列哪个资源Q?/span>C Q?/span>
AQ菜?/span> BQ工h CQ状态栏 DQ位?/span>
3.2 MFC应用E序框架为状态栏定义的静态数l?/span>indicators攑֜哪个文g中( A Q?/span>
AQ?/span>MainFrm.cpp BQ?/span>MainFrm.h CQ?/span>stdafx.cpp DQ?/span>stdafx.h
3.3 deletemenu用来删除某个菜单,如果被删除的菜单Ҏ(gu)相关的弹单,则该弹出菜单的句柄也要被删除q攑ֆ存?/span>appendmenu用来q加某个菜单?/span>Q?/span> trackpopupmenu 用来在一?/span>POINTl构所指定的位|显CZ个上下文菜单?/span>
3.4工具栏上的按钮能触发的消?/span> command?/span> update_command_ui?/span>
3.5 状态栏上的H格可以分ؓ信息行窗格和 指示器窗?/span>两类?/span>
3.6 getsubmenu 可以得到指向某列菜单的指?/span>?/span>
3.7 下列函数中,可以实现d功能的是Q?/span>B Q?/span>
AQ?/span>Rectangle BQ?/span>Ellipse CQ?/span>Circle DQ?/span>Line
3.8 CDCcMؓ用户提供了下列四个文本输出函敎ͼ其中Q能使输出的文本呈现一个多列列表格式的是(C Q?/span>
AQ?/span>TextOut BQ?/span>ExtTextOut CQ?/span>TabbedTextOut DQ?/span>DrawText
3.9下列cM哪一个不?/span>GDI对象c(B Q?/span>
AQ?/span>CPen BQ?/span>CWnd CQ?/span>Cbrush DQ?/span>CRgn
习题?/span>
4.1下面哪个不是CDCcȝzc( A Q?/span>
AQ?/span>GDIc?/span> BQ?/span>CPaintDCc?/span> CQ?/span>CClientDCc?/span> DQ?/span>CWindowDCc?/span>
4.2 CDCcM实现l制矩Ş功能的函数是 RectangleQ实现绘制椭圆功能的函数?/span> EllipseQ?/span>改变文本颜色的函数是 SetTextColo改变文本背景颜色的函数是 SetBkcolor在指定位|显C字W串的函数是 Textout ?/span>
4.3 MFCl图要素主要分ؓ两大c,?/span> 讑֤场景 和基本绘囑ַ?/span> ?/span>
4.4 Windows引入囑Ş讑֤接口的目的是屏蔽底层g的绘囄节,使编E更加容?/span> ?/span>
4.5 Windows?/span> COLORREF cd的数据存NԌ它采?/span>3个参数表C红、绿、蓝三元基本色的分量|q?/span>3个值的取D围ؓ 0?/span>255 ?/span>
4.6 创徏ȝ后,必须调用CDCcȝ成员函数 SelectObject新ȝ选进当前的绘囄境?/span>
4.7 MFC中的CDialogcd装了对话框的昄、关闭等常用功能Q其中,用来昄模态对话框的是函数Q?/span> C Q?/span>
AQ?/span>CreateWindow BQ?/span>ShowWindow CQ?/span>DoModal DQ?/span>UpdateWindow
4.8 对话框创建后Q还没显C前׃触发Q?/span> B Q消息?/span>
AQ?/span>WM_PAINT BQ?/span>WM_INITDIALOG CQ?/span>WM_CREATE DQ?/span>WM_SIZE
4.9 通用对话框中Q属于非模态对话框的是Q?/span>DQ?/span>
AQ文件对话框 BQ颜色对话框 CQ打印对话框 DQ查扑֯话框
习题?/span>
5.1 要打开文gQ应该用哪个通用对话框( A Q?/span>
AQ?/span>CFileDialog BQ?/span>CColorDialog CQ?/span>CPrintDialog DQ?/span>CFontDialog
5.2 通常对话框的初始化工作攑֜下列哪个函数中进行( C Q?/span>
AQ?/span>OnOK BQ?/span>OnCancel CQ?/span>OnInitDialog DQ?/span>DoModal
5.3所有通用对话框都是由公共?u>c?/span>CCommonDialogz出来的, CColorDialog实现了标准的颜色对话框?/span>
5.4 MFC中,与属性对话框相关的两个类?/span> CPropertyPage ?/span>CPropertySheet
5.5下列控g中不属于按钮的是Q?/span> B Q?/span>
AQ下压按?/span> BQ列表框 CQ单选框 DQ复选框
5.6 如果在输入时采用选择的方法进行,以下哪个控g不能实现Q?/span> D Q?/span>
AQ列表框控g BQ单选按?/span> CQ复选框 DQ编辑框
5.7 下面?/span>UpdateData函数的描qC错误的是Q?/span> D Q?/span>
AQ?/span>CWnd::UpdateData函数实现Ҏ(gu)件中数值的输入和读?/span>
BQ?/span>UpdateData只有一个ؓTRUE?/span>FALSE的参?/span>
CQ当调用UpdateDataQ?/span>FALSEQ时Q数据由控g兌的变量向控g传输
DQ当调用UpdateDataQ?/span>TRUEQ时Q数据由控g兌的变量向控g传输
5.8 有两U方法可以创建静态文本控Ӟ一U是使用资源~辑器添?/span>Q另一U是 使用create函数动态创建?/span>
5.9 使用滚动条控件一般要用到控g所在对话框cȝWM_HSCROLL?/span> WM_VSCROLL 消息?/span>
习题?/span>
6.1 判断一l单选按钮中哪一个被选中了,要应?/span>GetCheckedRadioButton 函数?/span>
6.2 GetScrollpos函数可以得到滚动条的滑块位置Q?/span> SetScrollpos函数可以讄滚动条的滑块位置Q?/span> Getpos可以得到滑动条的当前位置Q?/span> Setpos 函数可以讄滑动条的当前位置?/span>
6.3 CListBoxcM?/span> InsertString 函数可以为列表框插入一个新的字W串Q?/span> ResetContent 函数可以清空所有列表项内容?/span>
6.4当程序需要与界面交换数据Ӟ应该调用 UpdataData 函数?/span>
6.5 GetDocument 是视囄的成员函敎ͼ调用它可以得到指向与之关联的文档对象的指针,文档的串行化?/span>Serialize 函数中进行?/span>
6.6 在程序的M一个类中访问应用程序类的函Cؓ AfxGetApp Q在E序的Q何一个类中访问框架窗口类的函CؓAfxGetMainWnd() ?/span>
6.7Z单文?/span>/视图l构的框架程序中包含的类?/span> CWinApp ?/span> CFrameWnd ?/span> CDocument?/span>CDocTemplate?/span> Cview
6.8 ODBC体系l构中不包括下列哪个lgQ?/span> C Q?/span>
AQ?/span>ODBC理?/span> BQ数据源 CQ驱动程序管理器 DQ数据库理pȝDBMS
6.9 记录集可以分?/span> Dynaset(动态集) ?/span> SnapshotQ快照)两种?/span>
习题?/span>
7.1 MFC?/span>ODBCcM要包?/span>5个类Q分别是CDatabase?/span>CRecordset ?/span> CRecordView ?/span> CDBException?/span> CFieldExchange ?/span>
7.2可以利用CRecordsetcȝ AddNew函数d一条新记录Q利?/span>CRecordsetcȝ MoveFirst函数记录指针移动到W一条记录上Q利?/span>CRecordsetcȝUpdate 函数实现数据库记录的保存?/span>
7.3下列函数中,能ؓ状态栏W二个信息格讑֮文字的是Q?/span> A Q?/span>
a)SetPaneText b)SetWindowText c)SetPaneInfo d)SetText
{题Q?/span>
1. 定义和用消息映表的步?/span> Q?/span>
?/span> 在头文g的类声明中添?/span>DECLARE_MESSAGE_MAP?/span>声明消息映射;
?/span> 在类的定义文?/span>(.cpp)定义消息映射表,Ҏ(gu)是在 文g的开始处dBEIGN_MESSAGE_MAP?/span>END_MESSAGE_MAP q一对宏Q在它们之间攄消息映射宏,定义q初始化消息映射?/span>Q在消息与处理消息的函数之间建立联系Q?/span>
?/span> 在类的定义文?/span>(.cpp)中添?/span>消息处理函数?/span>
2.什么是消息映射Q?/span>
所谓消息映,单地Ԍ是让程序员指定要某?/span>MFCc(有消息处理能力的c)处理某个消息?/span>MFC提供了工?/span>ClassWizard来帮助实现消息映,在处理消息的cMd一些有?span>消息映射的内容和处理消息的成员函?/span>。程序员完成消息处理函敎ͼ实现所希望的消息处理能力?/span>
如果zc要覆盖基类的消息处理函敎ͼqClassWizard在派生类中添加一个消息映条目,用同L原型定义一个函敎ͼ然后实现该函数。这个函数覆盖派生类的Q何基cȝ同名处理函数?/span>
3.创徏一个窗口的步骤Q?/span>
创徏一个完整的H口需要经q下面四个操作步?/span>
设计一个窗口类Q?/span>
注册H口c;
创徏H口Q?/span>
昄及更新窗口?/span>
4.什么是模态对话框Q什么是非模态对话框Q?/span>
所?#8220;模态对话框”是指对话框被弹出后用户必d对话框中作出相应的操作;在退出对话框之前Q会L其他应用E序的运行(包括它所在的应用E序Q?/span>
所?#8220;非模态对话框”是指当对话框被弹出后Q将一直保留在屏幕上,但不影响其他应用E序的运行,用户可以l箋在对话框所在的应用E序中进行其他操作;当需要用对话框Ӟ只需像激zM般窗口一样单d话框所在的区域卛_。例如在Microsoft Word中的“查找”?#8220;替换”对话框?/span>
5.文档/视图l构的工作机?/span>
l 视图通过GetDocument成员函数获得指向相关联的文档对象的指?/span>
l 通过该指针调用文档类的成员函数来从文档中d数据
l 视图把数据显CZ计算机屏q上
l 用户通过与视囄交互来查看数据ƈҎ(gu)据进行修?/span>
l 视图通过相关联的文档cȝ成员函数经q修改的数据传递给文档对象
l 文档对象获得修改q的数据之后Q对其进行必要的修改Q最后保存到怹介质(如磁盘文?/span>)?/span>
6.?/span>CDocumentcL生新的文档类的一般过E如下:
为每一个文档类型从CDocumentcL生一个相应的文档cRؓ文档cL加成员变量,q些变量主要用来保存文档的数据,q其它的对?/span>(如视囑֯?/span>)可以讉Kq些成员变量Q从而实现文档和视图的相互搭配用。重?/span>Serialize成员函数Q实现文档数据的串行化?/span>
7. 串行化的好处
使用串行化的好处Q是不需要重载文件打开、文件保存之cȝҎ(gu)Q?/span>MFC框架会自动完成这些Q务,q自动调用文档类?/span>SerializeҎ(gu)来完成串行化q程?/span>
如果文档的抽象数据只有一个字W串Q那么你只需要在Serialize中添加相映语句就可以完成串行化过E?/span>
8、简q在MFC Windows应用E序中?/span>CBrush对象的基本步骤?/span>
l 创徏dQ可调用d创徏函数CreateSolidBrush?/span>CreateHatchBrushQ?/span>
l 画刷选入讑֤环境Q调?/span>SelectObjectQ?/span>
l 使用该刷子进行绘?/span>
l 删除d
9、简q文?/span>/视图l构中包含的主要的类及各个类之间的相互关pR?/span>
包括 CWinApp?/span> CDocument ?/span>CView?/span> CDocTemplate ?/span> CFrameWnd c?/span>
一?/span> App可以包含多个文档模版Q?/span> CDocTemplate Q,但是 MFC AppWizard Q无论是 SDI q是 MDI Q都只是默认生成一个。但是在实际开发中一个文档模版不够,需要自己手工添加。这个结构是通过 MFC ?/span> CWinApp 的成员变?/span> CDocManager * m_pDocManager 实现的?/span>
CDocTemplate 拥有 3 个成员变量,分别保存着 Document ?/span> View ?/span> Frame ?/span> CRuntimeClass 指针Q另外持有成员变?/span> m_nIDResource Q用来指定这?/span> Document 昄时候采用的菜单资源?/span>
一个文档可以有多个视图Q由 Document 中成员变?/span> CPtrList m_ViewList l护?/span>
CFrameWnd 拥有一个成员变?/span> CView* m_pActiveView 指向当前zd?/span> View?/span>
CView 中拥有一个成员变?/span> CDocument* m_pDocument 指向该视囄关的 Document?/span>
10、写出按?/span>Show?/span>Show the Age响应单击消息的函?/span>OnEnableQ)?/span>OnShowQ)?/span>OnShowageQ)。函?/span>OnShowQ)使编辑框IDC_EDIT1?/span>IDC_EDIT2处于昄状态,函数OnShowageQ)要能够判断出单选按?/span>IDC_RADIO1?/span>IDC_RADIO2?/span>IDC_RADIO3哪个被选中Qƈ被选中单选按钮的标题d到组合框IDC_COMBO1中,设ؓl合框的默认选项?/span>
CMyDialog::OnEnableQ)
{
GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE);
}
CMyDialog::OnShowQ)
{
GetDlgItem(IDC_EDIT1)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_EDIT2)->ShowWindow(SW_SHOW);
}
CMyDialog::Onshowage()
{
CString strText;
int i=-1;
i=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3);
if(i==IDC_RADIO1)
strText=">20";
else if(i==IDC_RADIO2)
strText="15-20";
else if(i==IDC_RADIO3)
strText="<15";
GetDlgItem(IDC_COMBO1)->SetWindowText(strText);
}
2、下面左图ؓ菜单l构Q右图ؓq行l果Q写出弹单的代码?/span>
void CPopupmenuView::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu menuPopup ;
if(menuPopup.LoadMenu(IDR_MAINFRAME))
menuPopup.GetSubMenu (4)->TrackPopupMenu (TPM_LEFTALIGN | TPM_RIGHTBUTTON , point.x , point.y , this);
}