vc技术内幕第四版读书笔记(编辑修改稿)内容摘要:

用我们操心。 编译在 VC++中有两种模式,一种是 Release Build 另一种是 Debug Build。 它们之 间的区别在于, Release Build不对源代码进行调试,不考虑 MFC的诊断宏,使用的是 MFC Release库,编译十对应用程序的速度进行优化,而 Debug Build 则正好相反,它允许对源代码进行调试,可以定义和使用 MFC的诊断宏,采用 MFC Debug 库,对速度没有优化。 所以我们应该在Debug 模式下开发应用程序,然后在 Release模式下发布应用程序。 在我们的工程文件夹下会有一个 Debug 文件夹和一个 Release文件夹分别存放输出文件和中间文件。 诊断宏是我们编译程序时检测程序状态的有利工 具,例如上两篇用到的 TRACE 宏,可以在Debug 窗口获得你需要的诊断信息,而不用设置对话框之类的方法,在发布时 Release会自动滤掉此信息。 为了更好的管理项目,最好理解系统是如何处理预编译头文件的。 VC++有两个预编译系统:自动的和手工的。 这一部分笔者就不多说了,建议读者好好看看。 Top of Page 第五天 基本事件处理 用户在视窗中的任何一个操作,都会引起 Windows 自动发送一个消息给该视窗。 我们以一个例子来说明:比如我们在视窗中按下鼠标左键, Windows 就会发送 ON_LBUTTONDOWN消息给视窗,那么在视窗类中就必须包含下面的成员函数: Void CmyView::OnLButtonDown(UINT nFlags, Cpoint point) { //event processing code here } 在类头文件中也要包含相应的函数声明: afx_msg void OnLButtonDown(UINT nFlags, Cpoint point) 在代码文件中还要有一个消息映射宏,用于将 OnLButtonDown 函数和应用程序框架联系在一起: BEGIN_MESSAGE_MAP(CmyView, CView) ON_WM_LBUTTONDOWN() // other message map entries END_MESSAGE_MAP 最后,在类库头文件中包含如下语句: DECLARE_MESSAGE_MAP() 以上这些步骤,我们都可以借助于 ClassWizard来完成。 这就是消息映射的过程。 MFC库对 140 种 windows消息直接提供了消息控制函数,并且我们还可以自己定义自己的消息,下面列出的五种消息是我们应该特别注意的( MSDN 上有更详细的内容)。 WM_CREATE 该消息是 Windows发给视图的第一个消息。 当应用程序框架调用 create函数时该消息便会被发送,此时窗口还未创建完成,不可见,因此在消息控制函数 OnCreate内不能调用那些依赖窗口处于完全激 活状态的 Windows 函数。 如果需要可以在重载的 OnInitialUpdate 函数内调用。 不过注意在 SDI 应用程序 OnInitialUpdate 函数可能被多次调用。 WM_CLOSE 当用户关闭窗口时,系统会发送 WM_CLOSE 消息。 如果派生类重新定义了 OnClose函数,就可以完全控制关闭过程,可以将提醒用户存盘之类的工作放在这里完成。 我们可以通过重载CDocument::SaveModified虚函数达到相同的目的。 WM_QUERYENDSESSION 从字面的意思看就可以看出,当用户退出 Windows 时,或者调用了 ExitWindows 函数时。 Windows 会发送 WM_QUERYENDSESSION 消息给所有的正在运行的应用程序,由OnQueryEndSession 消息映射函数对消息进行处理。 在它之后应该是 WM_ENDSESSION 消息。 WM_DESTROY 在 Windows 发送 WM_CLOSE消息后,紧接着会发送 WM_DESTROY消息,虽然窗口已经 Close但实际上并没有完全清除,在任务管理器中还可以看见应用程序的进程(我想很多木马或病毒都是无窗口的程序,它们的做法是生成了已经活 动状态的窗口但不显示出来),利用这个消息控制函数便可以对依赖于当前窗口存在的东西做清除工作,不过一定要注意,应该调用基类的 OnDestroy 函数,而不能在用户自己的视图的 OnDestroy函数中终止窗口的析构过程,终止析构过程应该在 OnClose函数中。 WM_NCDESTROY 当窗口被取消所发送的最后一个消息就是这个消息。 我们可以在 OnNcDestroy 函数中做一些不依赖该窗口是否处于活动状态的最后的处理工作,(我实在想不出还需要做什么。 那位朋友能给个例子),注意一定要调用基类中的 OnNcDestroy 函数。 MFC 库中非静态数据成员的名字以 m_为前缀。 一个窗口具有一个矩形的 客户区域 , CWnd中的 GetClient成员函数可以给出客户区域的大小,只允许在客户区域内绘图。 标准的 windows 应用程序会首先登记一个窗口类,这不同于 C++类,同时在处理过程中,还需要对每个类指定窗口过程。 每次应用程序调用 CreateWindow 建立一个窗口时,都要指定一个窗口类作为参数,这样就把新建立的窗口和窗口过程函数连接起来了,每次 windows给窗口发送消息的时候,这个函数就会被调用,以检查用参数传 进来的消息码。 Top of Page 第六天 映射模式 所谓映射模式,说白了就是坐标系。 在默认情况下, Windows所绘图像单位为像素,这是因为设备环境用了默认的映射模式 MM_TEXT,所以如下语句所绘图形为长和宽都为 200像素的方块: pDCRectangle(CRect(0,0,200,200))。 那么我们要绘制一个长和宽都是 4厘米的方块该怎么做呢。 这就必须改变设备环境的默认映射模式为 MM_HIMETRIC,它的图像单位为 1/100mm,而不是像素了。 它的 y轴方向和MM_TEXT的相反,它的向下为递减的,因此用如下语句就可以绘出 44cm 的方块了: pDCSetMapMode( MM_HIMETRIC)。 pDCRectangle(CRect(0,0,4000,4000))。 下面我 们再来了解一下 Windows 都提供了哪些映射模式。 MM_TEXT映射模式 这种模式下,绘图单位为像素, x轴向右递增, y轴向下递增,我们可以用 CDC 的SetViewPortOrg 和 SetWindowOrg 函数来改变坐标原点的位置,下面的代码就是把坐标原点设在了( 100,100)处,画了一个 200200 像素的方块,此时逻辑坐标点( 100,100)被映射到了设备坐标点( 0,0)处,下一篇的滚动窗口使用的就是这种变换。 Void CmyView::OnDraw( CDC *pDC ){ pDCSetMapMode(MM_TEXT)。 pDCSetWindowOrg(Cpoint(100,100))。 pDCRectangle(CRect(100,100,200,200))。 } 固定比例映射模式 Windows 提供了一组非常重要的固定比例影视模式,所有这种模式都遵循 x轴向右递减,y轴向下递减的规则,而且我们无法将其改变。 固定比例模式之间唯一的差别就在于实际的比例因子。 下表列出了影视模式和比例因子的对应情况: 映射模式 逻辑单位 MM_LOENGLISH 英寸 MM_HIENGLISH 英寸 MM_LOMETRIC MM_HIMETRIC MM_TWIPS 1/1440 英寸 MM_TWIPS 模式常用于打印机。 可。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。