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

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

  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()函数:

  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

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

  1. python函数中的位置参数、默认参数、关键字参数、可变参数区别

    一.位置参数 调用函数时根据函数定义的参数位置来传递参数. #!/usr/bin/env python # coding=utf-8 def print_hello(name, sex): sex_d ...

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

    我在一个按钮中调用sendmessage(wm_paint,0,0)达到36以上时,当最小化窗口然后再恢复就会发现窗口出现错误信息,而且窗口界面内容混乱不完整.原来以为是使用sleep()函数导致的问 ...

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

    下面这段代码在执行的时候, 打印的结果是1, Error: undefined; function fn() { var x = y = 1; } fn(); console.log(y); // 1 ...

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

    MFC中的Invalidate.OnDraw.OnPaint函数的作用 CWnd::Invalidate voidInvalidate( BOOL bErase = TRUE ); 该函数的作用是使 ...

  5. OnPaint()函数的作用原理

    WM_PAINT是窗口每次重绘都会产生的一个消息. OnPaint是对这个消息的反应函数 mfc 的 CWnd::OnPaint 没做什么,只是丢给系统处理. 一 : 先执行OnEraseBkgnd, ...

  6. 【MFC】如何在mfc窗口程序中调用控制台

    1.工程名为Zero,在CZeroDlg.cpp中加入头文件 #include “conio.h” : 2.在CZeroDlg::OnInitDialog() {…}函数中加入AllocConsole ...

  7. 关于MFC框架程序中CWinApp::OnIdle

    很早之前就发现,我写的图形引擎在MFC框架程序中的刷帧率始终在60FPS左右.好在自己的程序对刷帧率的要求不是很高,所以一直没有太过纠结此事.直到今天看了别人的程序才发现应该在函数CWinApp::O ...

  8. 线程的函数中调用MFC对话框类的变量

    线程的函数中调用MFC对话框类的变量多线程传输文件的对话框 现在想要在对话框上添加一个进度条 为进度条映射变量m_progress这就需要在传输一段文件后就更新m_progress的值使进度条前进 也 ...

  9. 回调函数中使用MFC类的成员或对话框控件的简单方法

    在MFC的很多程序中,常常需要在回调函数中调用MFC类的类成员变量.类成员函数,亦或者对话框控件的句柄.由于回调函数是基于C编程的Windows SDK的技术,而类成员又有this指针客观条件限制.. ...

随机推荐

  1. 与Boss大雷探讨JavaWeb开发、电商与网络安全

    最近几个月,与公司Boss大雷交流得比较多,也学习到了很多新的东西,了解到了一些没有接触和实践的业界做法. 简要介绍下Boss,姓雷,定居武汉好几年了,之前在一号店.UC.支付宝干过,有丰富的电商-支 ...

  2. Arcgis api for javascript学习笔记(3.2X版本)-初步尝试

    Arcgis api for javascript(3.22版本)官方地址 :https://developers.arcgis.com/javascript/3/ 1. 根据官方示例实现一个简单地图 ...

  3. delphi之IOCP学习(一)

    困扰已久的网络通信(IOCP:完成端口),今天终于揭开她的神秘面纱了,之前百度N久还是未能理解IOCP,网络上好多博文都没有贴出源码,初学者很难正在理解IOCP并自己写出通信例子 ,经过努力,今天自己 ...

  4. Web 程序的建立

    1 导读 web 基础研发体系指的是, web 研发中一线工程师所直接操作的技术.工具,以及所属组织架构的总和.在过去提升企业研发效能的讨论中,围绕的主题基本都是——”通过云计算.云存储等方式将底层核 ...

  5. [Servlet]Servlet工作流程及注意事项

    Servlet工作过程 采用Servlet完成Web实际的工作流应用程序是通过Tomcatserver公布服务,client与server遵循的端部之间的相互作用Http议完毕的. 详细工作流程例如以 ...

  6. tinkerpop(1) 地图数据库console科研

    原创文章连接: http://blog.csdn.net/freewebsys/article/details/46348975 转载请注明出处. 1,关于图数据库 tinkerpop是apache孵 ...

  7. springCloud跨域访问

    转自:http://blog.csdn.net/wangkang80/article/details/72829390 什么是跨域? 假设你在http://xxx.com/test/下有一个js文件, ...

  8. Linux学习(1)vi编辑器的常用命令

    今天对Linux中的vi编辑器进行了学习,对其中的常用命令进行总结: 数字 0 或^:光标移到行首 $              :光标移到行尾 H             :光标移到屏幕的首行 L ...

  9. matlab Tricks(二十七)—— 可变输入参数输出参数的适配

    matlab 内置的对 varargin/varargout(nargin/nargout)的支持,使得 matlab 的输入参数和输出参数,有了更为灵活的传递和使用: 比如对于 matlab 原生支 ...

  10. NYOJ 24 素数的距离问题

    素数的距离问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描写叙述 如今给出你一些数.要求你写出一个程序,输出这些整数相邻近期的素数,并输出其相距长度.假设左右有等距离长 ...