zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    typeof的用法
    新建一个express工程,node app无反应
    搜索引擎-倒排索引基础知识
    搭建Hadoop2.6.0+Eclipse开发调试环境(以及log4j.properties的配置)
    hadoop下远程调试方法
    回调函数透彻理解Java
    Maven 手动添加 JAR 包到本地仓库
    Hbase rowkey热点问题
    Hadoop 2.2 & HBase 0.96 Maven 依赖总结
    通过Java Api与HBase交互
  • 原文地址:https://www.cnblogs.com/findumars/p/6569267.html
Copyright © 2011-2022 走看看