VC 窗口重绘 标题栏 非客户区
代码
void CMainFrame::OnNcPaint()
{
// TODO: Add your message handler code here
m_mouseHover = 0;
// 重载非客户区自绘,只需要在此调用自定义重绘方法.(其它消息均不需要)
DrawWndNCRgn();
//TRACE(_T("OnNcPaint\n"));
// Do not call CFrameWnd::OnNcPaint() for painting messages
}
{
// TODO: Add your message handler code here
m_mouseHover = 0;
// 重载非客户区自绘,只需要在此调用自定义重绘方法.(其它消息均不需要)
DrawWndNCRgn();
//TRACE(_T("OnNcPaint\n"));
// Do not call CFrameWnd::OnNcPaint() for painting messages
}
代码
void CMainFrame::DrawWndNCRgn()
{
CRect rcWin;
CDC* pDC, memDC;
CBitmap memBmp, *pOldBmp;
pDC = GetWindowDC(); //窗口所有区域的DC(包含NC)
GetWindowRect(&rcWin); //窗口所有区域大小(包含NC)
OffsetRect(&rcWin, -rcWin.left, -rcWin.top);
//Update & Save Rect info to Data Member
m_rcClose.left = rcWin.right - WND_TITLE_BAR_XYFRAME - WND_TITLE_BAR_CLOSE_CX;
m_rcClose.top = rcWin.top;
m_rcClose.right = rcWin.right - WND_TITLE_BAR_XYFRAME;
m_rcClose.bottom = rcWin.top + WND_TITLE_BAR_CLOSE_CY;
m_rcMax.left = m_rcClose.left - WND_TITLE_BAR_MAX_CX;
m_rcMax.top = m_rcClose.top;
m_rcMax.right = m_rcClose.left;
m_rcMax.bottom = m_rcClose.top + WND_TITLE_BAR_MAX_CY;
m_rcMin.left = m_rcMax.left - WND_TITLE_BAR_MIN_CX;
m_rcMin.top = m_rcClose.top;
m_rcMin.right = m_rcMax.left;
m_rcMin.bottom = m_rcClose.top + WND_TITLE_BAR_MIN_CY;
//双缓冲绘图
memDC.CreateCompatibleDC(pDC);
memBmp.CreateCompatibleBitmap(pDC, rcWin.Width(), rcWin.Height());
memDC.SetBkMode(TRANSPARENT); //设置背景透明
memDC.SetBkColor(RGB(255, 0, 255));
memDC.SetTextColor(GetSysColor(COLOR_WINDOW)); //标题栏白色文字
pOldBmp = memDC.SelectObject(&memBmp);
CBrush brush(RGB(255, 0, 0)); //先把所有窗口区域刷成透明处理的颜色
memDC.FillRect(rcWin, &brush);
brush.DeleteObject();
//虽然我们只画非客户区,但是获取的是整个窗口区域,
//我们没有画的地方就是客户区,需要做透明处理.
DrawBorders(&memDC, rcWin);
DrawCaptionRgn(&memDC, rcWin, TRUE, 0);
//中间大部分客户端区域需要透明处理.否则会造成客户端区域刷新严重闪烁.
TransparentBlt(pDC->m_hDC, rcWin.left, rcWin.top, rcWin.Width(), rcWin.Height(),
memDC.m_hDC, 0, 0, rcWin.Width(), rcWin.Height(), RGB(255, 0, 0)); //透明的颜色
DrawCaptionBtn();
memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
memBmp.DeleteObject();
}
{
CRect rcWin;
CDC* pDC, memDC;
CBitmap memBmp, *pOldBmp;
pDC = GetWindowDC(); //窗口所有区域的DC(包含NC)
GetWindowRect(&rcWin); //窗口所有区域大小(包含NC)
OffsetRect(&rcWin, -rcWin.left, -rcWin.top);
//Update & Save Rect info to Data Member
m_rcClose.left = rcWin.right - WND_TITLE_BAR_XYFRAME - WND_TITLE_BAR_CLOSE_CX;
m_rcClose.top = rcWin.top;
m_rcClose.right = rcWin.right - WND_TITLE_BAR_XYFRAME;
m_rcClose.bottom = rcWin.top + WND_TITLE_BAR_CLOSE_CY;
m_rcMax.left = m_rcClose.left - WND_TITLE_BAR_MAX_CX;
m_rcMax.top = m_rcClose.top;
m_rcMax.right = m_rcClose.left;
m_rcMax.bottom = m_rcClose.top + WND_TITLE_BAR_MAX_CY;
m_rcMin.left = m_rcMax.left - WND_TITLE_BAR_MIN_CX;
m_rcMin.top = m_rcClose.top;
m_rcMin.right = m_rcMax.left;
m_rcMin.bottom = m_rcClose.top + WND_TITLE_BAR_MIN_CY;
//双缓冲绘图
memDC.CreateCompatibleDC(pDC);
memBmp.CreateCompatibleBitmap(pDC, rcWin.Width(), rcWin.Height());
memDC.SetBkMode(TRANSPARENT); //设置背景透明
memDC.SetBkColor(RGB(255, 0, 255));
memDC.SetTextColor(GetSysColor(COLOR_WINDOW)); //标题栏白色文字
pOldBmp = memDC.SelectObject(&memBmp);
CBrush brush(RGB(255, 0, 0)); //先把所有窗口区域刷成透明处理的颜色
memDC.FillRect(rcWin, &brush);
brush.DeleteObject();
//虽然我们只画非客户区,但是获取的是整个窗口区域,
//我们没有画的地方就是客户区,需要做透明处理.
DrawBorders(&memDC, rcWin);
DrawCaptionRgn(&memDC, rcWin, TRUE, 0);
//中间大部分客户端区域需要透明处理.否则会造成客户端区域刷新严重闪烁.
TransparentBlt(pDC->m_hDC, rcWin.left, rcWin.top, rcWin.Width(), rcWin.Height(),
memDC.m_hDC, 0, 0, rcWin.Width(), rcWin.Height(), RGB(255, 0, 0)); //透明的颜色
DrawCaptionBtn();
memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
memBmp.DeleteObject();
}

浙公网安备 33010602011771号