怪事,加上 OnPaint()后,OnDraw()就不执行了 (vc++深入详解中的例子)

fqfqfqfq2 2011-07-11 08:54:18
怪事,加上 OnPaint()后,OnDraw()就不执行了
菜单项:

void CGraphicView::OnFont()
{
CFontDialog dlg;
if(IDOK==dlg.DoModal())
{
if(m_font.m_hObject)
m_font.DeleteObject();
m_font.CreateFontIndirect(dlg.m_cf.lpLogFont);
m_strFontName=dlg.m_cf.lpLogFont->lfFaceName;
Invalidate();
}
}


OnDraw()

void CGraphicView::OnDraw(CDC* pDC)
{
// TODO: Add your specialized code here and/or call the base class
CGraphicDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

CFont *pOldFont=pDC->SelectObject(&m_font);
pDC->TextOut(0,0,m_strFontName);
pDC->SelectObject(pOldFont);
}


以上完全正常。菜单项打开字体选择,然后view上显示字体名

但是,我加上 OnPaint()就不行了,ondraw就不执行了。
我只是加了 WM_PAINT响应函数,什么代码也没加

void CGraphicView::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

// Do not call CView::OnPaint() for painting messages
}
...全文
170 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
fqfqfqfq2 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 happyparrot 的回复:]

开了一下,OnPaint不是虚函数,是消息函数
[/Quote]
谢谢您的跟踪指教。
这么说,onpaint就是隐藏基类的 onpaint 了吧。

基类的 onpaint 不是虚函数呀,只能是隐藏了吧。
fqfqfqfq2 2011-07-12
  • 打赏
  • 举报
回复
谢谢,是我粗心。
快乐鹦鹉 2011-07-12
  • 打赏
  • 举报
回复
开了一下,OnPaint不是虚函数,是消息函数
快乐鹦鹉 2011-07-12
  • 打赏
  • 举报
回复
你连OnPrint和OnPaint的不同都没有看出来,居然说是同一个函数......
fqfqfqfq2 2011-07-12
  • 打赏
  • 举报
回复
我又试了,
用 add windows message hander ...加上的OnPaint()就不行

//下面是 add windows messagehander ...
void CYtView::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

// Do not call CView::OnPaint() for painting messages
}


但是: add virtual function ...加上的 OnPaint()就没有问题。

//下面是虚函数
void CYtView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: Add your specialized code here and/or call the base class

CView::OnPrint(pDC, pInfo);
}


所以,我理解是,隐藏基类的 onpaint 不行,但是覆盖基类的 onpaint 就可以。
fqfqfqfq2 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 happyparrot 的回复:]

不是虚函数你能这么加吗???
你的OnPaint覆盖了基类!!!所以才出了毛病!!!
[/Quote]
-----------------------------
好像我的不是虚函数吧。
我的OnPaint()是增加的 windows message hander

我试着加上虚函数,是这样的

void CYtView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: Add your specialized code here and/or call the base class

CView::OnPrint(pDC, pInfo);
}


我的不是虚函数

void CGraphicView::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

// Do not call CView::OnPaint() for painting messages
}

如果是虚函数,应该就不出问题了吧。
fqfqfqfq2 2011-07-12
  • 打赏
  • 举报
回复
谢谢 /
快乐鹦鹉 2011-07-11
  • 打赏
  • 举报
回复
不是虚函数你能这么加吗???
你的OnPaint覆盖了基类!!!所以才出了毛病!!!
fqfqfqfq2 2011-07-11
  • 打赏
  • 举报
回复
以下我的理解对吗:

OnPaint()不是虚函数吧,那么,我的 OnPaint()就是隐藏了基类的 OnPaint(),
由于 OnDraw()是由基类(cview)中的 OnPaint()调用的,
所以,OnPaint()被隐藏后,OnDraw()得不到调用,
wltg2001 2011-07-11
  • 打赏
  • 举报
回复
OnPaint会调用OnDraw这个函数,所以出现你上面的情况
快乐鹦鹉 2011-07-11
  • 打赏
  • 举报
回复
看这个文章吧:
http://blog.163.com/embeded-life/blog/static/10593251920092259477448/
重要内容:
大家在设计过程中必须注意:OnDraw是被基类的OnPaint主动调用的,如果你继承了OnPaint,你应该要么调用基类的OnPaint(此前不得创建CPaintDC实例,也不得调用BeginPaint),要么自己创建CPaintDC实例,并调用OnDraw.
==
所以:
void CGraphicView::OnPaint()
{
CPaintDC dc(this); // device context for painting
OnPrepareDC(&dc);
OnDraw(&dc);

// TODO: Add your message handler code here

// Do not call CView::OnPaint() for painting messages
}

Eleven 2011-07-11
  • 打赏
  • 举报
回复
因为CView类中的WM_PAINT消息响应函数中OnPaint()函数会调用OnDraw这个虚函数
void CView::OnPaint()
{
// standard paint routine
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}

你自己添加处理WM_PAINT消息,在OnPaint中你并没调用OnDraw函数,所以的OnDraw函数没有并调用
fqfqfqfq2 2011-07-11
  • 打赏
  • 举报
回复
为何加上 onpaint()后,
onDraw()就不执行了呢?
即屏幕上(视类上)没有字体名的输出了

16,550

社区成员

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

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

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