MFC SDI程序中OnDraw,OnPait,OnEraseBkGnd,Invalidate,UpdateWindow
来源:互联网 发布:极品统计软件下载 编辑:程序博客网 时间:2024/06/02 16:22
当窗口改变后,会产生无效区域,这个无效的区域需要重画。一般Windows会发送两个消息WM_PAINT(通知客户区 有变化)和WM_NCPAINT(通知非客户区有变化)。非客户区的重画系统自己搞定了,而客户区的重画需要我们自己来完成。这就需要OnDraw()或 OnPaint()来重画窗口。
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}
///视图中的绘图代码首先检索指向文档的指针,然后通过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的区别:
1、Invalidate()和InvalidateRect()其实是触发对onPaint()函数的调用,
OnPaint()函数调用OnDraw()函数,
OnDraw函数还需要同时支持打印机输出。OnPaint()函数和OnPrint()函数都要调用OnDraw(),于是同样的绘图代码既可以用于屏幕输出,也可以用于打印机输出
在编程中,一般重载OnDraw()就可以了。如果定义了OnPaint()函数,并且在OnDraw()里面有要显示的内容,那么需要显示的调用OnDraw(),即OnDraw(&dc)。
2、OnDraw()是被OnPaint()调用的虚函数,在CView中定义为纯虚函数,因此必须被重载,其设备上下文由OnPaint()提供。
OnPaint()是响应消息WM_PAINT的响应函数,默认实现中在,先调用BeginPaint(),最后调用EndPaint,而OnDraw在BeginPaint与EndPaint间被调用。
建议编程时使用OnDraw。
3、CView封装了两个函数,OnPaint()与OnPrint(),分别对应WM_PAINT与WM_PRINT。MFC为了提供更标准简易的编程接口,所以又提供了OnDraw()这个函数。OnDraw()将被OnPaint()或OnPrint()调用,根据二者分别传进来的不同DC(Paint DC或Print DC),从而完成屏幕绘制或打印工作,而不需再为两种情况分别写代码。当然,如果你只关心屏幕绘制工作,而不关心打印问题,那你完全可以直接重载OnPaint()完成绘制,而不使用OnDraw()。
BOOL CMyDlg::OnEraseBkgnd(CDC* pDC){ return TRUE;}
// m_bmpBKGND 为一CBitmap对象 且事先早已加载我们的底图// 底图的大小与我们的窗口client大小一致 BOOL CMyDlg::OnEraseBkgnd(CDC* pDC){CRect rc;GetUpdateRect(&rc);CDC srcDC;srcDC.CreateCompatibleDC(pDC);srcDC.SelectObject(m_bmpBKGND); pDC->BitBlt(rc.left,rc.top,rc.GetWidth(),rc.GetHeight(),&srcDC,rc.left,rc.top,SRCCOPY);return TRUE;}
Invalidate介绍 void Invalidate( BOOL bErase = TRUE ); 该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。与UpdateWindow( )的区别UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。
- MFC SDI程序中OnDraw,OnPait,OnEraseBkGnd,Invalidate,UpdateWindow
- MFC中Invalidate(); 和UpdateWindow();的用法
- MFC点点滴滴——Invalidate/InvalidateRect/UpdateWindow
- MFC Invalidate() 与 InvalidateRect() 与 UpdateWindow()
- MFC宏Invalidate()和UpDateWindow用法
- 在MFC SDI程序中使用SDL
- 在MFC SDI程序中使用SDL
- 在MFC SDI程序中使用SDL
- 在 MFC SDI 程序中实现多语言程序界面
- ONERASEBKGND OnPaint OnDraw
- 如何在MFC的SDI程序中实现多视图
- 如何在MFC的SDI程序中实现多视图
- MFC中SDI程序创建流程的回顾
- 如何在MFC的SDI程序中实现多视图
- Invalidate、OnPaint、OnEraseBkgnd函数
- Invalidate、OnPaint、OnEraseBkgnd函数
- Invalidate()与UpdateWindow( )
- Invalidate、InvalidateRect和UpdateWindow
- linux下关闭打开指定端口的程序的脚本
- Search the contents of packages
- PHP+MySQL+Apache搭建环境
- Android SQLite 数据库简单使用
- 编程原则 -- 十个java语言编程原则(转)
- MFC SDI程序中OnDraw,OnPait,OnEraseBkGnd,Invalidate,UpdateWindow
- 不常用的数据库操作整理
- Ubuntu14.10安装synergy1.4.12与win7共享键盘
- BZOJ 2072 POI2004 MOS 动态规划+贪心
- 实现Easyui文本框验证结果控制button启用/禁用
- iOS开发 -- 使用facebook的chisel来提高调试效率
- 《代码之髓》读书笔记(六)——从需要的地方开始阅读
- c++类函数指针
- Uploadify 3.2 参数属性、事件、方法函数详解