VC++6.0 窗口重绘问题
如题,我用VC++6.0编个时钟程序结果发现运行的时候表针的每一次绘制都在画面上,整个就是一个针的移动轨迹。。。我想每次绘制都把前面的残留东西清除掉,重新画每一笔怎么弄?...
如题,我用VC++6.0编个时钟程序结果发现运行的时候表针的每一次绘制都在画面上,整个就是一个针的移动轨迹。。。我想每次绘制都把前面的残留东西清除掉,重新画每一笔怎么弄?谢谢
我的是用dialog对话框程序,画表针用的是PICTURE子控件,响应定时器的函数来画每一秒的表针位置。但是现在问题就是怎么样把以前秒的表针痕迹清除掉。
1楼的看不懂。。。能否详细些?
我的代码如下:
void CClockDlg::OnTimer(UINT nIDEvent)
{
CRect WholeRect;
CClientDC dc(this);
m_ClockHands.GetWindowRect(WholeRect);
ScreenToClient(WholeRect);
Center.x=(WholeRect.left+WholeRect.right)/2;
Center.y=(WholeRect.top+WholeRect.bottom)/2;
CTime tmCurr;
tmCurr=CTime::GetCurrentTime();
m_hour=tmCurr.GetHour();
m_min=tmCurr.GetMinute();
m_sec=tmCurr.GetSecond();
CClockDlg::HandsPosition(CClockDlg::Center);//用于取得各表针的末点位置
dc.MoveTo(Center);
dc.LineTo(m_secEndPoint.x,m_secEndPoint.y);
dc.MoveTo(Center);
dc.LineTo(m_minEndPoint.x,m_minEndPoint.y);
dc.MoveTo(Center);
dc.LineTo(m_hourEndPoint.x,m_hourEndPoint.y);
m_ClockHands.Invalidate();
}
谁帮我解决问题我送上100分附加谢谢啦! 展开
我的是用dialog对话框程序,画表针用的是PICTURE子控件,响应定时器的函数来画每一秒的表针位置。但是现在问题就是怎么样把以前秒的表针痕迹清除掉。
1楼的看不懂。。。能否详细些?
我的代码如下:
void CClockDlg::OnTimer(UINT nIDEvent)
{
CRect WholeRect;
CClientDC dc(this);
m_ClockHands.GetWindowRect(WholeRect);
ScreenToClient(WholeRect);
Center.x=(WholeRect.left+WholeRect.right)/2;
Center.y=(WholeRect.top+WholeRect.bottom)/2;
CTime tmCurr;
tmCurr=CTime::GetCurrentTime();
m_hour=tmCurr.GetHour();
m_min=tmCurr.GetMinute();
m_sec=tmCurr.GetSecond();
CClockDlg::HandsPosition(CClockDlg::Center);//用于取得各表针的末点位置
dc.MoveTo(Center);
dc.LineTo(m_secEndPoint.x,m_secEndPoint.y);
dc.MoveTo(Center);
dc.LineTo(m_minEndPoint.x,m_minEndPoint.y);
dc.MoveTo(Center);
dc.LineTo(m_hourEndPoint.x,m_hourEndPoint.y);
m_ClockHands.Invalidate();
}
谁帮我解决问题我送上100分附加谢谢啦! 展开
展开全部
画表针用的是PICTURE子控件,这话就没说明白了,看你的程序知道其实并不是在PICTURE子控件上画,只是在PICTURE子控件这个范围里画图,所以要解决问题,只要在画表针之前用背景色在PICTURE子控件这个范围填充一下就行了,先把你的画表的代码(即OnTimer(UINT nIDEvent)函数里面的代码)放到OnPaint()函数里面去,放到CDialog::OnPaint();这代码后面;然后在OnTimer(UINT nIDEvent) 函数的这些代码m_ClockHands.GetWindowRect(WholeRect);ScreenToClient(WholeRect); 后面添加this->InvalidateRect(WholeRect,1);此后所有代码都不要了。
原理就是在定时器里面每一秒使PICTURE子控件这么大的范围无效,从而PICTURE子控件这么大的地方进行重绘调用OnPaint(),CDialog::OnPaint()函数底层会用背景色先刷一下无效的地方,那么先前画的表针就没了。怎么样
原理就是在定时器里面每一秒使PICTURE子控件这么大的范围无效,从而PICTURE子控件这么大的地方进行重绘调用OnPaint(),CDialog::OnPaint()函数底层会用背景色先刷一下无效的地方,那么先前画的表针就没了。怎么样
展开全部
在上一秒的位置用XOR画笔重新画一下表针就可以了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
简单,用和对话框窗体背景色一样的画刷把整个窗口涂一遍,再绘制表针即可。这是比较简单的方法,因为操作很容易,没什么技巧;缺点是效率低下,每次都要绘制整个窗口。
更好的方法自然有,但是要“因图形而异”,关键是看你想擦除的表针是什么形状,如果是标准的矩形等简单几何形状,那么我们没必要用背景色画刷涂掉整个窗口,而只许覆盖住表针所在的矩形即可。然而若你的表针是比较复杂的几何形状,那还是用我第一段提供的“简单”方法——使用背景色画刷覆盖整个窗口,更实用!
更好的方法自然有,但是要“因图形而异”,关键是看你想擦除的表针是什么形状,如果是标准的矩形等简单几何形状,那么我们没必要用背景色画刷涂掉整个窗口,而只许覆盖住表针所在的矩形即可。然而若你的表针是比较复杂的几何形状,那还是用我第一段提供的“简单”方法——使用背景色画刷覆盖整个窗口,更实用!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询