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

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

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

 

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  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
 
 在CODE上查看代码片派生到我的代码片
  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

posted @ 2017-03-18 00:11  findumars  Views(1157)  Comments(0Edit  收藏  举报