在对话框内绘图为什么要用OnPaint()成员函数

arfu 2000-04-12 12:11:00
在vc技术内幕(清华)中,讲到:
“ 在对话框内绘图必须利用OnPaint()成员函数。”
为什么?有没有别的方法?

书中的例子程序:
void CAboutDlg::OnPaint()
{
CWnd* p=GetDlgItem(IDC_S);
CDC* c=p->GetDC();
p->Invalidate();
p->UpdateWindow();
c->SelectStockObject(BLACK_BRUSH);
c->Rectangle(0,0,10,10);
p->ReleaseDC(c);
}
MSDN中讲到:WM_PAINT在调用UpdateWindow或RedrawWindow时发出。
上面的代码中在OnPaint()中调用UpdateWindow()是不是有些矛盾?
调用了Invalidate()还需调用UpdateWindow()吗? 我搞不懂
我试着去掉UpdateWindow(),程序无法显示图形,为什么?
请大侠讲详细些! 非常感谢!
...全文
594 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
RiverHill 2000-04-23
  • 打赏
  • 举报
回复
另外,再补充一点:其中的p->Invalidate();可以忽略,因为UpdateWindow()会重做这件事情。把它注释掉,程序工作正常。
RiverHill 2000-04-23
  • 打赏
  • 举报
回复
这主要是,你对MFC的消息机制理解的不太够的原因导致:
1、当对话框窗口被其他窗口覆盖或对话框窗口被移出至屏幕外,需要重画对话框自己本身时,OnPaint事件被触发。
2、你的OnPaint()函数里的主要工作:是去绘制在对话框里面的一个控件(其ID号为IDC_S)的颜色,绘制颜色的范围是在该控件的(0,0,10,10)。
3、缘于对话框窗口已经重绘,那么,IDC_S控件也需要重绘,所以UpdateWindow()也就触发IDC_S的OnPaint()。
4、为什么其它正常情况,不要再触发对话框中的其它子控件OnPaint()事件呢?原因很简单,因为,你是去获IDC_S控件的DC,你自己往IDC_S控件上画颜色,这件事,默认的MFC是不会干这件事的,在这种情况下,它也不知道,所以,你要自己去通知你的IDC_S控件去重新绘制一下。
arfu 2000-04-23
  • 打赏
  • 举报
回复
packager
说的有道理
lu0 2000-04-12
  • 打赏
  • 举报
回复
1.然也,让IDC_S重画.
2.WINE的讲述可谓精辟至极.
rfit 2000-04-12
  • 打赏
  • 举报
回复
packager大侠说:

“调用UpdateWindows让控件IDC_S产生一个WM_PAINT的事件,不是再次触发对话框的OnPaint事件.”

请问: 所产生的WM_PAINT的事件,将触发谁的OnPaint事件,难道是控件IDC_S的OnPaint()?
我有些糊涂! 我是个初学者
请高手指明! 非常感谢 packager 、wine 和各位高手
wine 2000-04-12
  • 打赏
  • 举报
回复
Invalidate()只是标记 c 无效,即 c 需要重画,并没干多少事,UpdateWindows检查谁要重画,产生一个事件通知其它过程去干.
packager 2000-04-12
  • 打赏
  • 举报
回复
这段代码其实并不是在"对话框"上作图.
注意:
CWnd* p=GetDlgItem(IDC_S);
CDC* c=p->GetDC();
所获取的CWnd和CDC其实只是对话框上的控件IDC_S的,然后,也都是在IDC_S上作图的.
明白这点,对你的问题:WM_PAINT在调用UpdateWindow或RedrawWindow时发出。
上面的代码中在OnPaint()中调用UpdateWindow()是不是有些矛盾?
就应该好理解了.
调用UpdateWindows是让控件IDC_S产生一个WM_PAINT的事件,不是再次触发对话框的OnPaint事件.

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧