onPaint()
{ CRect rc;
GetUpdateRect(&rc);
TRACE("%d %d ",rc.Width(),rc.Height());
CPaintDC dc(this);
}
OnEraseBkgnd()
{
CBrush brush(RGB(red,100,200));
CRect rcClient(0,0,0,0);
GetClientRect(&rcClient);
pDC->FillRect(rcClient, &brush);
return 1;
}OnBnClickedButton1()
{
red = 0;
InvalidateRect(CRect(0,0,100,100));
InvalidateRect(CRect(120,120,200,200));
InvalidateRect(CRect(220,220,260,260));
}本来我的认知里面,多个invalidaterect后,应该会有个合并无效区域的地方,cpaintdc里面只有一个m_ps->rcPaint
那么合并也应该都合到这里来,看getupdaterect也是这个理论,但是为什么实际画出来的时候,界面上出现了3个框,不应该
重绘的就是这个rcpaint区域么,那应该就一个框才对?求懂的人指教

解决方案 »

  1.   

    InvalidateRect(CRect(0,0,100,100));
    看看实现他发送一个包含无效区域参数的请求更新消息你调用3次 无非就是发送3次消息  在队列里能否合并我也不太清楚了  不过我觉得不太可能
      

  2.   

    合并是必须的,否则效率太低下了,你有这个疑问是因为我漏写了一句话
    TRACE("%d %d ",rc.Width(),rc.Height());
    onpaint里这个打出来的是260 260,而且只有一次invalidaterect看不了实现代码
      

  3.   

    合并,看看MSDN中的解释The invalidated areas accumulate in the update region until the region is processed when the next WM_PAINT message occurs or until the region is validated by using the ValidateRect or ValidateRgn function. 
      

  4.   

    关键是这个区域是怎么合并起来的,msdn上没看到介绍
    也看不到相关代码实现,看google的那套代码,合并就是简单的获取到一个最大的矩形
    用mfc的难道就这么悲剧么,想看啥都没代码
      

  5.   

    下套WTL的SDK  跟MFC区别不大  基本实现思路都是一致的
      

  6.   

    sdk和mfc一样,看不到具体的实现
    看来高手是不屑与回答了,悲剧