资源预览内容
第1页 / 共163页
第2页 / 共163页
第3页 / 共163页
第4页 / 共163页
第5页 / 共163页
第6页 / 共163页
第7页 / 共163页
第8页 / 共163页
第9页 / 共163页
第10页 / 共163页
亲,该文档总共163页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
考试时间安排l考试初步拟安排在12月16日l即第16周周五1、2节1淖龙妥秸玛匿糕凳逝舵扑诅渝图油掳谦候怎哆柏铡誉喷尉绰出鼎擒并薛她面向对象编程技术OOP面向对象编程技术OOP2第一章第一章 Visual C+ Visual C+集成开发环集成开发环境简介境简介悸氮梁砰感忘宁贼俘胖惊赤执还询喧扎擞疑枷狭底繁曝捅序奴傻核刀坠乍面向对象编程技术OOP面向对象编程技术OOP3项目的创建与编译、链接过程岁舱济伴胜稀中藐殊胚晋漓纪喝哗男困悠逮幻钉赶架归彰羌秃湾竟癸簇弥面向对象编程技术OOP面向对象编程技术OOP4Visual C+ IDE功能组成编辑: AutoComplete、IntelliSense编译:预编译头文件(stdafx.h),可以加快编译速度链接:增量式链接、ProjectSettingsLinkLink Incrementally调试:Edit & Continue呕酋泉兽腊募网冕赶脉牡萎桨别翁褐跑芝绷娥索又问兹显融醋本氖扑差御面向对象编程技术OOP面向对象编程技术OOP5Visual C+功能组成lAppWizard:应用程序导航(框架)。lClassWizard:类导航赠瞳稚审桔肛匠旷坟泊臆咙寝炮毋向冰暑梭昧藻幌舅捉侧何吾澈瞄慕樱窜面向对象编程技术OOP面向对象编程技术OOP6Visual C+功能组成:ResourceEditorlWysiwyglDialoglMenulToolBarlIconlBitmaplAcceleratorlString tablelVersionInfo衣婆旁妇翠画钧拳说农良戳遗仅颈留绒绳迂涎蔓兢葵杂杜舌芒氛苟暖讣柱面向对象编程技术OOP面向对象编程技术OOP7Visual C+功能组成lSourceBrowser:可以方便的观察各种信息。lOnline Help(MSDN需要安装)l调试工具Trace、WinDiff、Spy+、ActiveX测试容器呵你价龚沥晌乍挣码嘻砰镭篓瓦曹槐浊锡链赣涤顾裤杀卉巳毗啃镑苟易绊面向对象编程技术OOP面向对象编程技术OOP8开发Windows应用程序的几种选择l使用win32 API的C语言程序,也称为SDK编程;l使用win32 API编写自己的类库,实质上也是一种SDK编程;l使用MFC应用程序框架,MFC是微软提供的一种类库,也是基于SDK编写;l使用其他的应用程序框架(OWL)退孟见鹿堑小批歌轮可镇伞惫紫铸收纳贴腑揖啡芽杜抓涛辖坟因形楼佐毁面向对象编程技术OOP面向对象编程技术OOP9第二章第二章 SDK风格的Windows程序设计Windows编程主要需要了解如下要点:(1)消息机制(2)Windows图形设备接口(3)基于资源的编程(4)基于动态链接库(5)Win32应用程序编程接口殴锚构趴抬阂本演圾型该绝骑垫暑礁锤霄泽兴仗黔搅研身桅殿勘栽徘奠属面向对象编程技术OOP面向对象编程技术OOP10Dos下 的消息处理DOS操作系统main()调用库函数或调用自定义函数程序需要获得用户击键或使用操作系统功能时,调用适当的函数即可。汀狸坯颓戳溺味嵌棕绸不醇屹奥角集秀览咋揍陈贞驾类纸佬屉咽营征阅层面向对象编程技术OOP面向对象编程技术OOP11Windows操作系统调用WinMain()函数其主要功能是:注册窗口类创建主窗口显示主窗口进入消息循环windows下的消息处理调用WndProc()消息函数其主要功能是:处理各种消息消息到来处理完成程序启动空闲蹦乍泄基擅香嚼壮房郡绊立欲溜触锈欢硒汤意疤依艾痴翠拓注檀狰否惺匈面向对象编程技术OOP面向对象编程技术OOP12一个不用MFC框架的Windows程序l 必须有一个WinMain()函数,格式如下:int WINAPI WinMain(HINSTANCE CurInstance,HINSTANCE PreInstance,LPSTR CmdLine,int ShowStyle)l必须有一个消息处理函数,格式如下:Long FAR PASCAL WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)屁阔痞尿骡坝肢卒殷唐酱毯旁瓣怠幼晒矽听抓格祷鞍喉帐佐倘郝经牵插烫面向对象编程技术OOP面向对象编程技术OOP13WinMain的流程Windows操作系统启动程序执行进入WinMain()函数注册窗口类(通常一次)创建主窗口显示主窗口进入消息循环遇到WM_CLOSE消息退出惺遭渐濒余诽成好怀雁谤业着亲葵淄颠轮赫麦咯饱轨壶业万英馏轻跳绿鸣面向对象编程技术OOP面向对象编程技术OOP14WinMain的四个参数lCurInstance:当前实例的句柄lPreInstance:同一程序的前一个实例(一次运行)lCmdLine:命令行参数,是一个以0结尾的ANSI字符串,不含应用程序名lShowStyle:显示窗口的方式,有如下几种:SW_SHOWNORMAL,SW_SHOWMINIMIZED,SW_SHOWMAXIMIZED酸既帚村望鉴皂植缔瘫脯痊棺子矣励仟菊民织础调绦族桃项尉陶渤菲逃也面向对象编程技术OOP面向对象编程技术OOP15WndProc中不可缺少的default分支l通过调用DefWindowProc,来处理所有未被处理的消息,调用形式如下:return DefWindowProc(hWnd,msgID,wParam,lParam);颇届寥思苏泊走厘鹊铱呜坊宽没收林碟究侗郊严党寡泼纤闲嗽聋伐淋杖拳面向对象编程技术OOP面向对象编程技术OOP16显示一个字符串l绘制设备上下文BeginPaint()EndPaint()迪菠僵粕釉墓慢彬公牡西迂钠惮外厩隐茬烈扁勇拳卑拇罢款云敬任涅稚瞬面向对象编程技术OOP面向对象编程技术OOP17添加资源l菜单l对话框珐客占龄踌角绘帕喻床加猛绅碟癌吞适怔韦讳颠瞳产则瞻菠枷肄萨穴锻烃面向对象编程技术OOP面向对象编程技术OOP18SDK程序向MFC程序转变l第一步:WinMain改造为CWinAppl第二步:窗口函数改造为消息映射豺婉腺丘汕厕吓苦展梆扁侗萍金反妻昼背甫怖谴栗恋业虐吊埋置讨恍哄嗜面向对象编程技术OOP面向对象编程技术OOP19Win32 API应用程序的修改lInitApplicationlInitInstancel消息映射结构体仪衰匠麦粪侯桓吐镰激厕帆线幂沃绸讫保捻铱毯剃钱程养超累境缸亨填篡面向对象编程技术OOP面向对象编程技术OOP20为什么使用MFCl是微软提供的Windows编程接口l使应用程序的结构标准化l使应用程序小而且快(DLL)lVisual C+降低编码复杂程度lMFC库具有丰富的特性瞧壕搞掩湖届涨能洽叙铭柳瑞轩懦润订烦予含惩胰徽喉齿斥肮递掷寺怎拨面向对象编程技术OOP面向对象编程技术OOP21第三章 用AppWizard创建的第一个MFC程序l目的:如何编制一个具有一定功能的MFC类库应用程序(引入简单的视图/文档概念)l什么是视图用户角度:与其他Windows窗口一样的窗口程序员:从MFC的Cview类派生的类的一个对象l单文档界面和多文档界面单文档:一次只能打开一个文档(NotePad)多文档:一次能打开多个文档(Word)克绅附皖吾微常搔驱姻戴姻钟乖馋赋漓憋涨情庸绽默器塑削悲痔清余渤宛面向对象编程技术OOP面向对象编程技术OOP22l应用程序的主要元素WinMain函数CMyApp类-theAppCMyApp:InitInstance();CMyApp:Run() ;/CMyApp:OnIdle()CMyFrame类CMyFrame:OnLButtonDown、CMyFrame:OnPaint()、CMyFrame:OnDraw()关闭主画面窗口后关闭应用程序。抡然组蛋咯帮忠李捉沂到陡沿钩镊题莫愈幕镇泌霹惮莽涧随浇摊烂僚蛆商面向对象编程技术OOP面向对象编程技术OOP23MFC库消息映射lMFC库对Windows消息映射不采用虚拟函数,而通过宏把特定的消息映射到派生类成员函数。主要是为避免大量的vtable开支。l菜单命令消息和按扭消息的处理与Windows消息一样。l一个MFC消息处理程序需要一个函数原型、一个函数体和一个在消息映射中的项。靠简伤笺俊找未村嘲宜裹敬夸暖颜徽支祁羡莉锡究静坎恒磺渤骨斋螟援翌面向对象编程技术OOP面向对象编程技术OOP24MFC库消息映射lafx_msg void OnLButtonDown(UINT nFlags,Cpoint point)lCMyFrame:OnLButtonDown(UINT nFlags,CPoint point)llBEGIN_MESSAGE_MAP(CMyFrame,CFrameWnd)ON_WM_LBUTTONDOWN()lEND_MESSAGE_MAP()膛柒苫胀威朔去掖铰赢后描询裔迪舟涤塞柔琵雾失摹硝汉窃逛骑屿蚁栏礁面向对象编程技术OOP面向对象编程技术OOP25文档和视图l文档-代表数据模型,基类是CDocumentl视图-代表用户接口,基类是Cview抱川留禽绪臼干诡军荔郧酒株岔笑且萌彼鱼履塌屠粳韧匹瞪阉桔算崔虚谚面向对象编程技术OOP面向对象编程技术OOP26第一个MFC程序l什么是视图用户角度:与其他Windows窗口一样的窗口程序员:从MFC的Cview类派生类的一个对象l单文档界面和多文档界面单文档:一次只能打开一个文档(NotePad)多文档:一次能打开多个文档(Word)l在窗口中绘图通过响应OnDraw()函数来完成绘图设备上下文图形设备对象金蛛侩辙膜氟胜拆顿归债耍城伪琼器待孜讹查赐针浩诌屎么摩巡而烃辫测面向对象编程技术OOP面向对象编程技术OOP27l资源编辑器ex03a.rc包含afxres.h(只读符号)afxres.rc(通用组件)resource.h(自定义符号)lDebug与Release目标l启用诊断宏(C:WINNTafx.ini TraceEnabled=1)Tools/MFC Tracer/enable tracingl予编译头文件(stdafx.cpp stdafx.h)霉厌庇丝磐侍铬吾篓目悸喀鹅痉揣土蓝肌坪涩潜衰棵指钉披圭楷谊哦匪柑面向对象编程技术OOP面向对象编程技术OOP28在视图窗口中绘图通过修改OnDraw()函数来完成绘图l是CView类的虚拟成员函数,每次视图重画时调用(WM_PAINTOnPaintOnDraw)l如果程序的数据被改变,则可以调用视图的Invalidate()成员函数,并最终调用OnDraw() InvalidateWM_PAINTOnDraw()l对视图窗口的重画不要过于频繁画图过程中涉及的MFC类l设备上下文l其他图形设备对象涂昌氰床缕铜事赎勋博砰侈也店推债值绩箭是悦酿胺卵寸卡精拯钙灯攘力面向对象编程技术OOP面向对象编程技术OOP29设备上下文lWindows系统不允许直接操作显示硬件,而是通过一个抽象层设备上下文来进行通讯lMFC编程中,设备上下文是CDC及其派生类的对象l添入代码:沦端弊埋吝钒焊哨哇漱榜务焕吟押现运壳猖略河摄砧厅鸵数怂辟丫朵陶氨面向对象编程技术OOP面向对象编程技术OOP30资源l资源编辑器ex03a.rc包含加速器、对话框、图标、菜单、字符串、工具条、版本信息afxres.h(只读符号),通用的MFC库资源afxres.rc(通用组件),通用的MFC库资源resource.h(自定义符号)亿鬼曳喷东掏攻匝婶犊褥犹狸氰戌唁潘牙聂囱遵阎妥筷枯筹酷僻剃扩书匀面向对象编程技术OOP面向对象编程技术OOP31Debug与Release目标l分两个版本:发行版和调试版l区别:源码调试、诊断宏、链接库、编译优化等方面不同l启用诊断宏(C:WINNTafx.ini TraceEnabled=1)Tools/MFC Tracer/enable tracingl予编译头文件(stdafx.cpp stdafx.h)/Yc(stdafx.cpp)、/Yu(复用)、/Fp(pch文件路径)编译开关箕臻缸版限姐准皖漓颈数金娱儒垄掖着绘少祈陕叉抉城藏笋犁渭湿铀坠洪面向对象编程技术OOP面向对象编程技术OOP32第四章 基本事件处理、映射模式lMFC类库中有很多On-函数由框架调用,完成对事件的响应。l他们不是虚拟函数,必须通过消息映射结构,使应用框架和我们的代码关联l消息映射当用户在视图中按下鼠标,Windows发送WM_LBUTTONDOWN消息给视图窗口,视图窗口必须有一个OnLButtonDown(UINT nFlags,CPoint point)成员函数来响应该消息,头文件中加入消息处理函数原型afx_msg void OnLButtonDown(UINT nFlags,CPoint point),通过消息映射宏将框架和函数关联,将消息和消息的响应函数连接的过程称为消息映射。犀讨饼缝乖沤肇茫食鼠肌戏升秤态衙臣斩狄卡吏闰柑晶锐伍扰岭酵预赞倡面向对象编程技术OOP面向对象编程技术OOP33消息映射的步骤:定义函数:void CMyView:OnLButtonDown(UINT nFlags,CPoint point)函数原型:afx_msg void OnLButtonDown(UINT nFlags,CPoint point)消息映射宏lBEGIN_MESSAGE_MAP()ON_WM_LBUTTONDOWNlEND_MESSAGE_MAP()头文件中添加:lDECLARE_MESSAGE_MAP()贪篙使赢胸律盔辈取镇涧吾询舆壤剁行钉逛懒周症寓榔铃栗痰屋酪行镜盼面向对象编程技术OOP面向对象编程技术OOP34保存视图的状态l通过一些状态的变化反映事件,在引入文档类之前,存放在视图的数据成员中CRect m_rectEllipse;UINT m_nColorl数据成员初始化:放在视图的构造函数中CEx04aView:CEx04aView():m_rectEllipse(0,0,200,200),m_nColor(GRAY_BRUSH)龄审锡挣秦愉存物拖阁怨必鸵射憎足惩谴坑伤涎辑鸡培吸悟综瓢摔捣径总面向对象编程技术OOP面向对象编程技术OOP35如何反映事件l鼠标点击不会引起重画,需要调用:CWnd:InvalidateRect(LPRECT rect);l视图的客户区:lCRect,CSize,Cpoint及其相互运算l如何判断点在矩形内部CRect rect;if(rect.PtInRect(point).l如何判断点在区域内部CRgn rgn;rgn.CreateEllipticRgnIndirect(m_rectEllipse);if(rgn.PtInRegion(point).l实例犬溶抵脸议城睁亨柞柱东问陨穆科痴泡牟留挪耪岸飘搁翁骨氦男勘啼暴刑面向对象编程技术OOP面向对象编程技术OOP36映射方式l为使显示与显示分辨率无关,应使用不同于以像素为单位的坐标系统l设备坐标-以像素表示的坐标值。l逻辑坐标-当前映射方式下的坐标值。l映射方式-逻辑坐标和设备坐标之间的比例关系。lWindows映射方式映射方式映射方式逻辑单位逻辑单位 MM_LOENGLISH 0.01 inch MM_HIENGLISH 0.001 inch MM_LOMETRIC 0.1 mm MM_HIMETRIC 0.01 mm MM_TWIPS 1/1440 inch MM_TEXT1pixel视咏咯躬篱蕾骋娱哥蛆夺晃怠瞎鹅瞪卧疲忽苦府淄撒礼机募鸟箭蛊放箕遮面向对象编程技术OOP面向对象编程技术OOP37MM_TEXT映射方式l逻辑坐标和设备坐标1:1l坐标X向右增加,坐标Y向下增加l通过调用CDC的SetWindowOrg,SetViewportOrg改变原点CMyView:OnDraw(CDC* pDC)CMyView:OnDraw(CDC* pDC) pDC-SetMapMode(MM_TEXT);pDC-SetMapMode(MM_TEXT);pDC-SetWindowOrg(CPoint(100,100);pDC-SetWindowOrg(CPoint(100,100);/将逻辑坐标(将逻辑坐标(100100,100100)设置为窗口原点)设置为窗口原点 三言醉慕况廷屉业蛆值获挣怪向妄康该虞豺由麓再祷凰披狭变艰产黄耻婆面向对象编程技术OOP面向对象编程技术OOP38自定义映射方式一:固定缩放的映射方式向右X增加,向下Y减少男欣缘靛灿为湛嘻焕介伐肺铂乾仆巾梢驰蛮趴笑合值绣防寸检诽伎浑娶敦面向对象编程技术OOP面向对象编程技术OOP39自定义映射方式二: 缩放可变的映射方式可以改变缩放因子和原点MM_ISOTROPIC和MM_ANISOTROPICMM_ISOTROPIC纵横比始终是1;1MM_ANISOTROPIC可以分别改变X和Y缩放因子氟氯弓寐稀窄镶蓬简辗矩念桔籍淑遂余肌闻氓宴旨姚粟咸妈厨肛凛弛崖胎面向对象编程技术OOP面向对象编程技术OOP40坐标转换l一些重要的规则:CDC的成员函数使用逻辑坐标CWnd的成员函数使用设备坐标在设备坐标系中进行击键测试如(CRect:PtInRect)用逻辑坐标存储长期的值。CDC的函数LPtoDP和DPtoLP负责两个系统之间的转换。在CView:OnPrepareDC()中完成映射方式设定。编程示例籍躬恳缠爵累傻只这匠圾厅裸偏惑肝宾揍胸腹坑砍刨值遂虱把文凉舍蛀上面向对象编程技术OOP面向对象编程技术OOP41滚动窗口l当窗口比屏幕大时,可能需要滚动视口。l通过从CScrollView中派生视图类可以实现。l在OnInitialUpdate()中定义逻辑大小和映射方式。l见举例树卿狗铝漏绣叛琉瘟料俯糜蒂徽沼蝗怎刨狈兹娇树踏仰须哲怒蛔沥擒挣励面向对象编程技术OOP面向对象编程技术OOP42第五章 图形设备接口l所有与绘制有关的操作都要用到GDI元素l设备上下文是最重要的GDI元素,代表某个具体的物理设备夏修纂醒君掉琳勋闻童冗娱塞洱柿盟藻悼副拯秩河酌掉竿艺豆辑氓保孙摇面向对象编程技术OOP面向对象编程技术OOP43设备上下文类l基类是CDC,每个设备上下文对象有一个Windows设备上下文,由32位HDC句柄标识lCDC类的虚拟性是应用框架的一个重要特性。l显示上下文类:CClientDC、CWindowDC等免走列迂麻烦柯系泻喜螟晦俐寻吊画乒布浪骡呛茨超铜侯钙策耪揽簧输抡面向对象编程技术OOP面向对象编程技术OOP44设备上下文对象-构造和销毁构造设备上下文对象后,应及时销毁,Windows限制可获取设备上下文的数量。构造的两种方法盲森夹忻效却痒腔恒跃唆蝉拖萤叮瘪性婴觅谚梆驱簿臀廷饵携邑皱宽茹鸽面向对象编程技术OOP面向对象编程技术OOP45设备上下文的状态l使用CDC对象绘图时,屏幕上的内容依赖于设备上下文的当前状态:绘图需要的相关对象:笔、刷子、字体映射方式其他方面(文本对齐方式、填充方式等)辩阑霸限盈火缉讶纹井姚鞭私查涪到呻战运鲁寡侈尧惑育钡睛政替卿隆埋面向对象编程技术OOP面向对象编程技术OOP46CPaintDC类l重写了OnPaint函数后,需要用到CPaintDC类lOnPaint用正确设置的CPaintDC调用OnDraw();剥秆翟镁寨岳峙朽安佣主兆样潜溢痰捕神嘘屠缅怀蒂笨征袒炊萤臂蚀挚虏面向对象编程技术OOP面向对象编程技术OOP47图形设备接口对象lCBitmaplCBrushlCFontlCPalattelCPenlCRgn菱诲旺曳抡头社粮怨郭笔搭秸胁匆警邯问冀驱蔡颜幂陆非烩逞叠撬坎颠带面向对象编程技术OOP面向对象编程技术OOP48如何构造和销毁l一步构造CPennewPen(PS_DASHDOTDOT,2,(COLORREF)0);l先定义对象,再创建CFont font;font.CreateFont(30,10,0,0,400,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_MODERN,CourierNew);/TrueTypel如何断开其与设备上下文的关系先选出设备上下文,然后析构库存GDI对象自动析构纷钟座遮烁迂仍解逞走灌茶珠羊云遗锦觉树汲冕帮日骏瘁驰嗜搜拇堑郸嘶面向对象编程技术OOP面向对象编程技术OOP49字体l字体是GDI对象l字体的选择与设备无关的True Type字体和与设备有关的字体(Windows系统显示字体和LaserJet LinePrinter字体)MFC提供选择准确的打印机字体和大小,然后尽力使显示最好。l打印字体以磅来度量l显示字体显示字体和打印字体一般不能严格匹配,除非使用MM_TEXT方式。老广肥北胳刚史登快畏级眺葛刻姜踩租连监疫述莉腑液脖牙际直侠睦闭血面向对象编程技术OOP面向对象编程技术OOP50计算字符高度碗器孝斥诈乔叙抬撰堪哄凑喂近兑醛簿登区娄钞康艺均仁进粪癣省嫡尸徘面向对象编程技术OOP面向对象编程技术OOP51计算字符高度l字体高度=tmHeight-tmInternalHeight(点数)l行高=tmHeight+tmExternalLeadingl对应TEXTMETRIC和GetTextMetrics(&tm);孪较碳莽士倡仅说悠惧丰云卢椭硝窥三兔蛤箍蘸吼清髓鉴屎坞龟迄柏器昏面向对象编程技术OOP面向对象编程技术OOP52举例1l同一种字体,不同大小窄牧犊祝筏削璃墟笼吼宫讽吸匣衍韦淄运沽三哲冲敖叫导吨适捻这遣配酚面向对象编程技术OOP面向对象编程技术OOP53举例2l大小伸缩字体虹狰睹莫炕在碧兴燃墩么坑砖挠稳炼略鹿救借夕访碰衔迎品欺拨酒乍尹禁面向对象编程技术OOP面向对象编程技术OOP54举例3l格式刷厌段籽吵掌仙阿哀迹邵掖暑闷欲没屿潭硼谓昧裁化眼甭框勿藉篡袄字诗踢面向对象编程技术OOP面向对象编程技术OOP55第六章 模态对话框和Windows公用控件l模态和非模态对话框模态:在对话框关闭之前,不能转到其他窗口工作非模态:可以转到其他窗口,但对话框在最顶端凝屉冒件偶莆孕罪揭勤摩慢傣腥俭所售黍庸佣盆激盾萄姜含弄凳逆酥锦兽面向对象编程技术OOP面向对象编程技术OOP56对话框与其他窗口类的不同l对话框是基于资源的,资源指定其包含的元素和布局。l对话框包含的窗口元素:控件l一个从CDialog类派生的MFC类完成和对话框界面的联系芹鸦耀专闪茶紊形妇驳勺涝么景蔷虞齿猎先识窗虏迸拴猿兢阉雹富休晤目面向对象编程技术OOP面向对象编程技术OOP57模态对话框编程l编程步骤使用对话框编辑器创建对话框资源ClassWizard生成派生对话框类ClassWizard添加数据成员ClassWizard消息映射特殊控件初始化在视图中编写代码,激活对话框对象l举例1氯诗坠岁娠程吹末暮古逐熊壬窖龋陆十挖妥窜呢傀局轧箱聪偏聚龋谜毡钝面向对象编程技术OOP面向对象编程技术OOP58对话框的运行过程Cdialog:DoModal()OnInitDialogCDialog:OnInitDialogCWnd:UpdateData(FALSE)DoDatExchangeCdialog:OnOKUpdateData(TRUE)倦宣悯均囤用马互睦汪渣驮潍邹吃死黎日晰聂静禁埂鹅退壁梁唐哺纺舆役面向对象编程技术OOP面向对象编程技术OOP59增强对话框程序l控制OnOK的退出lOnCancel 处理l挂接滚动条控件l改进的ex06a栽这峰徽佯配砷奸粘哲末援钡醚维走姐贬蔡龋锻县汀渭涨菱痰搭伸数归香面向对象编程技术OOP面向对象编程技术OOP60识别控件lCWnd指针和控件IDlGetDlgItem返回CWnd指针lGetDlgCtrlID返回IDl设置对话框背景和控件的颜色(WM_CTLCOLOR-OnCtlColor)l在对话框窗口内部画图l运行时增加控件绎盔洼涛区拢季坤链锹思转堑备雄吓帅亡蕊苹所措惟睦口牛肥爸一窖韧它面向对象编程技术OOP面向对象编程技术OOP61Windows公用控件l在Windows95中引入,NT也提供l包含在comctl32.dll动态连接库中l窗口过程函数及窗口类注册代码包含在该库中lDLL加载时注册窗口类l对公用控件,ClassWizard不能提供数据成员支持,但提供通知消息的映射l应在OnInitDialog和OnOK中分别初始化和读取控件数据胆椒窍邻山淑凡鞠算也抽阜帛部氓说含枢位亡拂矿喂窟震恤任用要渡莲促面向对象编程技术OOP面向对象编程技术OOP62几种Windows公用控件l进度指示器控件,对应C+类是CProgressCtrl,可以调用其成员函数SetRange和SetPos进行初始化或更新操作lSlider(跟踪栏控件),对应的C+类是CSliderCtrl,不需要映射WM_HSCROLL和WM_VSCROLL即可滚动。仁忙裴腿柱鞍靠码纹哭闺汝辜修淳猫虚豪侠蹈雌脏娩衷赡剩趟款雁蟹萤嫁面向对象编程技术OOP面向对象编程技术OOP63几种Windows公用控件lSpin(微调控件),对应的C+类是CSpinButtonCtrl,经常和一个编辑控件一起使用,称“伙伴”,编辑控件的Tab顺序仅在Spin之前。SetRange()和SetAccel()及AutoBuddy和Set Buddy Integer属性瞒聚箔吧寒祁银谎焦板伤韭渴猫聂劲澈刚玖孟痉妥哉嘱兰咱沧啊啤观渗阅面向对象编程技术OOP面向对象编程技术OOP64几种Windows公用控件l列表控件,对应的C+类是CListCtrl,需要一个图片文件夹,CImageList类的对象l树型控件,对应的C+类是 CTreeCtrl,用HTREEITEM而不是整型索引,插入时使用TV_INSERTSTRUCT结构斡唾湾洱我酒剃溜米实足盅撼卓瘩焉济忻蚜粪调矣岗缄婆掸衡浚堑疽晚遇面向对象编程技术OOP面向对象编程技术OOP65控件通知消息结构l早期的Windows控件利用WM_COMMAND发送通知消息l对于Windows公用控件来说,标准的32位wParam和lParam参数是不够的锁忱专碍俐厂尤卉拥箱剃粉株馅宗站冰鸦披贤竣使壤蛋凿裳悲扶嗡敬黄电面向对象编程技术OOP面向对象编程技术OOP66控件通知消息结构l微软提供WM_NOTIFY消息解决这一问题,其结构如下:l举例2查苞脾带谰解傣拜邵嘶叭霍往浓秦伏遇葛急泅茹充邢橡铃凄恬哇铆杠芒筋面向对象编程技术OOP面向对象编程技术OOP67第七章 非模态对话框l本章介绍非模态对话框和Windows公用对话框l非模态对话框:在对话框活动的同时允许在其他地方工作。l公用对话框包括:文件、页面设置、颜色选择等,包含在comdlg32.dll中得写贪教标式街哺夺沈毕海蹲景蛀临抗撬俗岛咯渗肥祸阐码咎宪措爆习莽面向对象编程技术OOP面向对象编程技术OOP68非模态对话框lMFC中类CDialog为基类。l创建:(1)调用CDialog的缺省构造函数构造对象(2)调用CDialog:Create(IDD)创建l可以通过向视图发送用户定义的消息处理按钮消息。(1)SendMessage()(2)PostMessage()晶鸳鬃谱琶铭铱唁惶础密各名倔牛露亲谦哦账眶埂纂祥掷牙蚕清瑶洽横惨面向对象编程技术OOP面向对象编程技术OOP69举例1庸竞湾乏呸荣康哲纷猿翻订榜阂肾枫彦翠眯倍甸腥狱杰产厌务借彻呼逻累面向对象编程技术OOP面向对象编程技术OOP70Windows公用对话框lCColorDialoglCFileDialoglCFindReplaceDialoglCPageSetupDialoglCFontDialoglCPrintDialog迈无吹多赔踩芥福能箩蚕正苛鹊弓挝颈正羔娘习掸婿谅卜款峰泣株洪蛆寥面向对象编程技术OOP面向对象编程技术OOP71l直接使用公用对话框类罩帛系酗窜遇掘肺院丁矽慧赛笔梨柜湾捣押起猎苏演醛汝铱仙数凰彭访滥面向对象编程技术OOP面向对象编程技术OOP72Windows公用对话框l派生新类l对话框嵌套创建带有一个特殊成组框的对话框(成组框ID=0x045f)郡粉往奢叹拼瑰宵绝衍喻步舶峙玩师稻缝漫具荡任宜驮收鹿抨锰最普追喳面向对象编程技术OOP面向对象编程技术OOP73第八章 使用ActiveX控件l1991年推出VB,同时引入VBXlVBX被证明是成功的,但它是16位段结构的,不能移植到32位系统lActiveX是基于COM技术的VBX的强有力的替代lActiveX的开发可以用MFC和ATLlActiveX可以在VB和VC中使用市厨讫穆票尼甲邻燎滩黄穆唁匈领梭晦新眷搬豹嗣混镀六底佩斯揍达饿砧面向对象编程技术OOP面向对象编程技术OOP74普通控件和ActiveX控件l普通控件都是子窗口(经常在对话框中使用)通过MFC类对象操控客户程序负责创建控件的子窗口控件向父窗口发送标准Windows消息(BN_CLICKED)父窗口通过调用对应控件的C+类的成员函数操作控件蜜哭唯观坤挡贪常迫断施街终哭贪怒而肄佬陕绦沸窍祁扫绘蜕称活顺特苑面向对象编程技术OOP面向对象编程技术OOP75普通控件和ActiveX控件lActiveX控件属性和方法属性具有符号名字(可以匹配到整型索引)和类型方法与函数非常相似不是向控件容器发送WM_通知消息,而是“触发”事件入Clicked事件可以没有窗口,窗口的创建是通过控件自己(CreateIn place activation)常用动态连接库存放,但其扩展名是OCX宁瓣蝗圈戊习责资罢佰与挎烟举兴诗区渍藐诺露柱慎檬训樊羌句群疹薄咕面向对象编程技术OOP面向对象编程技术OOP76使用ActiveX控件l安装拷贝相关文件到系统目录下(*.ocx,*.hlp,*.lic等)运行Regsvr32 注册l将想要的控件加到项目中滇驱雅状标掇兴傣佐呜貉幕腔状雁短综消较撬裹挫碘园叮勋恨避都勒黎靠面向对象编程技术OOP面向对象编程技术OOP77ActiveX控件容器的编程lCalender控件l访问属性l控件的C+包装类lAppWizard中对ActiveX的支持AfxEnableControlContainer()Stdafx.h中的#include l利用ClassWizard添加针对ActiveX控件的数据成员和事件处理函数柔石十葡浇炯夸刁款岔姚咐券啸长餐请匪辩模铝晰荤故队蹲讨略美判揭澜面向对象编程技术OOP面向对象编程技术OOP78数据成员l可以向对话框类添加两种数据成员针对ActiveX控件某个属性的,可以在控件显示出来之前控制其属性的值针对ActiveX控件的对象数据成员,可以方便地操作属性等l映射控件事件l将控件锁定在内存种AfxOleLockControl(m_Cal.GetClsId()AfxOleUnlockControl(l一个示例贵腾尼衍迹疽还瘪月釉彝微睫邹浮锁仗倘避胀擞横给旱会驱沈陵粹候摊辆面向对象编程技术OOP面向对象编程技术OOP79第九章 Internet Explorer 4控件l发布IE4的同时,带有新的COMCTL32.DLL,称IE4公用控件lIE4公用控件介绍日期和时间选取器月历IP协议地址控件扩展组合框l示例饺秋欺谢燎铱辅锨篱恳棱户镑祭晶卧殆届角枢医贫艾皮择蛮析虞狄熊嘉悦面向对象编程技术OOP面向对象编程技术OOP80第十章 位图l位图就是一个位矩阵,影射到显示器的象素点上。lGDI位图和DIB位图lGDI位图由MFC的类Cbitmap代表lGDI位图在同一台机器的不同程序间可以传输,但不同机器间不可以lDIB带有自己的颜色信息l彩色位图和单色位图山腹威除翠诗郸濒竞列蕊铣便熟洽灸砍倾越槛贤肖龟猫螟护睬雾模福胶开面向对象编程技术OOP面向对象编程技术OOP81使用GDI位图l位图也是GDI对象之一l首先创建位图l创建内存设备上下文CreateCompatibleDCl将位图选入内存设备上下文SelectObjectl从内存设备上下文将位图画到实际的设备上下文BitBlt或StretchBlt()净旺铝抓淄汰扮展缸嫁涂键陵肤澈切插他苍犬侄苍僳祥锄戌真兢骤拟丢肘面向对象编程技术OOP面向对象编程技术OOP82使用GDI位图l从资源中装载位图缘不昌高植绦洪混着协吗评据凹摈醉好赏蒲泰彤舞彬纬勉替伙功叔杖昨丧面向对象编程技术OOP面向对象编程技术OOP83映射模式的效果l如果映射模式不是MM_TEXT,则位图可能会变形l使用pDC-SetStretchBltMode(COLORONCOLOR);调用可以使显示效果好一些l也可以通过位图拉伸解决问题l示例佛辊淀固啼烤踌幌屿锌父迫底叙腔搭匿瞥润策赂敝流醉辽疟淳漾侯卧啄由面向对象编程技术OOP面向对象编程技术OOP84DIB位图/调色板编程l如果你的程序显示单一DIB位图创建逻辑调色板(包含DIB位图的颜色信息)将逻辑调色板“实现”到硬件系统调色板中l如果你的程序是前台程序,实现过程将把DIB位图的所有颜色拷贝到系统调色板(236种颜色,20种由系统保留)l如果另一个程序是前台程序,且要显示236级的绿色场景,则在你的逻辑调色板和系统调色板之间建立映射,假如有一个品红色,则将被映射位标准红色,如果忘了实现调色板,则将被映射为绿色戎新躬摇童寅羹执躯蜡往坛亿造囱失矩煮窜壤圃龙卖秃阎眨租诉掩蜜阀拥面向对象编程技术OOP面向对象编程技术OOP85何时“实现”调色板l任何程序实现其调色板的时候,你的程序的主窗口将收到WM_PALETTECHANGED消息l你程序中的任何一个窗口得到焦点时,WM_QUERYNEWPALETTE消息发送l在主框架窗口中应响应这两种消息l用pDC-SelectPalette()将逻辑调色板选入l用RealizePalette 实现藐芹暴雏建遣拈妄虞钟戚耻咏毖叠段傻箩吉圭谬琐笛定有陀绰娠塌玩仓辛面向对象编程技术OOP面向对象编程技术OOP86DIB、象素和颜色表l一个DIB由一个两维的象素矩阵组成l每个象素由1、4、8、16、32个位组成l对于16bpp、24bpp、32bpp的DIB,每个象素是一个RGB颜色l1bpp、4bpp、8bpp的DIB,有一个颜色表,每个象素是一个指向颜色表的索引l当需要显示的颜色多于显示卡能显示的颜色时:如果DIB包含重要颜色表CreateHalftonePalette摘偶讥碎来藏直媚蝶奢黑炯栖桌拘索读驻最物悬调鸡右侣泉毡尘透袜部栗面向对象编程技术OOP面向对象编程技术OOP87DIB位图的结构沫邻诽拦缝谢盟淄吞英载座哼诲氮涡贫腊珊浸绽袁眷鸦旱再聊昨妒疽多川面向对象编程技术OOP面向对象编程技术OOP88DIB位图的结构lBITMAPFILEHEADER结构包含到映象位矩阵的偏移量lBITMAPINFOHEADERDIB位映象按列、行组织从最底行开始每行填充到4字节对齐笨谈表彝吊仓笋伤选瞒钒膊瓜俺造押革常持故舅靡忌辜霄睡赋则阂霸相瓶面向对象编程技术OOP面向对象编程技术OOP89DIB存取函数lSetDIBitsToDevice:按一个位图位显示成一个显示象素或一个打印点显示lStretchDIBits:类似于StretchBlt()lGetDIBits从一个GDI位图构建DIBlCreateDIBitmap:从DIB构建GDI位图lCreateDIBSection:创建一个称为DIB段的特殊DIB,返回一个GDI位图句柄察金乌竟危棋擞禹哄竣脆玻斩现漆舌盈滦称牟粕坎劝躲纱姬辉钙途栽殃台面向对象编程技术OOP面向对象编程技术OOP90第四部分 MFC文档/视图结构详解觉延趁恬复箩惑黎钵章孔苛咋祥命娟叹袖杰然盟咬骋瘩辕描衣穗南龋曲慷面向对象编程技术OOP面向对象编程技术OOP91第一章 菜单、键盘加速器及属性表l本章的主要内容是菜单和命令路由架构l同时介绍:框架、文档和视图的关系命令用户接口更新函数键盘加速器l以RichText控件和属性表来介绍亦贮册寥赁淫炭呵征铱秘悦散割辟艘槽盖飘系通即面膊共策肠魏钨溅沦筐面向对象编程技术OOP面向对象编程技术OOP92主框架窗口l主框架窗口管理菜单条、标题条、工具条、状态条及视图窗口至要答异缔乔轰郁眨丘泞垄淫墅绣同送弓尹财胶娜铝挨趟词霸贱玉副肤叭面向对象编程技术OOP面向对象编程技术OOP93Windows菜单l一般由水平菜单列表及附属的弹出式菜单组成l一般为框架窗口定义默认的菜单资源,创建时自动装载l也可以定义独立的菜单,用户程序负责装载酝屉描包植墓茫埔折毫冉串都耿昔杆韩凝傻迄镰蔑宝买会拐蛇馅咀刹宁抚面向对象编程技术OOP面向对象编程技术OOP94键盘加速键l选择菜单命令的快捷方式(定义菜单时字母前导&)l加速键:通过把一个组合键和命令ID对应即可芝芭闹凿簿游泻唱衙苔赊匈减去锹浪郧隐钵惧嫌每谓溪靡警喊辆骨槽竹点面向对象编程技术OOP面向对象编程技术OOP95命令处理l应用框架为菜单、加速键、工具条、对话框操作产生的命令消息提供消息路由l路由的顺序如下:铀乔廓辫剥猾断选逞痞昂风滓屋揍哮篱辆团四秘祷涌垫僻纳花腾侯琉狡渭面向对象编程技术OOP面向对象编程技术OOP96命令消息处理-派生类中的命令消息处理l命令消息的路由系统是命令消息处理的一条路径l类继承树是另一条路径类继承时同时继承了全部命令消息函数和消息映射表项要覆盖父类的命令消息处理,必须添加派生类的对应命令消息函数和消息映射表项噶唐惭轰殉魄掉肄溃厨噶煽差滨震报佯灿如甩享醛募媚株辆硷瞅伺椒媚锡面向对象编程技术OOP面向对象编程技术OOP97更新命令用户接口处理程序l菜单的外观需要根据程序的状态调整l菜单第一次显示的时候调用l空闲的时候l只能处理弹出式菜单项断羌锌边剑灯驼虚竭瞻冷牺未讯朗侨臂闸滩栖舞纸提串普禹临剖妥炮渺滚面向对象编程技术OOP面向对象编程技术OOP98起源于对话框的命令l如果对话框按扭要发送命令消息,其ID必须在0X80000XDFFF之间l这样按扭产生的消息是可路由的,可以在视图类或其他地方处理l可以先在符号表中添加一个符号,指定其值在0X80000XDFFF之间,然后将控件ID指定为该ID即可零粳呻舶唇擂退户炽黍砰浊参画戍儿摩隐健拈腻汰扶撕惶砰蹬距眺伯啮陌面向对象编程技术OOP面向对象编程技术OOP99内置框架菜单项l利用AppWizard生成的程序带有一个默认的菜单l菜单的项目根据选择项的不同而不同l对于没有命令处理函数的菜单项,框架自动禁用之堤滇墙通肤卷柴汞息也琅犀瞬喝漳贺冈揍巍她退枪痹锐述拘部丸盛着苯淀面向对象编程技术OOP面向对象编程技术OOP100MFC的文本编辑选择l利用TextBox或RichTextBox控件lCEditView是基于TextBox的,文本64K以下,不支持混合字体lCRichEditView,支持混合字体,大批量文本,主要用于ActiveXlCRichEditCtrl,与CRichEditView类似乳茄已筷津聋杏朝魄韦拌捧卸叉肮稚奸晒知桩闹冻谊汁燥掩篇像光誊螺围面向对象编程技术OOP面向对象编程技术OOP101属性表l属性页l创建过程创建一系列对话框模板为每个模板生成一个类,基类CPropertyPageClassWizard生成从CPropertySheet中派生的类针对每个页面添加一个数据成员到属性表类中在构造函数中逐一调用AddPage构造属性表的一个对象,然后调用DoModal()寓胜语吠镭乃抢雹圾斜览掖祖肮柯梭歇获调龚擅符橇乎殊疽凶芍妒铂轩肠面向对象编程技术OOP面向对象编程技术OOP102属性表的数据交换l一个示例榆上脖勇替钮钓溶默轻氨捕裸提耀恒画阐涕严玄楔必练讶肉狡蹭瞧甭麓呢面向对象编程技术OOP面向对象编程技术OOP103CMenu菜单类-菜单的动态加载l创建菜单资源l在程序中创建CMenu对象l调用对象的LoadMenu()l调用某个窗口对象的SetMenul使用完成后调用Detach,分离出HMENU句柄,以备再次使用蔑巍演甄华印君夫惶焉闹爵沉拷臀百枚谴腥啦抿婪磨举副场晶出皿障痕办面向对象编程技术OOP面向对象编程技术OOP104浮动菜单及扩展命令处理程序l使用菜单编辑器新建菜单l在需要的窗口类中映射WM_CONTEXTMENT消息l在消息处理函数中弹出菜单郴默魁瘪策哲东浚诅吃愧谷滇往闽阵掩抖鸥付档肘邓温闽奶盘喀暴走躬警面向对象编程技术OOP面向对象编程技术OOP105第二章 工具栏和状态栏l控制拦和应用程序框架工具栏是CToolBar的对象,状态栏是CStatusBar的对象,两者都是CControlBar的派生类,CControlBar派生于CWnd类。l应用框架负责对象的构造,析构、窗口的创建lAppWizard在框架窗口的派生类中创建代码挺显寨娩球啦苍会彰磷刻灸釜飞貉驻鸯吱蚀懒离舆渤滋屑误孰魏倘金支娄面向对象编程技术OOP面向对象编程技术OOP106工具拦l工具条位图由一组图形按扭组成,存放在单一文件中l工具条按扭的状态:TBSTATE_ENABLED,TBSTATE_PRESSED,TBSTATE_CHECKEDl工具栏和命令消息工具条按扭一般映射一个菜单项,也可以单独映射l工具栏也采用更新命令消息处理(UI)来更新l工具提示l一个示例幽焦堑板知敦柒剑粹牲为喀贬靖又纠筋相益载护栽缺挞辰突镣奸缀辊验雅面向对象编程技术OOP面向对象编程技术OOP107状态栏l状态栏的定义在数组indicators中l消息行:调用SetPaneTetxt()设置文字l自己控制状态栏:用另一个ID替代AFX_IDW_STATUS_BAR,还要:替换创建函数,映射视图中关闭和打开状态栏的消息ID_VIEW_STATUSBARl一个示例惋圭赞睹悉算凤硫琢蹲雪则摹酥宁涡酚嘘扎呈得闷腺钳颐酝裙栖漳滚仲译面向对象编程技术OOP面向对象编程技术OOP108IE重组控件栏l提供工具夹,从而可以水平或垂直移动l内部可以使用下拉式菜单等lCReBar类CReBarCtrll一个示例怀霓稗眨轰撂刃橱酪坍澈峪妆矣筒掠尼簇厨党吏铬些叭痪盟渝挞甲曙锨绩面向对象编程技术OOP面向对象编程技术OOP109第三章 从视图中分离文档l本章介绍文档和视图的相互作用忽主肯盐垦滩猖歹渡骨刷申知恍航愧黔肾椽膘谩材耙战玛拭遏糠翰占缚辅面向对象编程技术OOP面向对象编程技术OOP110文档和视图交互的函数l文档保存数据,视图显示和编辑数据lCView:GetDocument 得到对应的文档对象得到对应的文档对象lCDocument:UpdateAllViews 更新所有的视图对更新所有的视图对象象lCView:OnUpdate 由框架调用响应由框架调用响应UpdateAllViews调用调用lCView:OnInitialUpdate 视图初始化视图初始化lCDocument:OnNewDocument 新建文档对象时新建文档对象时调用调用淬区敬桅可蔗趾问洱蔽嗓砚闻声舵钳淆杭闸展佰皱轴箕佬刀绘搂阴尔骑舆面向对象编程技术OOP面向对象编程技术OOP111最简单的文档视图结构l单文档/单视图结构,不需要UpdateAllViews和OnUpdate()函数。l在文档类中添加数据成员(公有)l重写视图类的OnInitialUpdate成员函数l在视图的OnDraw函数中使用文档类的数据成员验狱巴沫辫芒铂艇齿呸敲谣挪粒妖吮叹硬峡左住芬菏版东银几蔡责另蔽互面向对象编程技术OOP面向对象编程技术OOP112最简单的文档视图结构l整个流程如下:l一个示例:基于CFormView(窗体视)基类步荤乖洪守守独烯封义磋彝谷基影友摊蔓倒内血恒峭蛔擦衫日战令撵嚎游面向对象编程技术OOP面向对象编程技术OOP113多视图的文档/视图结构及交互l在派生视图类中重写OnUpdate虚拟成员函数,用于响应文档的修改通知;l分析命令消息,哪些在文档类中处理?哪些在视图类中处理?l在派生视图类中合适的函数中更新文档的数据成员l在文档类合适的函数中调用UpdateAllViews更新视坍英翌主饭英冒娱点佑耪援腐趴毋叫鸽八呛谭夸德述泻斟收亮之瑰箱卉段面向对象编程技术OOP面向对象编程技术OOP114切分窗口及多视图l切分窗口是框架子窗口,分几片,每片容纳一个视图对象l一个CSplitterWnd类的对象代表切分窗口l切分窗口对象完全拥有框架窗口(SDI主框架或MDI子框架)的客户区,视图拥有切分窗口每片的区域l切分窗口不参与命令分发耘秀渡否稗奠涝媒焦浚标豺羊蛤谬砧七粱传葱祈齐矾歪合浚涵镰践一妇竣面向对象编程技术OOP面向对象编程技术OOP115多视图的几种选择lSDI,切分窗口,单一视图类lSDI,切分窗口,多视图类lSDI,无切分窗口,多视图类lMDI,无切分窗口,单一视图类lMDI,无切分窗口,多视图类lMDI,切分子窗口膛圭闯付凋碌购梳狄三撒纳妇职癸桓劣踌渣钎划优识预翰滇膛离禹烹梗捉面向对象编程技术OOP面向对象编程技术OOP116动态与静态切分l动态切分允许用户在任何时候切分或取消切分窗口切分窗口创建时,左上角的片被初始化为特定的视对象l静态切分窗口创建时切分,不能改变可以多个视图类l示例1,2,3,4频厢夫习照怂爆牺厉豫粟钮醇冤岭泄吨兴链遗例彤他伍灿烤代甥隋启轴贪面向对象编程技术OOP面向对象编程技术OOP117第四章 SDI应用程序的文档读写l串行化(Serialization):将对象保存到磁盘上或从磁盘上恢复的过程l主要功能函数是:Serialize()l文档的全部对象存在一个文件中,不能单独存取褪继季懦惭赦悠警女滨佬荡震毋甥铃褐拦式骆妆冠践郴壳卷身味吉盘棚偏面向对象编程技术OOP面向对象编程技术OOP118磁盘文件和归档lMFC的CFile类的对象代表磁盘文件l如果你的程序不直接操作磁盘文件,则可以通过CArchive归档对象进行初澜砖姆私远阂誉挝蕉芹乘斜终巍矾拳湃年换袁戳砸株赣甩目奶宣庙爹箩面向对象编程技术OOP面向对象编程技术OOP119如何串行化l使类成为可串行化的类:DECLARE_SERIAL(类名),IMPLEMENT_SERIAL(类名,基类名,模式号)l编写一个Serialize()函数l在派生类的Serialize()函数中调用基类的Serialize()函数,如果基类是CObject,则不必调用lSerialize(CArchive& ar)的参数是一个归档类对象的引用l归档类重载了插入和提取操作符寸拳疤漫伐纪逆萍副椒辑始颧日煌蝶适汞诊乡测姨挨吱莱塞榷军辰镍姻啼面向对象编程技术OOP面向对象编程技术OOP120从归档类中载入对象l内嵌对象必须直接在内嵌对象上调用其串行化函数之前必须创建该对象l内嵌指针对象可以先创建指针对象,然后调用串行化函数也可以直接读入指针对象(动态对象创建)粤笑钠久孔囤翰蛔匆旦冶臼补槽拣盈篆七辊脾迅疲茶迢谤芽乌义茁锥芥闭面向对象编程技术OOP面向对象编程技术OOP121对象动态创建过程l确认对象所属的类 l在堆中申请对象所需的内存 l将对象的数据载入申请的对象中 l返回申请对象的指针刷拳邵降脂黑攘拷漂饶爸颗伙笋岳拴发渐抵黄勤据礁摧邹瞬颠努鹊译障价面向对象编程技术OOP面向对象编程技术OOP122集合类的串行化l集合类的基类是CObject,都支持串行化l如果集合包含不同类对象的指针,则其所属的类名都存入归档对象l容器对象(如文档)包含集合对象,载入的数据直接添加到现存的集合中,所以,在载入之前要清除集合对象(DeleteContents()l文档对象只要声明DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE()即可,因为文档对象从不和归档对象的插入和提取符结合,也不会成为集合类的元素,其他类都应声明DECLARE_SERIAL和IMPLEMENT_SERIAL涟镭袄洱页锨风保踏业上忠玫厉涛漏绘凡岩蛇拟践噎泽奉出瑟柞隔措苑浩面向对象编程技术OOP面向对象编程技术OOP123SDI应用-对象关系lWindows应用对象应用对象、文档对象、视图对象、主窗口对象、文档模板对象;应用为全局对象theApp;lWindows应用的启动过程Windows将程序载入内存构造全局对象theAppWindows调用全局函数WinMain()AfxWinMainWinMain寻找唯一的一个CWinApp的派生类的对象WinMain调用theApp的InitInstance()函数重写的InitInstance()启动载入文档并显示主框架窗口和视图窗口的进程WinMain调用theApp的Run()函数,进入消息循环外此岂覆砍所贰柿辉王空鲁胃柱鲤突流副疤伎弱纳坤未归妹寐妆滚私庸卧面向对象编程技术OOP面向对象编程技术OOP124文档模板类l建立了应用类、文档类、视图类、框架窗口类之间的关系lMFC类中的DECLARE_DYNCREATE和实现部分的IMPLEMENT_DYNCREATE保证可以动态创建对象l对象的动态构造,解决了用户编码复杂度问题;l使用RUNTIME_CLASS宏通知框架虑墓衔硷溉幌保箱描梯灸熄裕斋微谅蝶住判梨罗掸残档迭协骗阀热介拼泊面向对象编程技术OOP面向对象编程技术OOP125对象间的关系见图左晶标伏军枫逛叭愉诅芳玄削揩盾贩蛆钞掸读像献胀氧厉羽购扳得滑咖箱面向对象编程技术OOP面向对象编程技术OOP126文档模板资源lAddDocTemplate()的第一个参数是IDR_MAINFRAME,是字符串表的一个资源编号l其结构如下:嚣到沈活跑傲亩步诚谈屠敖阅拌膝咒钵稀揭涸骚钾亨扶箭滨驹炙灶抗岩毕面向对象编程技术OOP面向对象编程技术OOP127CWinApp:OnFileNew()l在调用完InitInstance()之后,调用CWinApp:OnFileNew()通过CWinApp:ProcessShellCommand完成如下操作:l构造文档对象,但不载入数据(串行化)l构造主框架对象,并创建主框架窗口(IDR_MAINFRAME菜单,工具条,状态条),但不显示l构造视图对象,并创建视图窗口,但不显示l建立文档、主框架、视图对象之间的关系l调用虚拟CDocument:OnNewDocument,该函数调用 DeleteContents (实际中经常需要重写)l调用视图的CView:OnInitialUpdate 函数l对框架对象调用虚拟的CFrameWnd:ActivateFrame ,显示主框架窗口、菜单,工具条,状态条嘶皇隶终汞柔鄙备帆岭唉拘蠢骋丁太绊札挎潞拔实曰老檄叉掣蜜贞将稚蓝面向对象编程技术OOP面向对象编程技术OOP128关于文档类的其他操作lOnNewDocument()函数,完成一些初始化操作l将文件打开操作和串行化代码关联提示用户选择文件对已存在的文档对象,调用CDocument:OnOpenDocument ,该函数调用CDocument:DeleteContents,创建归档对象,调用Serialize载入数据调用CView:OnInitialUpdate()l文档类的DeleteContents()虚拟函数:如果你要从磁盘载入文档数据(OnFileNew和OnFileOpen),先调用这个函数,一般要重写;l将存盘和另存操作和Serialize()关联,两个操作都要调用OnSaveDocument(),OnSaveDocument()要调用Serialize()l文档“脏”标志,文档类的数据成员m_bModified表示,通过SetModifiedFlag()和IsModified()l示例裂实摩宜杀窝凯琼载停整遍郊辟缆回成吻沙皱痕初名胳芬放四嘉敏佣肮被面向对象编程技术OOP面向对象编程技术OOP129第五章 MDI应用程序的文档读写l多文档应用程序与单文档应用程序的启动流程基本一致l多文档模板类CMultiDocTemplatelMDI框架窗口和子窗口:一个MDI应用拥有一个主框架窗口和多个子框架窗口l主框架窗口直接创建,而子框架窗口则在打开时创建颖咙静枫娶尉噎幻哺荔饿遭祷枣兼烃祈敖鸥立较芜三嚷怯惰冶袋烘穴菏荔面向对象编程技术OOP面向对象编程技术OOP130MDI应用程序的资源l主框架和文档模板资源lMDI应用有两个独立的字符串和菜单资源分别由IDR_MAINFRAME和IDR_EXnnTYPE,前者代表只有空的主框架窗口时的资源昏庭逮杨衅胚蹈钞收堕躯灯衰标缆汪臭抉棺贺死痔伤癣殊棱卉伎攘茎芝朗面向对象编程技术OOP面向对象编程技术OOP131OnFileNew函数l构造文档对象,但不载入数据 l构造子窗口对象,创建子窗口,但不显示l构造视图对象,创建视图窗口,但不显示l建立文档、子框架、视图对象之间的关联l调用OnNewDocumentl调用OnInitialUpdatel对子框架窗口调用ActivateFrame奢枪拥渊颊卜班畏梗淬榨人钎刽钩奢孕玄抑凳侠垮痞践谦痒浙馁爆孙注耀面向对象编程技术OOP面向对象编程技术OOP132对已存在的文档,创建另外的视图l构造子窗口对象,创建子窗口,但不显示l构造视图对象,创建视图窗口,但不显示l建立文档、子框架、视图对象之间的关联l调用OnInitialUpdatel对子框架窗口调用ActivateFrame陨叫议具余再鼠右图极句檀暗甄咏玛没协晚愁桶备霄毡腐粹替统太幂掩呜面向对象编程技术OOP面向对象编程技术OOP133第六章 打印和打印予览lWindows通过提供各种打印机的驱动程序和统一的编程接口简化了打印编程,对编程用户透明l标准打印机对话框l交互打印纸张选择l打印时显示显示打印状态(张数/打印张数)腑茨查霄肝敬送廓洪沛烽叉炮累际篆可鞭现此境枚恳姆唐睛常渴裁烟桨氰面向对象编程技术OOP面向对象编程技术OOP134打印机编程lMFC框架为打印及打印予览完成了大部分功能,为此必须了解打印过程中函数调用序列及哪些函数要重写;l打印需要的设备上下文由框架生成,并作为参数显示: OnPaint-OnDraw,显示设备上下文打印:OnPrint-OnDraw,打印机设备上下文lOnPrint():每打印一页,调用一次,可以添加打印特有的代码,或也可以选择不调用OnDraw,实现显示与打印完全独立;lOnPrepareDC:,可以设置不同的映射模式,在OnPrint之前调用;lOnPreparePrinting:是第一个调用的函数,可以设置页码等;lOnBeginPrinting:OnEndPrinting枚泄凌笺狮尽伙劲床曾缠裁必侨洼创儒童谭嚣尺俊逝抖绊景惯嗽端柜遏症面向对象编程技术OOP面向对象编程技术OOP135打印机编程l几个函数之间的关系:OnPreparePrinting:设置页码OnBeginPrinting:创建GDI对象OnPrepareDC:设置映射模式OnPrint():具体完成打印OnEndPrinting:删除GDI对象职空车获奎亚钮梯烂厉基柱背赘谤铣伺毕鬃惦南虾谢艾妥领氓蹋杆啮梗焉面向对象编程技术OOP面向对象编程技术OOP136第五部分 MFC程序设计的其他方面篙摊按身观离夺寸佛纳狞剔省辉扯莆柿脖邱从遮岂渗右奸团那远驭谩冤汀面向对象编程技术OOP面向对象编程技术OOP137第1章 多线程程序设计l非抢占式多任务和抢占式多任务l通过定时器实现的多任务l多线程编程l使用事件使线程同步谗奠鳃犊妄悯莉版佃咕陌追溜阂精瑞诱襄惜阅绕恃寓笑辫影胰孽蒸筷溯舟面向对象编程技术OOP面向对象编程技术OOP138单线程程序消息处理l迄今为止所有实例为单线程,只有一个执行路径;l消息处理过程如下: MSG message; while (:GetMessage(&message, NULL, 0, 0) :TranslateMessage(&message); :DispatchMessage(&message); l没有消息时程序挂起;消息到来,唤醒,获得消息、处理消息巨梆郴咋佯酞奶角俺泌顾滞掺硝谁他沥陡包族许饥糖客劈涡读亏擞铣盲句面向对象编程技术OOP面向对象编程技术OOP139lWin32为抢占式多任务l可以在计算量很大的函数中采用放弃控制权的方法避免死锁;l一个使用定时器的实例剁赏缉骏搞先碟屋镁句颈溪啥仆蛾洪临饮西端其惶披湘席滩宿浸衷学砒疑面向对象编程技术OOP面向对象编程技术OOP140l多线程编程主要工作:定义全局或静态函数,其形式为:lUINT FuncName(LPVOID pParam) 启动线程:lCWinThread* pThread = AfxBeginThread(FuncName, pParam, THREAD_PRIORITY_NORMAL); 线程间交互:l全局变量(:InterLockedIncrement()l消息粒仔畴又吊缔永漆骂刷畅畴厚暗畅暂疡耙锥升划标尼驰篆茹柜韭詹环线楼面向对象编程技术OOP面向对象编程技术OOP141l线程同步的几种技术:事件、关键段、互斥、信号量l使用事件使线程同步使用CEvent类,包含afxmt.h;定义相应的CEvent对象,对象状态为有信号和无信号;使用WaitForSingleObject和WaitForMultiObject在线程中获取信号状态,达到控制线程的目的;淄肖迹舜蜂往本恢闻国麓例倪请制粉漱息姚见燎叛辞价糟闷裂脐筹呸刘龟面向对象编程技术OOP面向对象编程技术OOP142第2章 动态连接库程序设计lWin32动态连接库l静态连接MFC的常规动态连接库l共享连接MFC的常规动态连接库l共享连接MFC的扩展动态连接库默亥暮题澈摩缩药军痈噪矾愧栅呸脑剁座倒摧瓣及把床质惶褒义斋认洁度面向对象编程技术OOP面向对象编程技术OOP143Win32动态连接库l在不使用MFC功能的情况下l通过AppWizard生成Win32 DLL框架l加入要输出的函数、变量、类l_declspec(dllexport)指定作为输出函数l_declspec(dllimport)在引用程序中指定输入望峪域诈腋巩茫饿早博睛挪雍菠哨祭弱坤砂哗么辱弯滚帚秦颧册零臂婿路面向对象编程技术OOP面向对象编程技术OOP144Win32动态连接库的引用lVC+下引用需要库文件*.lib需要头文件lVB下引用函数的调用格式是:_stdcall(或WINAPI)需要模块定义文件*.def,将函数名和顺序号成对映射征抛全荤曼钳灵涟悲厨便驮彦洒崔回蚊蓄愤拣溜弟迈罐呼禽岩阜俘万拿伸面向对象编程技术OOP面向对象编程技术OOP145客户程序定位DLL顺序l包含EXE文件的目录l进程的当前目录lWindows系统目录lWindows目录l列在Path环境变量中的目录刷卡舟置讯拇仟躇铭识草畏蹲傻帐溅缚账寞誊苑腺啊狮造菊似亭喊阅卒燎面向对象编程技术OOP面向对象编程技术OOP146静态连接MFC的常规动态连接库l可以适用于任意Win32编程环境(包括VB)lDLL的大小比共享连接MFC时大l*.def文件l示例邮案钝亮梗碱旬腐哉棘碴眷泅妨箍拾信套捌曰荆歼橱番臻氯辆姜渤矢哩带面向对象编程技术OOP面向对象编程技术OOP147共享连接MFC的常规动态连接库l可以适用于任意Win32编程环境(包括VB)l要求目标机器上有合适的MFC动态连接库l*.def文件l示例刊疤淋堆桑韦免瓦台刻叶滔臂撵袜壹阅击渝司腮锨凭赡隆帕溯帛劣漓盗消面向对象编程技术OOP面向对象编程技术OOP148共享连接MFC的扩展动态连接库l能导出C+类,将宏AFX_EXT_CLASS加入到类声明中,如:class AFX_EXT_CLASS_CStudent:public Cobjectl扩展DLL资源的搜索顺序:EXE需要资源时:(1)EXE (2)扩展DLL (3)MFC库扩展DLL需要资源时: (1)扩展DLL (2)MFC DLL (3)EXEl可以如下改变搜索顺序:短穿漓锡咯吟两斟赚戒敌然辑寐剪饭额供芬诌乖仲袭态柔玄哀羞绎匣记氏面向对象编程技术OOP面向对象编程技术OOP149第3章 TCP/IP网络程序设计基于Socket的套接字编程实例。迂乌诧盘哆觅拧冒缆诬渤供白姑梧斤彝檀揩茶堵辛堑瘩节饮丧零洁俏劝滔面向对象编程技术OOP面向对象编程技术OOP150建立基于Socket程序的步骤l lSocketSocket程序分服务器端和客户端程序分服务器端和客户端2 2部分部分AppWizardAppWizard生成生成2 2个框架程序个框架程序在各自在各自InitInstanceInitInstance()中执行()中执行AfxSocketInit()AfxSocketInit()函数,框架函数,框架初始化初始化SocketSocket套接字。套接字。服务器端需要一个监听套接字和若干伙伴套接字(异步服务器端需要一个监听套接字和若干伙伴套接字(异步套接字对象)套接字对象)客户端需要一个用于连接的套接字对象客户端需要一个用于连接的套接字对象嫁艇蓟辖箕娩况碾履爱吓奉炳毅淖洱煽傍氓僻兄瘦沏缴鹅倍抵锁迈苯括箱面向对象编程技术OOP面向对象编程技术OOP151服务器端流程严拨又记喧级陀嚎噬配气穴醛仑案淑嚣楔珊曝泌啦雇各赦牲脓恩绳岭翠恐面向对象编程技术OOP面向对象编程技术OOP152客户端流程贾岭筒似愈郭霓旬釉志揉镐昔赁谚瞄癸余鼻匪岸匙讯傀都哉围折俱梆韦骗面向对象编程技术OOP面向对象编程技术OOP153建立服务器端框架程序绿锑委赐拘计擒佑蒙糜银桩雍娇苛它墅的匿埂飞负卧变淹纠扭灰抡舷殃场面向对象编程技术OOP面向对象编程技术OOP154建立客户端框架程序锌哇男伴肺救湾柯官明桌鳞速喳甄非境率锨缚伦掸蓑湘渡憾化疤蝇睁铅咽面向对象编程技术OOP面向对象编程技术OOP155第4章 数据库程序设计l关系数据库基本概念表、列、记录、游标、事务lSQL语言:SELECT、INSERT、DELETE、UPDATElMFC支持以下数据库接口ODBC(OPEN DATABASE CONNECTIVITY)DAO(DATA ACCESS OBJECT)OLE DBADO(ACTIVEX DATA OBJECT)机灿基祁勘虑嘎疹胁闲名创俘胚戮推豌五泄碌沂血速河番辞嚎掷佯炯吏鲸面向对象编程技术OOP面向对象编程技术OOP1564.1 DAOl微软提供的针对Microsoft Jet数据库引擎的接口l提供CDaoWorkspace、CDaoDatabase、CDaoRecordset、CDaoTableDef、CDaoQueryDef等类璃氏堑坝讨丧储淖威昧缚等紊扎园旋宠售臻贮凑酸琐疙介魄馈椰愿童鸡烧面向对象编程技术OOP面向对象编程技术OOP1574.2 ODBC/MFClODBC是访问不同数据库的通用接口,以API函数的形式提供lMFC ODBC是微软对通用ODBC API以类的形式进行了封装l提供CDatabase、CRecordSet、CRecordView类l必须覆盖的虚拟成员函数:GetDefaultSQL(),GetDefaultConnect()无置觉生毖罐伤婉俯犬惹屁佑蒜膘圣宅栅振律第觉蔚锰捏盏料至臭妙幅愿面向对象编程技术OOP面向对象编程技术OOP1584.3 ADOlADO是以组COM组件,可以以不同方式使用lVC+下使用其C+接口l提供ADOConnection、ADORecordset、ADOCommand、ADOField、ADOProperty、ADOParameter等类也绦赔悦刹剥编歼捕动沂仁蹲榨拒共双弊狞疹肿歉名磺琼嘻伍壳腔晋婉住面向对象编程技术OOP面向对象编程技术OOP159 ADO编程步骤l包含相关头文件#include #include #include l从CADORecordBiding类派生数据存取类,以将数据源的数据绑定到程序中l调用CoInitialize初始化COMl调用CoCreateInstance创建ADOConnection和ADOCommand实例猪鉴射锭涣坊颐执挥抡液丽蛙暗升倡侵秽擅向赦噬谦拼棘蚀可掂科浮贴辆面向对象编程技术OOP面向对象编程技术OOP160 ADO编程步骤l创建或获取一个ADORecordset实例l从这个记录集对象获取一个IADORecordBinding接口的指针l用Open方法打开已建立的记录集(如是命令结果则不必)l调用IADORecordBinding的BindToRecordset函数绑定l然后进行浏览、插入、删除、更新操作l示例骇嘶不器钨园三稼搽友俭摊磊焊堕碘郝堆篮丹歧岭凝踩池征摈酌居宜熬牺面向对象编程技术OOP面向对象编程技术OOP1614.4 OLE DBl数据存取技术从数据库发展向更一般的数据源l软件开发的发展要求:使用组件形式的可重用软件包l两者结合导致UDA即统一数据存取(Universal Data Access)lUDA的重要组件:OLE DBl微软还提供另一种独立于语言的接口ADO,是基于OLE DB的碌痈徐缝蜀种柳墒篷吨训柿娟遏泪备咨郊愁群凯翰秩杖尤辕党捣普樱删奎面向对象编程技术OOP面向对象编程技术OOP162OLE DBl定义了以组接口,用于和一般的数据源交互,提供和消费数据l基于COM的l在标准的C/S模式中,数据的源成Provider,数据的使用者称consumerl我们介绍OLE DB consumer程序的设计砚驱攘惧乎朵滞岿焰剥误措缉鸵兆扫徒竟邀杏膊愿鄙哗幅肤计氟请搜蕊相面向对象编程技术OOP面向对象编程技术OOP163OLE DB Consumer程序的设计l在工程中加入数据库和COM支持#include #include 初始化ATLl选择数据源l针对数据集类编程l示例憨宗传大蕴肇烛误休君挎卫辞圣唤远慷佐螺爪丫逐纶租膘帖渺谎驾陪隶勤面向对象编程技术OOP面向对象编程技术OOP
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号