文档章节

OnPaint和OnDraw的区别

小青_1989
 小青_1989
发布于 2014/05/30 21:32
字数 699
阅读 13
收藏 0
点赞 0
评论 0

问题:我在视图画的图象或者文字,当窗口改变后为什么不见了?OnDraw()OnPaint()两个都是解决上面的问题,有什么不同?

答:OnDraw()OnPaint()好象兄弟俩,因为它们的工作类似。
至于不见了的问题简单,因为当你的窗口改变后,会产生无效区域,这个无效的区域需要重画。一般Windows会发送两个消息WM_PAINT(通知客户区 有变化)和WM_NCPAINT(通知非客户区有变化)。非客户区的重画系统自己搞定了,而客户区的重画需要我们自己来完成。这就需要OnDraw() OnPaint()来重画窗口。

OnDraw()
OnPaint()有什么区别呢?首先:我们先要明确CView类派生自CWnd类。而OnPaint()CWnd的类成员,同时负责响应WM_PAINT消息。OnDraw()CVIEW的成员函数,并且没有响应消息的功能。这就是为什么你用VC成的程序代码时,在视图类只有 OnDraw没有OnPaint的原因。

其次,要想在屏幕上绘图或显示图形,首先需要建立设备环境DC。其实DC是一个数据结构,它包含输 出设备(不单指你17寸的纯屏显示器,还包括打印机之类的输出设备)的绘图属性的描述。MFC提供了CPaintDC类和CWindwoDC类来实时的响应,而CPaintDC支持重画。

当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows  WM_PAINT 消息发送给它。该视图的 OnPaint处理函数通过创建 CPaintDC 类的DC对象来响应该消息并调用视图的 OnDraw 成员函数。通常我们不必编写重写的OnPaint 处理成员函数。

///CView
默认的标准的重画函数

void CView::OnPaint()

    CPaintDC dc(this);
    OnPreparDC(&dc);
    OnDraw(&dc); //调用了OnDraw
}


既然OnPaint最后也要调用OnDraw,因此我们一般会在OnDraw函数中进行绘制。下面是一个典型的程序

///视图中的绘图代码首先检索指向文档的指针,然后通过DC进行绘图调用。
void CMyView::OnDraw( CDC* pDC )

    CMyDoc* pDoc = GetDocument(); 
    CString s = pDoc->GetData(); // Returns a CString
    CRect rect;
    GetClientRect( &rect ); 
    pDC->SetTextAlign( TA_BASELINE | TA_CENTER ); 
    pDC->TextOut( rect.right / 2, rect.bottom / 2, s, s.GetLength() );
}

最后:现在大家明白这哥俩之间的关系了吧。因此我们一般用OnPaint维护窗口的客户区(例如我们的窗口客户区加一个背景图片),用OnDraw维护视图的客户区(例如我们通过鼠标在视图中画图)。当然你也可以不按照上面规律来,只要达到目的并且没有问题,怎么干都成。

补充:我们还可以利用Invalidate(),ValidateRgn(),ValidateRect()函数强制的重画窗口


本文转载自:http://blog.csdn.net/tracing/article/details/2806156

共有 人打赏支持
小青_1989
粉丝 3
博文 75
码字总数 12913
作品 0
大连
程序员
MFC中OnDraw与OnPaint的区别

此问题一直困扰着我,通过网络搜索整理下,看下OnDraw与OnPaint之间的区别和联系。 OnPaint是WMPAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDra...

colafei
2013/05/30
0
0
OnDraw()和OnPaint()的区别

问题:我在视图画的图象或者文字,当窗口改变后为什么不见了?OnDraw()和OnPaint()两个都是解决上面的问题,有什么不同? 答:OnDraw()和OnPaint()好象兄弟俩,因为它们的工作类似。 至于不见...

嗯哼9925
2017/12/27
0
0
VC++6.0中改变窗口背景颜色和控件背景颜色,CDC,我的感觉

VC++6.0中改变窗口背景颜色和控件背景颜色 1.改变对话框的背景色 在C…App类中的InitInstance()里添加 SetDialogBkColor(RGB(0,192,0),RGB(0,0,0)); 2.如果想改变静态文本或单选按钮的背景色...

长平狐
2013/01/06
2.4K
0
MFC绘图2-客户区大小和DC

MFC绘图2-客户区大小和DC 客户区大小和DC 在绘图前,必须先得到客户区大小和设备上下文DC。 1.获得客户区 绘图一般都是在视图窗口的客户区进行,而客户区的大小在运行时可由用户改变,为了使...

IMGTN
2012/06/10
0
0
如何对mfc窗体背景图片的设置

打开vc+的mfc工程,先载入一张图片,ID为IDB_BITMAP2 TestDlg.h中: CBrush m_brBk;//在public中定义 TestDlg.cpp中: 在初始化函数OnInitDialog()中加入: BOOL CTestDlg::OnInitDialog() { C...

crossmix
2015/10/07
1K
0
View 和 SurfaceView的区别

这里说的是在绘图中两者的区别: 1View在绘图中,重写onDraw(Canvas canvas)方法,通过invaldate()和pastInvalidate()两个方法进行重新绘制画布; invalidate()不能再自己创建的线程中循环调用...

宇宙执政
2014/07/25
0
0
Android 开发之自定义滑动开关

滑动开关-------- 自定义控件步骤: 测量:onMeasure设置自己显示在屏幕上的宽高 布局:onLayout 设置自己显示在屏幕上的位置(只有在自定义ViewGroup中才用到) 绘制:onDraw 控制显示在屏幕上...

Angels_安杰
2015/11/23
60
0
MFC OnPaint被不断调用的问题

本人最近在开发一个绘图程序,需用到OnPaint。虽说MFC也用了比较久了,但对OnPaint还是理解不深。在OnPaint中我把 CPaintDC dc(this); 注释掉了。然后自己手动获取 CDC 进行操作。导致OnPai...

llf_17
2016/07/05
0
0
CSharp加快自定义控件的绘制

前两天由于需要用CSharp做一个控件,就翻看了以前做控件里自己的代码。不看不知道,看了才知道以前自己写的控件糟糕到什么程度! 自定义一个控件需要继承CSharp提供的一个专门的用户控件类U...

quanwei9958
2014/04/19
0
0
MFC单文档程序架构解析

MFC单文档程序架构解析 这里我以科院杨老师的单文档程序来分析一下MFC单文档的程序架构,纯属个人见解,不当之处烦请指教! 首先我们了解到的是 图(一) theApp 是唯一一个在程序形成的时候...

长平狐
2012/07/12
328
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JEESZ分布式框架--单点登录集成方案

JEESZ分布式框架单点登录集成方案 第一节:单点登录简介 第一步:了解单点登录 SSO主要特点是: SSO应用之间使用Web协议(如HTTPS) ,并且只有一个登录入口. SSO的体系中有下面三种角色: 1) Us...

明理萝
10分钟前
0
1
【易错】一级缓存、二级缓存介绍与常见问题(四)

一般来说,可以在5个方面进行缓存的设计: 1.最底层可以配置的是mysql自带的query cache, 2.mybatis的一级缓存,默认情况下都处于开启状态,只能使用自带的PerpetualCache,无法配置第三方缓...

大白来袭
14分钟前
0
0
rancher安装kubernetes

参考https://rancher.com/quick-start/ 环境(必须相同。否则有很多问题): Ubuntu 16.04 Docker versions are 1.12.6, 1.13.1 or 17.03.2 1、docker安装https://docs.docker.com/install/l......

杰仪
14分钟前
0
0
几维安全Javascript代码混淆(js加密)在线使用说明

几维安全Javascript代码混淆是一项在线加密服务,用户只需将JS文件打包成zip包,提交到加密平台,即可完成代码混淆、字符串加密、属性加密、调用转换等多项保护措施,提高攻击者分析Javascr...

工作的事
17分钟前
1
0
解决dokuwiki创建中文词条文件乱码问题

若直接创建中文词条,打开本地文件夹\dokuwiki\data\pages你会发现,中文字段显示的是URL乱码,需要改一下utf8格式,方法如下:(linux系统亲测有效) 打开 .dokuwiki\conf\local.php 添加一行...

Rhymo-Wu
19分钟前
0
0
设置圆角长条progressbar背景色

1、首先在Drawable下面新建一个xml文件,将这段代码复制进去 <?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-......

王先森oO
19分钟前
0
0
Java语言学习(九):异常处理

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。常见的三种异常类型有: 检查性异常,如打开一个不存在的文件 运行时异常,如数组越界 错误,如栈溢出 ...

海岸线的曙光
23分钟前
0
0
深入分析golang多值返回以及闭包的实现

一、前言 golang有很多新颖的特性,不知道大家的使用的时候,有没想过,这些特性是如何实现的?当然你可能会说,不了解这些特性好像也不影响自己使用golang,你说的也有道理,但是,多了解底...

万建宁
23分钟前
0
0
img与background-image之间的区别

1.img <img src="图片来源" alt="图片无法显示时显示图片说明性文字" style="设置样式属性" /> img标签虽然不是块状元素,但是可以设置宽高,占位, img设置width后height会自适应匹配,如果...

爱喝水的小熊
25分钟前
1
0
Swift - 添加提示音

func createSound() { //建立的SystemSoundID对象 var soundID:SystemSoundID = 123 //获取声音地址 let path = Bundle.main.path(forResource: "3quan......

west_zll
27分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部