MFC中关于画图的疑问

来源:百度知道 编辑:UC知道 时间:2024/07/04 01:37:58
vc6,MFC对话框环境。
三个按钮对应的三个函数如下:
//draw按钮
void CTryDlg::OnBnDraw()
{
CDC *pDC=GetDC();
pDC->LineTo(100,100);
}

//clear按钮
void CTryDlg::OnBnClear()
{
InvalidateRect(NULL);
}

//redraw按钮
void CTryDlg::OnBnRedraw()
{
OnBnDraw();
OnBnClear();
OnBnDraw();
}

按下draw按钮后,能正确画图,
按下clear按钮后,能清除原先画的图形。
但按下redraw按钮后,并不能达到画图->清除图->再画图的效果。
想知道why??

另再问清除图形除了用InvalidateRect(NULL)方法外,还能怎样处理。

如何实现每次按画图按钮后,原先画的图会清除。

第一个函数改成
void CTryDlg::OnBnDraw()
{
CDC *pDC=GetDC();
pDC->MoveTo(0, 0);
pDC->LineTo(100,100);
}
第一次调用这个函数时,绘图起点在默认的(0, 0),画完线后变成(100, 100),所以要加pDC->MoveTo(0, 0);

第三个函数改成
void CTryDlg::OnBnRedraw()
{
OnBnDraw();
OnBnClear();
ValidateRect(NULL);
OnBnDraw();
}
因为在OnBnClear()中调用了InvalidateRect函数失窗口绘图区域无效,所以调用ValidateRect使之再有效。

因为电脑的速度是非常快的.如果想看到中间过程.
方法一.用调试的方法.将
void CTryDlg::OnBnRedraw()
{
OnBnDraw(); //加入断点1
OnBnClear(); //加入断点2
OnBnDraw(); //加入断点3

}
方法二.
void CTryDlg::OnBnRedraw()
{
OnBnDraw();
getch();//等待键盘输入任一字符后,再运行下一语句.
OnBnClear();
getch();//等待键盘输入任一字符后,再运行下一语句
OnBnDraw(); //加入断点3

}
当然,你也可以用别的语句代替getch();如:
MessageBox("OnBnDraw");
MessageBox("OnBnClear");
MessageBox("重绘");
-----------------
还可以用定时器函数.自已查吧