博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在OnPaint中必须调用一次BeginPaint和EndPaint,且也只能调用一次
阅读量:4298 次
发布时间:2019-05-27

本文共 1632 字,大约阅读时间需要 5 分钟。

基于对话框的程序(mfc默认生成),重载OnEraseBkgnd函数,其它不动,若在OnPaint函数中不调用其基类的OnPaint函数,即注释掉CDialog::OnPaint();,代码如下:

[cpp] 

1. void CDDDDlg::OnPaint()  

2. {  

3.     if (IsIconic())  

4.     {  

5.         CPaintDC dc(this); // device context for painting   

6.   

7.         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);  

8.   

9.         // Center icon in client rectangle   

10.         int cxIcon = GetSystemMetrics(SM_CXICON);  

11.         int cyIcon = GetSystemMetrics(SM_CYICON);  

12.         CRect rect;  

13.         GetClientRect(&rect);  

14.         int x = (rect.Width() - cxIcon + 1) / 2;  

15.         int y = (rect.Height() - cyIcon + 1) / 2;  

16.   

17.         // Draw the icon   

18.         dc.DrawIcon(x, y, m_hIcon);  

19.     }  

20.     else  

21.     {  

22.         //CDialog::OnPaint();   

23.     }  

24. }  

 则执行后界面没有问题,如下图:

但是,如果将此界面隐藏后再显示,则上面的控件都不能显示了,如下图:

 

跟踪程序会发现,第一次生成界面时候,进入过OnCtlColor函数(TRACE("OnCtlColor\n");语句输出),

当隐藏界面再显示后,就再也没进过OnCtlColor函数。当然看不见原先界面的控件了,因为根本没有重绘出来。原因见下篇

 

A:在OnPaint中注释此句CDialog::OnPaint();为什么会不停地调用OnPaint函数呢(不断执行TRACE("OnPaint\n");语句)?

 

Q:如果自己的OnPaint代码什么也没做的话(至少没有声明过CPaintDC类型的变量),还必须调用一下CDialog::OnPaint,否则BeginPaintEndPaint就没有办法被调用了。

总之,在响应WM_PAINT消息的时候,必须调用一遍BeginPaintEndPaint。调用的方法有三种:
1、声明一个CPaintDC类型的变量(即使你什么也不画),CPaintDC的构造函数就是调用BeginPaint,析构函数就是调用EndPaint
2、调用基类的OnPaint(实际上就是调用APIDefWindowProc,它会自动调用BeginPaintEndPaint)。
3、自己直接调用BeginPaintEndPaint
上述三种方法,必须选择其一,而且也只能选择其一(因为在一个WM_PAINT消息内不能调用两次BeginPaintEndPaint)。

 

正如我猜想的,因为你调用了CDialog::OnPaint();

你把这句注释掉就可以了。
所以说凡事总有因果,CDialog::OnPaint()调用默认的窗口过程来绘制,也会调用BeginPaint/EndPaint()。而这两个函数的作用,是获取DC、剪裁区域和从消息队列中移走WM_PAINT消息(因此,如果不用上述三种方法的一种调用一遍BeginPaintEndPaint的话,WM_PAINT消息就不会从消息队列里面移走,系统就会不停的发送WM_PAINT,这就是问题中所提到的不停的调用OnPaint函数的原因了)。这两个函数,必须在WM_PAINT消息中调用,而且只能调用一次!

 

转载地址:http://pmnws.baihongyu.com/

你可能感兴趣的文章
设计模式09_代理模式
查看>>
设计模式10_桥接
查看>>
设计模式11_装饰器
查看>>
设计模式12_外观模式
查看>>
设计模式13_享元模式
查看>>
设计模式14_组合结构
查看>>
设计模式15_模板
查看>>
海龟交易法则01_玩风险的交易者
查看>>
CTA策略02_boll
查看>>
vnpy通过jqdatasdk初始化实时数据及历史数据下载
查看>>
设计模式19_状态
查看>>
设计模式20_观察者
查看>>
vnpy学习10_常见坑
查看>>
vnpy学习10_常见坑02
查看>>
用时三个月,终于把所有的Python库全部整理了!拿去别客气!
查看>>
pd.stats.ols.MovingOLS以及替代
查看>>
vnpy学习11_增加测试评估指标
查看>>
资金流入流出计算方法
查看>>
海龟交易法则07_如何衡量风险
查看>>
海龟交易法则08_风险与资金管理
查看>>