这是mfc的onpaint,目的是画出一个颜色变化的矩形。invalidate在onpaint中颜色根本不变。在ontimer中却有效果
void CChildView::OnPaint() 
{
CPaintDC dc(this); // 用于绘制的设备上下文

// TODO: 在此处添加消息处理程序代码 //int x,y,z=0;
CRect rect1(10,10,300,300);
CBrush *pBrush1=NULL;
pBrush1=new CBrush(); pBrush1->CreateSolidBrush(RGB(x,y,z));
if(pBrush1!=NULL)
{
pBrush1->DeleteObject();
delete pBrush1;
pBrush1=NULL;
}


//_____________________________第一处____________________________________________________
//Invalidate();
// 不要为绘制消息而调用 CWnd::OnPaint()
}int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1; x=0;
y=0;
z=0;
// TODO:  在此添加您专用的创建代码
SetTimer(UPDATE,2000,NULL);
return 0;
}
void CChildView::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值 switch(nIDEvent)
{
case UPDATE:
//MessageBox("onpaint调用于ontimer","提示",0);
x=rand()%255;
y=rand()%255;
z=rand()%255;
OnPaint();
//_______________第二处————————————————————————
//Invalidate();
break;
default:
break;
}
CWnd::OnTimer(nIDEvent);
}

解决方案 »

  1.   

    invalidate是这么用的
    先调用这个函数就会让系统认为这个矩形区域是无效的,会在接下来的OnPaint中刷新该区域
    你把invalidate放在OnPaint里面有啥用呢?
    只能无限的通知系统这个区域是无效的,然后又调用OnPaint来执行invalidate
    无穷无尽,就是不能刷新这个区域
      

  2.   

    楼上说的很对
    本身invalidate就是调用onpaint重绘
    放在里面没有意义