多次调用RedrawWindow函数导致程序崩溃???

大树学长 2019-08-26 04:29:40
使用RedrawWindow注意是为了减少闪烁的现象


for (int j = 0; j < 10000; j++)
{
for (int i = 0; i < 6; i++)
{
GetDlgItem(ID_n[i])->GetWindowRect(&rc);
//转换为相对坐标
ScreenToClient(&rc);
//刷新指定区域
InvalidateRect(&rc, TRUE);

RedrawWindow(&rc, NULL, RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
}
}

刷新控件后使用RedrawWindow,用起来确实闪烁要比不用少,但是后来在测试时当使用次数过多就会出现程序崩溃,提示已触发了一个断点。屏蔽掉RedrawWindow就没有问题,外面加10000次循环是测试用,使用RedrawWindow时这个循环跑不完程序就崩溃了,
...全文
303 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
大树学长 2019-08-27
  • 打赏
  • 举报
回复
问题解决了,RedrawWindow会发送WM_PAINT ,WM_PAINT 里面有一点内存泄漏,循环的次数多了就会引起崩溃
zgl7903 2019-08-27
  • 打赏
  • 举报
回复
如果是为了循环刷新的目的,建议派生新类,然后在WM_PAINT 处理结束后调用 InvalidateRect 再次引发WM_PAINT消息
schlafenhamster 2019-08-26
  • 打赏
  • 举报
回复
应该
RedrawWindow(&rc, NULL, RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
放 for 外 ,即 控件 invalidate 后 父窗口 redraw 一次
走好每一步 2019-08-26
  • 打赏
  • 举报
回复
引用 楼主 大树学长 的回复:
使用RedrawWindow注意是为了减少闪烁的现象

for (int j = 0; j < 10000; j++)
{
	for (int i = 0; i < 6; i++)
	{
		GetDlgItem(ID_n[i])->GetWindowRect(&rc);
		//转换为相对坐标
		ScreenToClient(&rc);
		//刷新指定区域
		InvalidateRect(&rc, TRUE);			

		RedrawWindow(&rc, NULL, RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
	}	
}
刷新控件后使用RedrawWindow,用起来确实闪烁要比不用少,但是后来在测试时当使用次数过多就会出现程序崩溃,提示已触发了一个断点。屏蔽掉RedrawWindow就没有问题,外面加10000次循环是测试用,使用RedrawWindow时这个循环跑不完程序就崩溃了,
你这样刷,还不如用双缓冲。。。
schlafenhamster 2019-08-26
  • 打赏
  • 举报
回复
只是 控件 重绘 ! 父窗口 不能重绘
GetDlgItem(ID_n[i])->Invalidate( );
大树学长 2019-08-26
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
InvalidateRect(&rc, TRUE); // 不需要 RedrawWindow(&rc, NULL, RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
没有这个就会很闪烁,使用这个闪烁会减少很多
schlafenhamster 2019-08-26
  • 打赏
  • 举报
回复
InvalidateRect(&rc, TRUE);

// 不需要 RedrawWindow(&rc, NULL, RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);

15,980

社区成员

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

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