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

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.   
  7.                 CRect  rect;    
  8.         GetClientRect(&rect);    
  9.         CDC  dcMem;   //定义一个工具箱(设备上下文)  
  10.   
  11.         dcMem.CreateCompatibleDC(&dc);///建立关联DC   
  12.         CBitmap  bmpBackground;   //位图对象  
  13.         bmpBackground.LoadBitmap(IDB_BITMAP1);   //IDB_BITMAP是你自己的图对应的ID    
  14.         BITMAP  bitmap;    
  15.         bmpBackground.GetBitmap(&bitmap);  //建立绑定关系  
  16.         CBitmap  *pbmpOld=dcMem.SelectObject(&bmpBackground);   //保存原有CDC对象,并选入新CDC对象入DC  
  17.           
  18.         dc.SetStretchBltMode(COLORONCOLOR);//防止bmp图片失真  
  19.         dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,  bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);  
  20.   
  21.         dcMem.SelectObject(pbmpOld);  
  22.         bmpBackground.DeleteObject();  
  23.                 dcMem.DeleteDC();  
  24.   
  25. }  

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

 

技术分享

 

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

 

[cpp] view plain copy
 
 技术分享技术分享
  1. void CBackimageDlg::OnPaint()   
  2. {  
  3.         CPaintDC dc(this); // device context for painting  
  4.   
  5.                 CRect  rect;    
  6.         GetClientRect(&rect);    
  7.         CDC  dcMem;   //定义一个工具箱(设备上下文)  
  8.   
  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.           
  16.         dc.SetStretchBltMode(COLORONCOLOR);//防止bmp图片失真  
  17.         dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,  bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);  
  18.   
  19.         dcMem.SelectObject(pbmpOld);  
  20.         bmpBackground.DeleteObject();  
  21.                 dcMem.DeleteDC();  
  22.        
  23.         CDialog::OnPaint();  //最后才调用  
  24. }  


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

 

技术分享

   

总结:

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

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

 

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

以上是关于MFC OnPaint()函数中最先调用CDialog::OnPaint()和最后调用CDialog::OnPaint()的巨大区别的主要内容,如果未能解决你的问题,请参考以下文章

MFC中ONPAINT、ONDRAW、ONERASEBKGND等绘图函数的使用场合和作用、区别是啥啊?

MFC中的Invalidate、OnDraw、OnPaint函数的作用、区别和联系?

MFC 中 OnPaint() 函数的使用

MFC OnPaint被不断调用的问题

MFC 自定义 OnPaint 未被可靠调用

在mfc中控件如CButton,CStatic创建之后能改变大小或者移动位置吗