作者:朱金灿
来源:http://blog.csdn.net/clever101/
下面是对话框的OnPaint函数(就是WM_PAINT消息的响应函数)的两种写法。
写法一:
写法二:
开始以为这两种写法并无区别。今天偶然发现了这个区别。这个区别大家也可测试一下。建一个基于对话框的工程。然后添加下面绘图代码:
然后把它放在两个不同的OnPaint函数里调用,如下:
或是:
一开始启动程序二者并无区别,但是在切换到其它程序窗口,比如打开一个txt文件再打开这个程序,你就会发现区别,写法一的效果会变为如下:
写法二的效果如下:
注意写法二能正常显示下面两个按钮。
让我们看看MSDN对CPaintDC是如何解释的?
CPaintDC objects encapsulate the common idiom of Windows, calling the BeginPaint function, then drawing in the device context, then calling the EndPaint function. The CPaintDC constructor calls BeginPaint for you, and the destructor calls EndPaint. The simplified process is to create the CDC object, draw, and destroy the CDC object. In the framework, much of even this process is automated. In particular, your OnDraw function is passed a CPaintDC already prepared (via OnPrepareDC), and you simply draw into it. It is destroyed by the framework and the underlying device context is released to Windows upon return from the call to your OnDraw function.
CClientDC objects encapsulate working with a device context that represents only the client area of a window. The CClientDC constructor calls the GetDC function, and the destructor calls the ReleaseDC function.CWindowDC objects encapsulate a device context that represents the whole window, including its frame.
大致的翻译是:CPaintDC对象封装了Windows的,调用BeginPaint函数,然后在设备上下文上绘图,然后调用EndPaint函数的常见用法。该CPaintDC构造函数调用BeginPaint函数,在析构函数调用EndPaint。简化的处理过程就是创造CDC对象,绘制,并摧毁了CDC对象。在框架内,即使是这个过程的大部分是自动的。特别是,你的OnDraw函数传递一个CPaintDC已经准备通过OnPrepareDC(),你通过它进行简单的绘图。它是由框架销毁和从调用您的OnDraw函数返回到基本设备上下文被释放后回Windows。(这一句的翻译有问题)
CClientDC对象封装与一个设备上下文,表示只有一个窗口的客户区。该CClientDC构造函数调用GetDC的功能,析构函数调用ReleaseDC function.CWindowDC对象封装了表示整个窗口(包括它的框架)的设备上下文。
也就是说,第二种写法比第一种写法做的工作要多。在此多谢VC知识库的benben、bl、sjdev等诸位大侠。
分享到:
相关推荐
在vs2005下面写的绘图函数,简单实用
基于MFC对话框程序,利用picture控件显示位图,并可实现图像重绘。内有代码与实现之详细步骤。
MFC中改变对话框背景的几个消息函数的调用顺序、VC中OnPaint()的工作原理.
此代码写的是用OnPaint函数和CDC类实现对对话框界面的绘制,使用双缓冲技术避免闪烁问题。
选题为“函数曲线动态绘制”,要求使用面向对象设计环境,编程实现函数曲线的自动绘制
详细介绍OnDraw与OnPaint有什么区别
OnPaint()与OnDraw()的区别
在对话框的OnPaint()函数中加入下面语句: CRect rect; GetClientRect(&rect); //计算对话框的尺寸 dc.FillSolidRect(&rect,RGB(192,248,202)); //绘制对话框背景色 2.如何让弹出式对话框具有统一的背景色: 在...
代码如下:protected ...(一)重绘时候经常会用到OnPaint()和Paint,它们有什么区别呢? 1.OnPaint方法是对一个控件来说的;而Paint事件是对一个控件对象来说的。它们中前者相当于是类的一个成员函数,而后者相当于
C#完整的截屏源代码及注释 C#完整的截屏源代码及注释
利用VS建立MFC基于对话框的工程,其他默认。之后添加两个文本输入控件,两个按钮控件,并为文本控件建立两个...找到:OnPaint() 函数,在该函数最后的 }前添加实现代码。本资源以上传全部解决方案文件,可直接运行使用。
压缩包中一共有三个源代码,分别用图片填充单文档、对话框和对话框picture控件的背景,只要在onpaint或ondraw中加一段代码即可。
MFC几个常用的函数介绍,OnDraw和OnPaint的区别等
资源在VS2008 SP1开发环境中实现了在OnPaint()函数中自己绘制柱状图和折线图的功能,可供参考。
该程序在VC6.0的对话框中利用双缓冲技术实现了无闪烁绘制图像,其中实现部分在OnPaint函数中。
VS2010 实现对话框程序设置背景图片 void CMySendToDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()),...
VC++ 鼠标跟随 烟花、水纹特效,使用了OnTimer,OnPaint函数,鼠标跟踪,在鼠标经过处显示特效。 适用于初学者熟悉OnTimer,OnMouseMoveOn及OnPaint函数。
对话框用户界面程序的编写,如何向对话框控件联接数据成员及其实现机理,如何向对话框控关联控件类,如何利用对话框类的成员函数向控件发送消息和获取对话框控件的类指针,如何直接利用对话框控件类操纵对话框控件...
重写窗体重绘事件 protected override void OnPaint(PaintEventArgs e) { e.Graphics.DrawImage((Image)pic,new Point(0,0));//重绘窗体 }