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. [Erlang 0057] Erlang 排错利器: Erlang Crash Dump Viewer

    http://www.cnblogs.com/me-sa/archive/2012/04/28/2475556.html Erlang Crash Dump Viewer真的是排错的天兵神器,还记得我 ...

  2. 【codeforces 776C】Molly's Chemicals

    [题目链接]:http://codeforces.com/contest/776/problem/C [题意] 让你找区间[i,j] 使得sum[i..j]=k^t,这里t=0,1,2,3.. -10 ...

  3. TensorFlow 实战(一)—— 交叉熵(cross entropy)的定义

    对多分类问题(multi-class),通常使用 cross-entropy 作为 loss function.cross entropy 最早是信息论(information theory)中的概念 ...

  4. 我是如何进行code review的

    众所周知,代码审查是软件开发过程中十分重要的环节,楼主结合自己的实际工作经验,和大家分享一下在实际工作中代码审查是如何开展的, 笔者水平有限,若有错误和纰漏,还请大家指正. 代码审查的阻力 我想不通公 ...

  5. C# 7.0 使用下划线忽略使用的变量

    原文:C# 7.0 使用下划线忽略使用的变量 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http://lindexi.gitee. ...

  6. git can't merge 的处理 代码冲突问题的解决

    ***取回已经提交的代码 git reset HEAD^ git can't merge 的处理1.git status 确保status 为空,可以先提交2.git reset HEAD^    取 ...

  7. 它们的定义Activity跳转动画

    本来觉得是一个非常小的需求, 后来我发现总是 错误, 采用Theme于 4.0在 操作不是很容易使用. 后来查阅资料, 须要在finish 后面 和 startActivity 后面加入 overri ...

  8. 简明Python3教程 6.基础

    你肯定不满足于只打印"Hello World"吧? 你想要的更多 - 你希望得到一些输入,操纵它后再从中得到某些东西.我们可以使用python中的常量和变量实现这些功能. 字面常量 ...

  9. Git 内部原理--初探 .git

    说到Git大家应该都非常熟悉,几乎每天都会用到它.在日常使用过程中,我们貌似并不需要关注其内部的原理,只需要记住那几个常用的命令,就可以说自己是会Git的人了.可是,事实真的是这样子的吗?今天我们就来 ...

  10. 获取 UIElement 相对于屏幕原点所占用的矩形区域

    原文:获取 UIElement 相对于屏幕原点所占用的矩形区域 <Grid Background="Transparent"> <StackPanel Margi ...