void CLotteryDlg::OnPaint()
{
if (IsIconic())
{
//省略...
}
else
{
CClientDC dc(this);
switch(m_status)
{
case 1: dc.TextOut(0,0,"first");break;
case 2: dc.TextOut(20,20,"second");break;
default:break;
}
CDialog::OnPaint();
}
}另外我有两年按纽 OnButton1( ) ,OnButton2()
其中OnButton1( ) 改变 m_status的值,OnButton2( )中清屏函数。例如刚开始的时候,m_status为1, 则屏幕上显示"first",当我按一下Button1,则在(20,20)处显示"second",但我的目的是要在显示"second"之前先把屏幕("first")给清除,然后再显示"second",我试了如下的OnButton1( )不能成功。
OnButton1( )
{ m_status=2;
CRect rect1;
this->GetClientRect(rect1);
this->InvalidateRect(rect1);
}
其效果好象是不停的显示"second",同时又不停的清屏。
但如果,我按一下Button2后,再按下只有一行语句 m_status=2的OnButton1( )里却是正常的先清屏后显示。
OnButton2()
{
CRect rect1;
this->GetClientRect(rect1);
this->InvalidateRect(rect1);
}
------------------------------
请告诉我错误所在,以及怎么才能达到我的那个先清屏后显示的效果.
非常感谢!
{
if (IsIconic())
{
//省略...
}
else
{
CClientDC dc(this);
switch(m_status)
{
case 1: dc.TextOut(0,0,"first");break;
case 2: dc.TextOut(20,20,"second");break;
default:break;
}
CDialog::OnPaint();
}
}另外我有两年按纽 OnButton1( ) ,OnButton2()
其中OnButton1( ) 改变 m_status的值,OnButton2( )中清屏函数。例如刚开始的时候,m_status为1, 则屏幕上显示"first",当我按一下Button1,则在(20,20)处显示"second",但我的目的是要在显示"second"之前先把屏幕("first")给清除,然后再显示"second",我试了如下的OnButton1( )不能成功。
OnButton1( )
{ m_status=2;
CRect rect1;
this->GetClientRect(rect1);
this->InvalidateRect(rect1);
}
其效果好象是不停的显示"second",同时又不停的清屏。
但如果,我按一下Button2后,再按下只有一行语句 m_status=2的OnButton1( )里却是正常的先清屏后显示。
OnButton2()
{
CRect rect1;
this->GetClientRect(rect1);
this->InvalidateRect(rect1);
}
------------------------------
请告诉我错误所在,以及怎么才能达到我的那个先清屏后显示的效果.
非常感谢!
解决方案 »
- MFC怎么将串口接收到的数据添加到listcrtl
- 急~~~~如何让对话框启动后在最底层显示
- pFormat.wf.wFormatTag!=WAVE_FORMAT_PCM 这种两级的结构,怎么回事
- 特殊字符串转换成16进制字符串[有代码]
- 一个很简单的问题在---线等待!
- 我在对话框的ListCtrl中用SHGetFileInfo插入系统图标,为什么第二次打开就没有图标了?
- 在vc中如何加入别人做好的类?
- 调用动态链接库的问题,着急,请各位帮忙
- 如何结束accept()?
- 为什么用SDK(VC编译)和VB编写同一个hellowin窗口,为什么前者生成的文件大那么多?
- 文本输出
- snmp(trap)紧急求助高手,帮帮忙!!
{
m_status=2;
Invalidate();
}
这样应该就可以了
this->GetClientRect(rect1);
这里应该用一个reference吧 不然rect1的值不会被GetClientRect()写进去的本身函数的参数也是一个指针
应该GetClientRect(&rect1);
还是你的笔误?
如果想用获得的rect来刷新的话 可以用InvalidateRect()
void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );
同样是一个指向rect的指针 和一个是否擦除要更新区域背景的bool值
Invalidate( )执行后据说也是调用的OnPaint( ),也就是触发WM_PAINT消息。所以如你所说的和我用的 OnButton1( )的效果是一样的。To xiaobaolove(紫色太阳) :
你好象误解了我的意思,只是我要在屏上显示的东西不便于用 static控件。To cy214(嘿呀嘿) :
看函数的参数原型是 LPRECT 好象是指针型的,不过像我那样的用法(在OnButton2中),好象也能起来清屏的效果。我现在的问题是:我如果不在OnPaint里画的话,一移动窗口,就全部消失了,不能持续显示。而在OnPaint中显示的话,我又处理不好先清屏后画的问题,就是不能在一个函数中完成先清屏后画的效果。但是外加一个清屏按纽如我的OnButton2后再显示就行了。我估计我还是对WM_PAINT消息的传递流程不太清楚。请高手指点,