SOS!关于VC ,OnDraw,对话框,重画,不显示啊?!!!

noble_guang 2009-12-17 05:33:37
我的程序是这样的:
单文档窗口,在一开始创建一个对话框,在这个对话框上画线,我打算当窗口变化或被遮挡后,在这个对话框上重新显示刚刚画的线。

我首先这样做的::
对话框类里添加OnPaint消息处理函数。
但是这样会造成死循环!CPU100%使用率,而且移动对话框的时候,会在主窗口的工具栏上留下刮痕。我还设置断点调试,发现一直在OnPaint函数里面运行~~~画面上的线条一直在闪动~~~~不知道问题在哪

后来有这样:
在对话框类定义一个与重画相关的普通函数,用view类的OnDraw函数通过对话框对象,调用那个重画函数。
问题是:这样对话框上不立即显示重画的内容啊?!!当我在拖动一下这个对话框,重画操作才有效!!这是为什么??怎么解决啊??我分别试了Invalidate()和UpdateWindow(),还是不行,高手帮帮忙啊?!!

请教高手赐教啊~~~谢谢,感激不尽!~
...全文
210 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
noble_guang 2009-12-19
[Quote=引用 13 楼 oldn_cc_bird 的回复:]
很明显你把CPaintDC dc给删掉了。
[/Quote]已经解决了,我现在没用那个onpaint那种解决途径,而是用我在二楼写的那种方法,只不过在重绘之前调用一下updatewindow(),就解决了····

你说的可能有用!我确实注释掉CPaintDC dc 了,没用它,呵呵
其他人的回答感觉没有什么用~~~
回复
oldn123 2009-12-18
很明显你把CPaintDC dc给删掉了。
回复
fleer 2009-12-18
你拖动一下对话框,View才会OnDraw啊,然后才调用你对话框的MDraw的。
CPU占用高,你不会是在DrawOBJ里面有Invalidate之类的函数吧:-D
回复
子曰小玖 2009-12-17
保存之后,在画线
回复
noble_guang 2009-12-17
[Quote=引用 7 楼 a746027209 的回复:]
你这样绕来绕去太麻烦了!直接在对话框的OnPaint函数中重画一下线就可以了,死循环可能是你某个地方没处理好,就像这while(L-1>index++)...就很有可能,建议你在多调试调试。
[/Quote]
那个没问题的,因为我按照 我在二楼写的那样就不会出问题,而按照三楼写的那样就有问题。
回复
noble_guang 2009-12-17
[Quote=引用 5 楼 schlafenhamster 的回复:]
while(L-1>index++)
{//L--;//??否则死循环
pDoc->GetOBJ(index)->DrawOBJ(dc);//我把在对话框上画的线存到Doc类了,这
}
[/Quote]
那个没问题的,因为我按照 我在二楼写的那样就不会出问题,而按照三楼写的那样就有问题。
回复
noble_guang 2009-12-17
[Quote=引用 4 楼 noble_guang 的回复:]
二楼和三楼分别是我使用的两种方法,都不行,问题见原帖···
[/Quote]
那个没问题的,因为我按照 我在二楼写的那样就不会出问题,而按照三楼写的那样就有问题。
回复
a746027209 2009-12-17
你这样绕来绕去太麻烦了!直接在对话框的OnPaint函数中重画一下线就可以了,死循环可能是你某个地方没处理好,就像这while(L-1>index++)...就很有可能,建议你在多调试调试。
回复
保存的代码不要在OnPaint中
回复
schlafenhamster 2009-12-17
while(L-1>index++)
{//L--;//??否则死循环
pDoc->GetOBJ(index)->DrawOBJ(dc);//我把在对话框上画的线存到Doc类了,这
}
回复
noble_guang 2009-12-17
二楼和三楼分别是我使用的两种方法,都不行,问题见原帖···
回复
noble_guang 2009-12-17
原来使用OnPaint方法的代码是这样的:
void CMdlg::OnPaint()
{
MDraw(((CCADView *)pView)->GetDocument());
}
//////下面这一段和前一种方法有一个共同的操作函数
void CMdlg::MDraw(CCADDoc * pDoc)
{
CClientDC dc(this);
int index=-1,L;
L=pDoc->GetLen();//我把在对话框上画的线存到Doc类了,这方面没有问题
while(L-1>index++)
{
pDoc->GetOBJ(index)->DrawOBJ(dc);//我把在对话框上画的线存到Doc类了,这
} //方面没有问题,DrawOBJ是我自己实现的
//线类COBJ的成员函数,吧自己输出的
}
回复
noble_guang 2009-12-17
部分代码如下:
void CCADView::OnDraw(CDC* pDC)
{
CCADDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

m_mdlg.MDraw(pDoc);//m_mdlg是那个对话框,而且是view的成员
}
void CMdlg::MDraw(CCADDoc * pDoc)
{
CClientDC dc(this);
int index=-1,L;
L=pDoc->GetLen();//我把在对话框上画的线存到Doc类了,这方面没有问题
while(L-1>index++)
{
pDoc->GetOBJ(index)->DrawOBJ(dc);//我把在对话框上画的线存到Doc类了,这
} //方面没有问题,DrawOBJ是我自己实现的
//线类COBJ的成员函数,吧自己输出的

}
回复
xiang_yun 2009-12-17
把OnPaint中画图的代码贴出来
一般对话框,可以在OnPaint里面做绘图的操作,不会有问题的,可能还是你的代码的问题。
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2009-12-17 05:33
社区公告

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