Archer

阿彻时空
@2008

导航

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
}

 

 

代码
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(2550255));
    memDC.SetTextColor(GetSysColor(COLOR_WINDOW));    
//标题栏白色文字
    pOldBmp = memDC.SelectObject(&memBmp);

    CBrush brush(RGB(
25500));        //先把所有窗口区域刷成透明处理的颜色
    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, 
00, rcWin.Width(), rcWin.Height(), RGB(25500)); //透明的颜色

    DrawCaptionBtn();

    memDC.SelectObject(pOldBmp);
    memDC.DeleteDC();
    memBmp.DeleteObject();
}

 

posted on 2010-02-03 17:06  阿彻  阅读(5859)  评论(0)    收藏  举报