Visual C++的程序设计技巧

Microsoft Visual C++是一种可视化编程语言,因功能强大而受到广大程序设计人 员的青睐。但是,由于VC++的应用程序框架结构非常复杂,使得许多初学者望而却步。 本文通过对设置视图背景颜色和改变对话框标题的几种实现方法的分析研究,揭示了VC+ +程序代码执行时的一些本质特征和有关的程序设计技巧,对理解MFC库的结构和Windows 操作系统的内部工作方式提供了一定的帮助。

设置视图背景颜色

对于VC+ +文档、视结构中的视图,从用户的角度来看,只是可以改变大小、位置的普通窗口,同 其他基于Windows应用程序的窗口是一样的;从程序员的角度来看,视图并不是普通的窗 口,而是从MFC库中CView类派生的类对象。像任何VC++对象一样,视图对象的行为由类 的成员函数(数据成员)决定,包括派生类中应用程序定义的函数和从基类继承来的函数 。

提出问题

视图的背景一般来说是白色的,在缺省情况下,它和系统定义 的颜色COLOR_WINDOW是一致的。设计者一般会希望自己的程序可以让用户轻松地改变窗口 背景颜色,或是用漂亮的图片来充填背景。我们可以用Windows函数SetSysColors来重新 指定COLOR_WINDOW所对应的实际颜色,来达到改变视图背景颜色的目的。但这样会同时改 变其他应用程序的视图窗口背景,使得整个Windows系统的颜色设置产生混乱。另外,我 们可能会用以下方法来设置视图的背景颜色,即在CView的OnDraw函数中添写如下一段程 序代码:

void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rectClient;
CBrush brushBkColor;
GetClientRect(rectClient);
brushBkColor.CreateSolidBrush(RGB(255,0,0));
pDC->DPtoLP (rectClient);
pDC->FillRect(rectClient,&brushBkColor);

}

这样可以达到改变当前应用程序的视图背景的目的, 但同时也产生了一些不良影响,使得程序运行效果不尽如人意。

分析问题

我们知道,在VC++的文档、视结构中,CView的OnDraw函数用于实现绝大部分图形绘制 的工作。如果用户改变窗口尺寸,或者显示隐藏的区域,OnDraw函数都将被调用来重画窗 口。并且,当程序文档中的数据发生改变时,一般必须通过调用视图的Invalidate(或 InvalidateRect)成员函数来通知Windows所发生的改变,对Invalidate的调用也会触发 对OnDraw函数的调用。正因为OnDraw函数被频繁调用,所以在其执行时,每次都刷新填充 一次视图客户区域,便会使屏幕不稳定,产生闪烁现象。

笔者通过对VC++应用 程序框架结构和Windows消息映射系统的仔细研究,找到另外一种改变视图背景的方法, 其执行效果比上述两种方法都好。其实在程序调用OnDraw函数之前,会触发一个Windows 消息:WM_ERASEBKGND,以擦除视图刷新区域。在缺省情况下,Windows系统使用视图窗口 注册时窗口类中的成员hbrBackground所描述的画刷来擦除屏幕,这一般会将屏幕刷新成 COLOR_WINDOW所对应的颜色。因此,在OnDraw函数中设置背景颜色的执行过程是这样的: 先将屏幕刷新成COLOR_WINDOW所对应的颜色,接着又在OnDraw函数中填充其他颜色,这正 是产生屏幕闪烁的根本原因。

解决问题

通过上述分析,我们应将视图背景 颜色填充移到Windows消息:WM_ERASEBKGND所对应的消息映射函数中,而不是在OnDraw函 数中。我们可以通过下列步骤实现这一过程:在文档类中增加一成员变量m_viewBkColor 保存当前背景颜色,同时增加两个成员函数GetViewBkColor和SetViewBkColor对其进行读 写操作。这样做的好处是可以对m_viewBkColor成员进行序列化,将其和文档联系在一起 ,打开某一文档时,其背景将和上一次程序操作该文档时的背景保持一致。在视图类中为 视图的Windows消息WM_ERASEBKGND增加消息映射函数OnEraseBkgnd,代码如下:

BOOL CTestView::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
CBrush brush;
brush.CreateSolidBrush(GetDocument()->GetViewBkColor ());
pDC->GetClipBox(rect);
pDC->FillRect(rect,&brush);
return true;
}

时间: 2024-12-31 01:20:16

Visual C++的程序设计技巧的相关文章

070_《Delphi7程序设计技巧与实例》

<Delphi7程序设计技巧与实例> Delphi 教程 系列书籍 (070) <Delphi7程序设计技巧与实例> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Part1 Part2 Part3   作者: 吴天准 书号: 7-113-05177-4 页码: 526 开本: 16开 版次:1-1 出版社: 中国铁道出版社 出版日期: 2003-5-1 内容简介 ◆清华大学教师力作,包含作者多年编译器研究与程序设计教学经验 ◆深入Object Pasc

Visual C#程序设计技巧小结

visual|程序|技巧|设计 获取文件的版本信息: FileVersionInfo myFileVersionInfo1 = FileVersionInfo.GetVersionInfo("D:\\TEST.DLL");textBox1.Text="版本号: " + myFileVersionInfo1.FileVersion; 更改文件属性,删除只读文件: 下例欲将E:\test.txt文件拷贝至D:\tmp\test.txt,但D:\tmp\test.txt已

Visual C# 2005开发技巧

Visual C# 2005在变量类型.泛型等方面都作了一些强化,基本上,可以将此细分为下列几个部分: 要增进程序编写的效率,利用程序代码段是非常多程序设计员使用的方法,深入地了解程序代码段将为您带来如虎添翼的效果. 使用变量之前,一定要先声明变量类型.Visual C# 2005 新增了Null类型,让变量在处理数据时能够获得更大的弹性,如果您运算的数据常出现Null值,则绝对不能错过此部分. 在逻辑判断上,除了常用的if.else.switch.case之外,不要忘了还有关键词Is可以使用.

提高你开发效率的十五个Visual Studio 2010使用技巧

相信做开发的没有不重视效率的.开发C#,VB的都知道,我们很依赖VS,或者说,我们很感谢VS.能够对一个IDE产生依赖,说明这个IDE确实有它的独特之处.无容置疑,VS是一个非常强大的IDE,它支持多语言编辑.支持C#,VB,C/C++,HTML......它拥有强大的调试编译功能.它让我们不用去记住那些安装,环境变量设置,服务器设置,编译的繁琐过程.高度集成化.凡事有利有弊,在敏捷开发盛行的时代,VS是否值得我们使用是无容置疑的.但是强大的VS也拥有众多的设置,众多的技巧.记住某些小技巧可以让

&amp;amp;lt;&amp;amp;lt;Visual Studio .NET使用技巧手册 - 涵盖2002, 2003和2005版&amp;amp;gt;&amp;amp;gt;(PDF高清版)

问题描述 VisualStudio.NET是微软推出的功能最丰富,扩展性最强的编程工具.VS.NET中的功能与快捷方式不计其数,并且在每一个版本中都会明显增加.不熟悉这些节省时间的功能的话,开发者会错过提高开发生产力和效率的大好机会.本书主要介绍如何高效使用VS.NET.全书内容分为精练而容易把握的几部分,收录的技巧从编辑代码,到编译和调试,以及VS.NET编译器深入了解等多个方面,对所有开发人员而言都是本必读的书籍,无论他们是否熟练,或者使用哪种开发语言.本书涵盖了VisualStudio.N

苹果iphone手机有趣的应用程序设计技巧

文章描述:苹果iphone手机中有许多有趣的应用程序,很多程序界面设计中考虑了许多用户使用细节和感受,本文将列举4个我们常见的应用功能,看看iphone中他们是通过什么有趣方式实现的. 苹果iphone手机中有许多有趣的应用程序,很多程序界面设计中考虑了许多用户使用细节和感受,本文将列举4个我们常见的应用功能,看看iphone中他们是通过什么有趣方式实现的. 我们使用的大多数电脑程序在删除某个文件时,都会弹出一个对话框进行确认,但是在iphone手机中,有时候频繁进行删除操作是很麻烦的. 所以i

C#程序设计技巧

获取文件的版本信息: FileVersionInfo myFileVersionInfo1 = FileVersionInfo.GetVersionInfo("D:\\TEST.DLL"); textBox1.Text="版本号: " + myFileVersionInfo1.FileVersion; 更改文件属性,删除只读文件: 下例欲将E:\test.txt文件拷贝至D:\tmp\test.txt,但D:\tmp\test.txt已经存在. //File.Cop

ASP生成伪参数程序设计技巧_应用技巧

前两天在做一个站内版的企搜引擎,发现某些站点可以链接站点内容..  奇怪之下看了看,原来是按照数据库ID的自动编号规律进行链接的~~  闲暇之余弄了下面这个东东,希望对大家在以后的编写ASP程序中有所帮助!  <%  ''//生成指定位数的随机数字  ''//也可以用Guidy写的iXuEr_Rnd_Str函数,自带15种样式,可以伪MD5啦!!  Function rndStr(strLong)  Dim tempStr  Randomize  Do While Len(rndStr) < 

ASP生成伪参数程序设计技巧

前两天在做一个站内版的企搜引擎,发现某些站点可以链接站点内容..  奇怪之下看了看,原来是按照数据库ID的自动编号规律进行链接的~~  闲暇之余弄了下面这个东东,希望对大家在以后的编写ASP程序中有所帮助!  <% ''//生成指定位数的随机数字 ''//也可以用Guidy写的iXuEr_Rnd_Str函数,自带15种样式,可以伪MD5啦!! Function rndStr(strLong) Dim tempStr Randomize Do While Len(rndStr) < strLon