这是一个基于对话框的程序,对话框上有按钮,还有几个CStatic用来绘图,之前都是好好的,今天改成Unicode版本后,编译正常,运行时CStatic中的图像怎么也不显示,有时候会闪现一次就消失,问题非常诡异。同样的代码,如果工程属性中选回“使用多字节字符集”,则没有问题;若再改成“使用Unicode字符集”,则问题重现。

研究了半天,发现网上相关的解释一般都是说把OnPaint中的对基类的调用CDialogEx::OnPaint();这句注释掉,或者放在自己的绘图代码后面,试了下并没有效果。

基于MFC原理,OnPaint中是对无效区域进行绘图处理的,基类的CDialogEx::OnPaint()调用之后,所有的无效区域都不存在了,因此之后的任何绘图代码都不会反映在界面上。正因为如此,把自己的绘图代码放在CDialogEx::OnPaint()之前是有必要的,但前提是你应该在CPaintDC dc(this)中绘制图像,因为此时的无效区域就是它。

如果你绘图的区域不在CPaintDC中,比如是在CStatic中,那么在绘图之前,你必须先强制CStatic更新,即像下面代码那样处理

CStatic* pHeadPhoto = (CStatic*)GetDlgItem(IDC_STATIC_HEADPHOTO);
pHeadPhoto->UpdateWindow();CDC* pDC = pHeadPhoto->GetDC();
// 以下是具体的绘图代码(略)

  

通过以上这些处理,你完全没必要注释掉CDialogEx::OnPaint()的调用,却让程序跑得更好。

(实际上一旦注释掉CDialogEx::OnPaint(),界面的默认处理就失效了,比如按钮就不会及时刷新。)

转载于:https://www.cnblogs.com/cner/p/6928690.html

CDialogEx::OnPaint()的问题,或者为什么在对话框程序的OnPaint中绘图无效的问题相关推荐

  1. 使用VC++6.0创建MFC对话框程序

    使用VC++6.0创建MFC对话框程序

  2. MFC子线程访问主线程对话框程序的控件对象

    最近在使用 VC 开发软件时需要用到多线程同步来解决开发过程中遇到的问题.本来以为只要象控制台程序一样,在主线程创建子线程,并设置好相应的对象事件就能解决问题,但是等到真正做起来,才在实践中发现原来事 ...

  3. MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息

    对话框中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息 在对话框程序中添加工具栏其实很简单,网上能找到很多的例子.一般的步骤就是:1.在资源中添加工 具栏资源:2.在对话 ...

  4. VS2017 MFC对话框程序打印及打印预览的实现

    VS2017 MFC对话框程序打印及打印预览的实现 花了一个星期,研究了网上大量的MFC对话框打印及打印预览功能的demo之后,网上现有的版本都比较旧,所以选中了几个版本,合并修改,得到这个比较完美的 ...

  5. vc++6.0/使用VisualC++6.0创建MFC基本对话框程序制作数字钟表教程

    我们先看一下数字时钟的效果图 1.首先,我们先创建一个基本对话框程序,不会的可以点这里:使用Visual C++6.0创建MFC工程单文档.多文档.对话框界面: 2.自定义一个对话框类(也可以直接使用 ...

  6. VS2010/MFC对话框程序调用Windows Media Player播放器控件

    MFC对话框程序调用Windows Media Player播放器控件播放打开的avi格式的文件,具体步骤如下: 1.根据MFC向导提示,创建一个默认的对话框项目TestMediaPlayer. 2. ...

  7. SAP ABAP 对话框编程教程:中的模块池-09

    SAP ABAP 对话框编程教程:中的模块池-09 SAP-ABAP 支持两种类型的程序 – 报告程序和对话程序. 如果您的 ABAP 程序需要用户输入 ,则使用对话框编程. 在本教程中,您将学习: ...

  8. 对话框程序启动隐藏窗口

    江湖上有众多传闻,ShowWindow是最令人糊涂的,很多人说在OnInitDialog()加上ShowWindow(SW_HIDE)  对话框便不出现,实验证明,这是不行的,可是在非基于对话框的程序 ...

  9. 孙鑫对话框二逃跑按钮中为什么为按钮新建一个类

    为类添加消息处理函数与成员变量,因为要对控件添加WM_MOUSEMOVE消息处理函数,而控件变量本身 不能加消息处理函数,只有类才能添加,所以要创建CNewButton类,然后使按钮控件属于这个类,当 ...

最新文章

  1. Tessellation (曲面细分) Displacement Mapping (贴图置换)
  2. ps抠图怎么放大图片_PS教程:透明玻璃杯不会抠图?一分钟利用通道面板快速抠图...
  3. spring session工程发布--一种新的管理httpsession的方法
  4. php krsort重置索引,PHP数组处理函数举例
  5. JAVA连接Excel最好用的开源项目EasyExcel,官方使用文档及.jar包下载
  6. jupyter notebook代码导出_Jupyter Notebook导出包含中文的pdf_亲测有效
  7. HDU6266 - Hakase and Nano 狄利克雷卷积
  8. linux中终端进入目录太多时造成终端路径显示太长的路径影响观看的解决方法
  9. (Android-RTC-8)分析HardwareVideoEncoder—BitrateAdjuster
  10. 网吧计费系统的破解方法
  11. android软件画面共享,安卓两台手机怎么实现屏幕共享?安卓两台手机实现屏幕共享教程...
  12. 如何用阿里云服务器建站-全流程
  13. 2022年最新版 | Flink经典线上问题小盘点
  14. 用友u8服务器修改ipv4,用友U8-OA11.1 用友U8加密狗更换服务器了-用友U8
  15. 谷歌浏览器Chrome播放rtsp实时视频,并抓图、录像、回放、倍速等
  16. java项目里bean文件夹_JavaBean的class文件必须放在WEB-INF文件夹中。()
  17. 使用百度地图API实现地图生成、标记以及标注
  18. Mac使用Microsoft-Remote-Desktop-for-Mac远程桌面Windows
  19. 德鲁克《卓有成效的管理者》学习读书-总结
  20. 全球及中国弹性运动胶带行业发展展望及投资趋势预测报告2022-2027年

热门文章

  1. Dsp BootLoader的学习
  2. 【Tools】VNC Viewer 6.20安装详解
  3. 【Linux】一步一步学Linux——ifup命令(152)
  4. mysql 脚本 linux_MySQL的一些功能实用的Linux shell脚本分享
  5. i386和X86各是什么意思
  6. LeetCode 190. Reverse Bits (算32次即可)
  7. Redis源码剖析(一)服务器与客户端交互流程
  8. C++学习笔记-----二分法之寻找非减序列第一个大于某个值的数或最后一个小于某个值的数
  9. java学习笔记2021.1.10
  10. iTunes 降级安装 12.6