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

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

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

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

请教高手赐教啊~~~谢谢,感激不尽!~
...全文
248 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
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里面做绘图的操作,不会有问题的,可能还是你的代码的问题。

16,473

社区成员

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

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

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