主窗体背景发生改变,发现CButton虽然重绘了,但是背景仍旧是之前的背景,没有改变,所以在主窗体背景发生改变,需要通知所以子控件(CSWButton)重新绘制背景。
#define RIGHT_EDGE 10
#define TOP_EDGE 10
void CSWDialog::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
if (m_pSysCloseBitmap && m_pSysMaxBitmap && m_pSysMinBitmap)
{
CRect rcClient; GetClientRect(rcClient);
m_rcClose.left = rcClient.right - m_pSysCloseBitmap->GetWidth() / 3 - RIGHT_EDGE;
m_rcClose.right = m_rcClose.left + m_pSysCloseBitmap->GetWidth() / 3;
m_rcClose.top = TOP_EDGE;
m_rcClose.bottom = m_rcClose.top + m_pSysCloseBitmap->GetHeight();
m_rcMax.left = m_rcClose.left - 5 - m_pSysMaxBitmap->GetWidth() / 3;
m_rcMax.right = m_rcMax.left + m_pSysMaxBitmap->GetWidth() / 3;
m_rcMax.top = TOP_EDGE;
m_rcMax.bottom = m_rcMax.top + m_pSysMaxBitmap->GetHeight() / 2;
m_rcMin.left = m_rcMax.left - 5 - m_pSysMinBitmap->GetWidth() / 3;
m_rcMin.right = m_rcMin.left + m_pSysMinBitmap->GetWidth() / 3;
m_rcMin.top = TOP_EDGE;
m_rcMin.bottom = m_rcMin.top + m_pSysMinBitmap->GetHeight();
}
if (nType == SIZE_MAXIMIZED || nType == SIZE_RESTORED)
{
DoNcPaint();
InvalidateRect(NULL, TRUE);
//::RedrawWindow(m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);// 通知窗口和所有子窗口重绘
EnumChildWindows(m_hWnd, EnumChildWindowsProc, (LPARAM)&nType);
}
}
此外,主窗体有3个系统按钮(最小化、最大化、关闭),这3个按钮刷新的时候不需要重绘整个背景,否则窗体上子控件会闪烁。
void CSWDialog::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (!m_bTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE;
tme.dwHoverTime = 1;
m_bTracking = _TrackMouseEvent(&tme);
}
int nOldSysMnuHover = m_nSysMnuHover;
if (PtInRect(&m_rcMin, point))
m_nSysMnuHover = SYSMNU_MIN;
else if (PtInRect(&m_rcMax, point))
m_nSysMnuHover = SYSMNU_MAX;
else if (PtInRect(&m_rcClose, point))
m_nSysMnuHover = SYSMNU_CLOSE;
else
m_nSysMnuHover = -1;
if (m_nSysMnuHover != nOldSysMnuHover)
{
// 此处设计不够严谨,应该只刷新之前的焦点按钮和当前焦点的按钮
InvalidateRect(&m_rcMin, FALSE);
InvalidateRect(&m_rcMax, FALSE);
InvalidateRect(&m_rcClose, FALSE);
}
CDialog::OnMouseMove(nFlags, point);
}

本文详细介绍了在主窗体背景发生变化时,如何通知所有子控件(CSWButton)重新绘制背景,避免了背景刷新不一致的问题。同时,针对主窗体上的系统按钮(最小化、最大化、关闭),文章提供了优化方案,确保在刷新这些按钮时不会导致整个窗体背景的重绘,从而避免了子控件闪烁的情况。
2234

被折叠的 条评论
为什么被折叠?



