MFC OnPaint()函数中最先调用CDialog::OnPaint()和最后调用CDialog::OnPaint()的巨大区别

OnPaint()函数中最先调用CDialog::OnPaint()和最后调用CDialog::OnPaint()的巨大区别,如果没有注意这个问题就会出现无厘头式的绘图问题-- 效果就是出不来!在经过两个多小时的折磨后法相问题所在,总结出教训:

OnPaint()函数中首先就调用CDialog::OnPaint()函数:

[cpp] view plain copy

  1. //给主窗体客户区添加位图背景
  2. void CBackimageDlg::OnPaint()
  3. {
  4. CDialog::OnPaint()  //最开始就调用
  5. CPaintDC dc(this); // device context for painting
  6. CRect  rect;
  7. GetClientRect(&rect);
  8. CDC  dcMem;   //定义一个工具箱(设备上下文)
  9. dcMem.CreateCompatibleDC(&dc);///建立关联DC
  10. CBitmap  bmpBackground;   //位图对象
  11. bmpBackground.LoadBitmap(IDB_BITMAP1);   //IDB_BITMAP是你自己的图对应的ID
  12. BITMAP  bitmap;
  13. bmpBackground.GetBitmap(&bitmap);  //建立绑定关系
  14. CBitmap  *pbmpOld=dcMem.SelectObject(&bmpBackground);   //保存原有CDC对象,并选入新CDC对象入DC
  15. dc.SetStretchBltMode(COLORONCOLOR);//防止bmp图片失真
  16. dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,  bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
  17. dcMem.SelectObject(pbmpOld);
  18. bmpBackground.DeleteObject();
  19. dcMem.DeleteDC();
  20. }

运行效果:背景位图死活不出来,这种错误很难察觉哪儿出了问题

       OnPaint()函数中最后调用CDialog::OnPaint()函数:

[cpp] view plain copy

  1. void CBackimageDlg::OnPaint()
  2. {
  3. CPaintDC dc(this); // device context for painting
  4. CRect  rect;
  5. GetClientRect(&rect);
  6. CDC  dcMem;   //定义一个工具箱(设备上下文)
  7. dcMem.CreateCompatibleDC(&dc);///建立关联DC
  8. CBitmap  bmpBackground;   //位图对象
  9. bmpBackground.LoadBitmap(IDB_BITMAP1);   //IDB_BITMAP是你自己的图对应的ID
  10. BITMAP  bitmap;
  11. bmpBackground.GetBitmap(&bitmap);  //建立绑定关系
  12. CBitmap  *pbmpOld=dcMem.SelectObject(&bmpBackground);   //保存原有CDC对象,并选入新CDC对象入DC
  13. dc.SetStretchBltMode(COLORONCOLOR);//防止bmp图片失真
  14. dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,  bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
  15. dcMem.SelectObject(pbmpOld);
  16. bmpBackground.DeleteObject();
  17. dcMem.DeleteDC();
  18. CDialog::OnPaint();  //最后才调用
  19. }

运行效果:背景位图效果出来了

总结:

一句代码,两个位置,两种效果!如果稍不注意,这种错误是难以察觉的,我以前为Client区域绘制时一直很顺利,但是今天粗心大意犯下这个错误,我花了两个半小时检查我的代码(这个工程里有2000多行代码!开始猜想是代码间的干扰造成的),最后才注意到OnPaint()函数中的CDialog::OnPaint()的位置放错了!哎。

留下一点笔记,提醒自己!

http://blog.csdn.net/qq2399431200/article/details/17739087

时间: 2024-12-24 20:05:46

MFC OnPaint()函数中最先调用CDialog::OnPaint()和最后调用CDialog::OnPaint()的巨大区别的相关文章

wxWidgets第十二课 wxBufferedPaintDC OnPaint函数中的双缓存DC

说明 当使用DC进行图形渲染的过程中,会出现闪烁的问题,主要是图形是实时渲染的,如果先渲染在一块内存中,然后渲染完毕之后,才一次性贴图到屏幕上,就可以避免闪烁的问题.因此引入wxBufferedPaintDC.wxBufferedPaintDC继承自wxBufferedDC,wxPaintDC是其私有成员变量,因此该类只能够在wxPaintEvent事件中使用,也就是只能在OnPaint( wxPaintEvent& event )函数中使用. 为了使用该类,需要包含头文件#include &qu

Onpaint()函数中绘图出现问题:当多次进入onpaint()发现次数达到一定程度就会出现窗口不能再重绘导致窗口内容损坏的现象

我在一个按钮中调用sendmessage(wm_paint,0,0)达到36以上时,当最小化窗口然后再恢复就会发现窗口出现错误信息,而且窗口界面内容混乱不完整.原来以为是使用sleep()函数导致的问题,后来先通过把onpaint()函数内容注释掉,排除掉了sleep()函数导致的问题.再后来部分注释onpain()函数内的代码如下: brush1.CreateSolidBrush(RGB(255,255,255)); //pdc->SelectObject(brush1); pdc->Fil

怎样理解在函数中声明var x = y = 1后调用函数时, x是局部变量, y是全局变量

下面这段代码在执行的时候, 打印的结果是1, Error: undefined; function fn() { var x = y = 1; } fn(); console.log(y); // 1; console.log(x); // Error: undefined; 原因是这个函数在执行的时候, 是先执行的: y = 1; 因为这里的y在声明赋值时没有使用var, 因此会默认成为全局变量, 然后将一个全局变量的值赋值给一个局部变量x; 其实际的执行过程如下: var y = 1; fu

MFC中的Invalidate、OnDraw、OnPaint函数的作用

MFC中的Invalidate.OnDraw.OnPaint函数的作用 CWnd::Invalidate voidInvalidate( BOOL bErase = TRUE ); 该函数的作用是使 整个窗口客户区无效.窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘. 这时Windows会在应用程序的消息队列中放置WM_PAINT消息.MFC为窗口类提供了WM_PAINT的消息处理函数 OnPaint,OnPaint负责

Js函数的三种创建、四种调用

1 // 函数的三种创建方法 2 function one(){ // 函数声明,不属于任何对象,始终默认为全局对象 3 console.log("第一个函数") 4 //默认有一个return this,返回函数中的内容 5 } 6 one(); //必须调用:可以在函数声明前调用(预处理变异机制) 7 8 var fn=function(){ //函数表达式 9 console.log("第二个函数") 10 } 11 fn(); //必须先声明再调用 12 1

关于OnPaint函数的工作原理(很详细,很实用) [转载]

地址:http://blog.csdn.net/foreverhuylee/article/details/21889025 用了两年的VC,其实对OnPaint的工作原理一直都是一知半解.这两天心血来潮,到BBS上到处发帖询问,总算搞清楚了,现在总结一下. 对于窗口程序,一般有个特点:窗口大部分的区域保持不变,只有不分区域需要重新绘制.如果将整个窗口全部刷新的画,就做了许多不必要的工作,因而,MFC采用了一套基于无效区的处理机制.在分析无效区处理之前,我们要明白一个现实,现在的机器还不够牛,如

回调函数中调用类中的非静态成员变量或非静态成员函数

有关这方面的问题,首先说一点: 回调函数必须是静态成员函数或者全局函数来实现回调函数,大概原因是普通的C++成员函数都隐含了一个函数参数,即this指针,C++通过传递this指针给成员函数从而实现函数可以访问类的特定对象的数据成员.由于this指针的原因,使得一个普通成员函数作为回调函数时就会因为隐含的this指针问题使得函数参数个数不匹配,从而导致回调函数编译失败. 基于上面的理论,如何在类中封装回调函数呢? 回调函数只能是全局函数或者静态成员函数,但是由于全局函数会破坏封装性,所以只能用静

用三个函数分别实现求三角形,正方形,圆形面积(所有底高半径都由用户 输入);在主函数中,通过用户不同的选择分别进行调用;

/*2.用三个函数分别实现求三角形,正方形,圆形面积(所有底高半径都由用户输入):在主函数中,通过用户不同的选择分别进行调用:*/ #include <stdio.h>#define P 3.14double sanjiao(double di,double gao){ double mianji = (di * gao)/2 ; return mianji;} double zhengfangxing(double bian){ double mianji2 = bian*bian; ret

用函数实现登陆功能(三次机会),然后在主函数中根据调用后的结果判断 登陆成功与否。

/*3.用函数实现登陆功能(三次机会),然后在主函数中根据调用后的结果判断登陆成功与否.*/#include <string.h>int numb(char use[] ,char password[] ){ if((strcmp(use,"zhouyi")==0)&&(strcmp(password,"nb")==0)) { return 1; } else { return 0; } } #include <stdio.h>