当前位置: 首页 > news >正文

(转)VC++中ondraw在什么时候调用的

http://blog.csdn.net/lary2360433/article/details/6405737

问题:我在视图画的图象或者文字,当窗口改变后为什么不见了?OnDraw()和OnPaint()两个都是解决上面的问题,有什么不同?
因为当你的窗口改变后,会产生无效区域,这个无效的区域需要重画。一般Windows回发送两个消息WM_PAINT(通知客户区有变化)和 WM_NCPAINT(通知非客户区有变化)。非客户区的重画系统自己搞定了,而客户区的重画需要我们自己来完成。这就需要OnDraw()或 OnPaint()来重画窗口。
OnDraw()和OnPaint()有什么区别呢?
首先:我们先要明确CView类派生自CWnd类。而OnPaint()是CWnd的类成员,同时负 责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,并且没有响应消息的功能。这就是为什么你用VC的程序代码时,在视图类只有 OnDraw没有OnPaint的原因。
其次:要想在屏幕上绘图或显示图形,首先需要建立设备环境DC,其实DC(Device Context设备上下文)是一个结构,它定义了一系列图形对象及其相关的属性,也就是设备环境的属性的集合,这些设备包括打印设备。显示设备,输出设备等,
这些图形对象包括:画笔(用于画直线),笔刷(用于绘图和填充),位图(用于屏幕的拷贝或滚动),调色板(用于定义可用的颜色集),剪裁区(用于剪裁和其他操作),路径(用于绘图和画图操作)。

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()函数强制的重画窗口,具体的请参考MSDN

 

 推荐一个博客很不错的:http://www.cnblogs.com/kzloser/

相关文章:

  • poj2575
  • 系统函数
  • Java基础代码实例 :在控制台中输出金字塔,这个金字塔是由左右对称的数字组成的。...
  • Linq中使用Left Join
  • jdbc封装
  • Eclipse不能重新编译 java文件
  • SAP HANA中导入文件时的时间格式问题
  • LoadRunner结果分析笔记
  • Fedora 16 安装 Mp3和视频播放器
  • Windows黑客基础(2):获取其他进程的HANDLE
  • EOF 后面的空格
  • ACM半路失踪~我去找WEB了
  • 升级CentOS5.6_X64 python2.4.3到2.7
  • php 数据库连接类
  • C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容...
  • 【Amaple教程】5. 插件
  • co模块的前端实现
  • download使用浅析
  • gulp 教程
  • hadoop集群管理系统搭建规划说明
  • IndexedDB
  • isset在php5.6-和php7.0+的一些差异
  • JavaScript 基本功--面试宝典
  • npx命令介绍
  • PHP变量
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • ubuntu 下nginx安装 并支持https协议
  • 闭包--闭包作用之保存(一)
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 分布式任务队列Celery
  • 近期前端发展计划
  • 前端代码风格自动化系列(二)之Commitlint
  • 设计模式走一遍---观察者模式
  • 推荐一个React的管理后台框架
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 一文看透浏览器架构
  • 与 ConTeXt MkIV 官方文档的接驳
  • 字符串匹配基础上
  • 自定义函数
  • raise 与 raise ... from 的区别
  • #### go map 底层结构 ####
  • (07)Hive——窗口函数详解
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (ZT)出版业改革:该死的死,该生的生
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (一)UDP基本编程步骤
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET 指南:抽象化实现的基类