对话框被其它对话框覆盖后,再移开其它对话框,不刷背景了

suyouxin 2008-01-09 04:35:41
写了一个对话框,重载了OnEraseBkgnd函数自己动态添加一些控件画图

需求:由于整个对话框有一个背景图,所以在适当的时候需要刷新这个背景图,来保持界面完整。
问题:由于在OnEraseBkgnd函数中一直刷新背景图的话,界面会一直闪烁,所以只能在一些
特定的时候进行刷新,目前在捕获了这些消息的情况下刷新背景图
ON_WM_ACTIVATE()
ON_WM_SETFOCUS()
ON_WM_LBUTTONUP()
但是如果对话框被其它对话框覆盖后,再移开其它对话框,背景图就不刷新了,显示为残留
的其它对话框图案,请问有没有什么办法可以解决这个问题?

非常感谢!
...全文
114 点赞 收藏 11
写回复
11 条回复
阿呆_ 2008年01月10日
>>这个函数OnEraseBKgnd中我可以刷新背景图,但不能每次都刷
>>实际过程中对话框调用这个函数的频率太高,每次都刷新,背景图会一直闪烁

只有一种可能性会出现你说的这种状况:你在OnEraseBKgnd中的代码有问题, 可能造成系统认为某部分client又被修改从而再次发送WM_PAINT(WM_ERASEBKGND是BeginPaint()发出的, 而调用BeginPaint()是接收到WM_PAINT消息重绘窗口的第一步) 从而造成死循环, 一直在刷新。

另外重绘背景可以在WM_PAINT(OnPaint)中进行, WM_ERASEBKGND中你可以简单地直接 return true 告诉系统你重绘过了。
回复 点赞
junheng 2008年01月10日
当被覆盖部分显示出来后,程序会自动刷新窗口的,无须你手动添加代码去刷新。只需要在OnEraseBkgnd函数中写好绘制背景的代码就可以。
回复 点赞
suyouxin 2008年01月09日
是不是我弄错了

重绘的消息产生是调用OnEraseBkgnd吧
回复 点赞
suyouxin 2008年01月09日
问题就是我的进程不知道有其它对话框从我的ClientRect上移开了
如果有这个消息,我收到直接刷新一下就行了。
-----------------------------------------------------
我印象中
当有其他对话框从上面移开会产生重绘

-----------------------------------------------------
重绘的消息这肯定收到了,但是不能他每次重绘我都实际进行重绘,这样屏幕会闪烁,所以做了个控制,也导致现在这个问题
回复 点赞
suyouxin 2008年01月09日
可能是我没描述清楚
BOOL CUIDlg::OnEraseBkgnd(CDC* pDC)
{
if (bHighlight)
{
pDC->FillSolidRect(CRect(49, 299, 225, 313), RGB(214, 42, 42));
pDC->SetTextColor(RGB(255 ,255, 255));
CString temp;
temp = statesText;
pDC->DrawText(temp, CRect(49 + textCount * 5, 299, 225, 313), DT_LEFT | DT_VCENTER | DT_SINGLELINE);
}

if (prevPointCount != pointCount)
{
DrawPoint((pointCount == 1) ? TRUE : FALSE, CRect(POINT_RECT(135, 320)), pDC);
DrawPoint((pointCount == 2) ? TRUE : FALSE, CRect(POINT_RECT(145, 320)), pDC);
DrawPoint((pointCount == 3) ? TRUE : FALSE, CRect(POINT_RECT(155, 320)), pDC);
DrawPoint((pointCount == 4) ? TRUE : FALSE, CRect(POINT_RECT(165, 320)), pDC);
DrawPoint((pointCount == 5) ? TRUE : FALSE, CRect(POINT_RECT(175, 320)), pDC);
DrawPoint((pointCount == 6) ? TRUE : FALSE, CRect(POINT_RECT(185, 320)), pDC);
DrawPoint((pointCount == 7) ? TRUE : FALSE, CRect(POINT_RECT(195, 320)), pDC);
DrawPoint((pointCount == 8) ? TRUE : FALSE, CRect(POINT_RECT(205, 320)), pDC);
DrawPoint((pointCount == 9) ? TRUE : FALSE, CRect(POINT_RECT(215, 320)), pDC);
prevPointCount = pointCount;
}
else
{
CBrush m_brushBackground;
m_brushBackground.CreatePatternBrush(&backgroud);
CRect rect;
GetClientRect(&rect);
pDC->FillRect(rect,&m_brushBackground);
}

// CDialog::OnEraseBkgnd(pDC);

return TRUE;
}


函数是这样的,因为OnEraseBkgnd不仅要重绘背景还要对其它控件进行重绘,
如果每次调用OnEraseBkgnd函数我都重绘一下背景,是可以解决覆盖这个问题,
但是界面会不停的闪烁,所以我控制了一下,希望只在需要的时候绘制背景。
回复 点赞
shakaqrj 2008年01月09日
问题就是我的进程不知道有其它对话框从我的ClientRect上移开了
如果有这个消息,我收到直接刷新一下就行了。
-----------------------------------------------------
我印象中
当有其他对话框从上面移开会产生重绘
回复 点赞
suyouxin 2008年01月09日
回LS

这个函数OnEraseBKgnd中我可以刷新背景图,但不能每次都刷
实际过程中对话框调用这个函数的频率太高,每次都刷新,背景图会一直闪烁
回复 点赞
max123456 2008年01月09日
OnEraseBKgnd(CDC * pDC)
{
CRect rect;
GetWindowRect(&rect);
CDC memDC;
CBitmap cbitmap;
cbitmap.LoadBitmap(IDB_BITMAP1);
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(&cbitmap);
pDC->BitBlt(0,0,rect.width(),rect.height(),&memDC,0,0,SRCCOPY);
}

希望对你有所帮助
回复 点赞
suyouxin 2008年01月09日
问题就是我的进程不知道有其它对话框从我的ClientRect上移开了
如果有这个消息,我收到直接刷新一下就行了。

找遍了WM开头的消息,没看到一个适用的;(
回复 点赞
shakaqrj 2008年01月09日
在重绘的汉书中
回复 点赞
shakaqrj 2008年01月09日
强制给他sendmessage WM_ERASEBKGND消息呢?
回复 点赞
发动态
发帖子
界面
创建于2007-09-28

7973

社区成员

11.5w+

社区内容

VC/MFC 界面
社区公告
暂无公告