求mfc界面刷新有效区域问题

tompaz 2011-06-21 09:47:22
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区域么,那应该就一个框才对?

求懂的人指教
...全文
397 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mhwer99 2011-06-29
  • 打赏
  • 举报
回复
关注。。。
tompaz 2011-06-29
  • 打赏
  • 举报
回复
谢谢帮顶,不过最好帮顶的同时帮着解决问题
MYNAMELIULI 2011-06-28
  • 打赏
  • 举报
回复
帮顶的
tompaz 2011-06-22
  • 打赏
  • 举报
回复
sdk和mfc一样,看不到具体的实现
看来高手是不屑与回答了,悲剧
tompaz 2011-06-21
  • 打赏
  • 举报
回复
关键是这个区域是怎么合并起来的,msdn上没看到介绍
也看不到相关代码实现,看google的那套代码,合并就是简单的获取到一个最大的矩形
用mfc的难道就这么悲剧么,想看啥都没代码
simoreg 2011-06-21
  • 打赏
  • 举报
回复
合并,看看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.

tompaz 2011-06-21
  • 打赏
  • 举报
回复
合并是必须的,否则效率太低下了,你有这个疑问是因为我漏写了一句话
TRACE("%d %d ",rc.Width(),rc.Height());
onpaint里这个打出来的是260 260,而且只有一次

invalidaterect看不了实现代码
  • 打赏
  • 举报
回复
InvalidateRect(CRect(0,0,100,100));
看看实现

他发送一个包含无效区域参数的请求更新消息

你调用3次 无非就是发送3次消息 在队列里能否合并我也不太清楚了 不过我觉得不太可能
  • 打赏
  • 举报
回复
下套WTL的SDK 跟MFC区别不大 基本实现思路都是一致的

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧