做个画直线的程序,改变窗口,可是OnDraw函数会进行重绘,怎么样解决?

长尾巴的悟空 2006-07-22 01:12:18
代码也就是
MoveTo(xxx)
LineTo(xxx)
关键是窗口改变时,onDraw进行了重绘,直线会变没了.都说在OnDraw里再写一次代码,可是不行.
希望哪位给个代码演示一下,谢谢!
...全文
229 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
CXBID 2006-07-22
  • 打赏
  • 举报
回复
CPoint begin,end;
构造函数中初始化为0;
Cpoint mPoints[100]; //用于记录点坐标
int mPtsNum; //用于表示点个数,构造函数中初始化为0;
void CSssView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
begin=point;
CView::OnLButtonDown(nFlags, point);
}

void CSssView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
end=point;
CClientDC dc(this);
dc.MoveTo(begin);
dc.LineTo(end);

m_Points[m_PtsNum++] = begin;
m_Points[m_PtsNum++] = end;
CView::OnLButtonUp(nFlags, point);
}
此时不改变窗口的画,可以正常的画出直线.
但是加了OnDraw以后
void CSssView::OnDraw(CDC* pDC)
{
CSssDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

for(int i=0; i<m_PtsNum; )
{
pDC->MoveTo(m_Points[i++]);
pDC->LineTo(m_Points[i++]);
}}
长尾巴的悟空 2006-07-22
  • 打赏
  • 举报
回复
啊,明白这个道理了,不过我刚才用二维数组的时候,思路卡住了(呵呵,我人笨啊),不知下面的步骤了,能否给出代码演示下呢,谢谢!
CXBID 2006-07-22
  • 打赏
  • 举报
回复
可以去看一下STL方面的东西,是专门为我们解决数据结构的问题的。比如刚才我提到的那个二维数据要是用STL就非常方便了
CXBID 2006-07-22
  • 打赏
  • 举报
回复
那是因为窗口改变时,会调用OnDraw,而此时OnDraw里只把最后一条线重绘了,(因为begin和end记录了最后一次鼠标点下和放开的坐标),就不会消失。而其余的线没被重绘,所以就消失了。
解决的方法就是用一个二维数组记录下所有鼠标点下和放开的坐标,并在OnDraw里把数组中的坐标取出来重绘。
只有在OnDraw里把数组取出来重绘才行,否则窗口一旦改变,仍然看不到线了。
长尾巴的悟空 2006-07-22
  • 打赏
  • 举报
回复
没有用啊,我定义了两个点
CPoint begin,end;
构造函数中初始化为0;
void CSssView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
begin=point;
CView::OnLButtonDown(nFlags, point);
}

void CSssView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
end=point;
CClientDC dc(this);
dc.MoveTo(begin);
dc.LineTo(end);
CView::OnLButtonUp(nFlags, point);
}
此时不改变窗口的画,可以正常的画出直线.
但是加了OnDraw以后
void CSssView::OnDraw(CDC* pDC)
{
CSssDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

pDC->MoveTo(begin);
pDC->LineTo(end);
}
还是一样消失了,这是为什么?
CXBID 2006-07-22
  • 打赏
  • 举报
回复
就在在OnDraw里写代码就行了,因为窗口改变时,会调用OnDraw进行重绘的。
/////////////////////////////////////////////////////////////////////////////
// CMyTestView drawing

void CMyTestView::OnDraw(CDC* pDC)
{
CMyTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

pDC->MoveTo(m_ptLButtonDowm); //m_ptLButtonDowm记录了鼠标点下时的坐标
pDC->LineTo(m_ptLButtonUp); //m_ptLButtonUp记录了鼠标放开时的坐标

}
折腾_苏州 2006-07-22
  • 打赏
  • 举报
回复
在OnPaint()里写:
CPaintDC dc(this);

16,548

社区成员

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

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

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