AfxMessageBox造成程序“卡死”的问题

今天写程序的时候遇到了AfxMessageBox造成程序“卡死”的“”“问题”,花了大半天才搞明白怎么回事。
网上百度,有些说法是多线程不能用AfxMessageBox,线程里面用AfxMessageBox的确有问题,我程序虽然跑了几个线程,但是出错的地方并不在线程里面。。。后来实在找不到什么原因,才突然想到是不是AfxMessageBox显示在主窗口后面了?AfxMessageBox是模态对话框,不关掉程序就像卡死了一样。然后就猜是不是主窗口一直在更新显示?
最后定位到了主窗口一个显示控件的OnPaint函数,使用了CClientDC而不是CPaintDC,显示控件一直更新显示,AfxMessageBox在后台。。(之前卡死时其实可以按alt键,就会显示到前面了)。
CClientDC,CPaintDC等的区别又忘了。这里做个简单记录吧。(半路出家,基础就是渣)

CDC,.CClientDC,CPaintD区别

CClientDC

CClientDC(客户区设备上下文)用于客户区的输出它在构造函数中封装了GetDC(),在析构函数中封装了ReleaseDC()函数。一般在响应非窗口重画消息(如键盘输入时绘制文本、鼠标绘图)绘图时要用到它。

CPaintDC

CPaintDC用于响应**窗口重绘消息(WM_PAINT)是的绘图输出。CPaintDC在构造函数中调用BeginPaint()**取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画(我的问题就是出现在这里)。CPaintDC也只能用在WM_PAINT消息处理之中

CWindowDC:

(1)可在非客户区绘制图形,而CClientDC,CPaintDC只能在客户区绘制图形。
(2)坐标原点是在屏幕的左上角,CClientDC,CPaintDC下坐标原点是在客户区的左上角。
(3)关联一特定窗口,允许开发者在目标窗口的任何一部分进行绘图,包含边界与标题,这种DC同WM_NCPAINT消息一起发送。

简单综述

1)CWindowDC与CClientDC,CPaintDC的区别:CWindowDC可在非客户区绘制图形,而CClientDC,CPaintDC只能在客户区绘制图形。CWindowDC下坐标原点是在屏幕的左上角,CClientDC,CPaintDC下坐标原点是在客户区的左上角

2)CPaintDC的对象一般用在OnPaint内以响应Windows消息WM_PAINT,自动完成绘制,在整个窗口内进行重画,维持原有窗口完整性。CClientDC应用在非响应Windows消息WM_PAINT的情况下,进行实时绘制,绘制的区域内被重画

3)CPaintDC会清除消息队列中WM_PAINT消息,若在OnPaint函数中只使用CClientDC,因为其无法清除WM_PAINT消息,所以会一直刷新显示

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值