每次当鼠标在标题栏按下的时候,原来的最大化,最小化这些按钮就重新显示出来一会!而我在WM_NCLBUTTONDOWN和WM_NCMOUSEMOVE ,WM_NCLBUTTONDBCLICK中都重绘了标题栏!但是当我将应用程序的系统菜单打开后(也就是,还原,最大化,最小化的那个菜单),就不会出现原先的问题了!如果去掉WM_NCLBUTTONDBCLICK的默认CDialog::OnNcLButtonDown()也可以,就是对标题栏无响应了!还有就是去掉对话框的System menu属性也可以!但是任务栏中的TAB无图标!
请众位大哥指教!

解决方案 »

  1.   

    我参照的代码
    CBrush Brush(RGB(0,100,255));
    CBrush* pOldBrush = pDC->SelectObject(&Brush); CRect rtWnd, rtTitle, rtButtons;
    GetWindowRect(&rtWnd); 
    //取得标题栏的位置
    rtTitle.left = GetSystemMetrics(SM_CXFRAME);
    rtTitle.top = GetSystemMetrics(SM_CYFRAME);
    rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
    rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE); CPoint point;
    //填充顶部框架
    point.x = rtWnd.Width();
    point.y = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CYFRAME)+1;
    pDC->PatBlt(0, 0, point.x, point.y, PATCOPY);
    /* //填充左侧框架
    point.x = GetSystemMetrics(SM_CXFRAME);
    point.y = rtWnd.Height();
    pDC->PatBlt(0, 0, point.x, point.y, PATCOPY);
    //填充底部框架
    point.x = rtWnd.Width(); 
    point.y = GetSystemMetrics(SM_CYFRAME);
    pDC->PatBlt(0, rtWnd.Height()-point.y, point.x, point.y, PATCOPY);
    //填充右侧框架
    point.x = GetSystemMetrics(SM_CXFRAME);
    point.y = rtWnd.Height();
    pDC->PatBlt(rtWnd.Width()-point.x, 0, point.x, point.y, PATCOPY);
    //填充菜单下部框架
    point.x = rtWnd.Width();
    point.y = GetSystemMetrics(SM_CYFRAME)-1;
    pDC->PatBlt(0, GetSystemMetrics(SM_CYMENU)+GetSystemMetrics(SM_CYSIZE)+point.y, point.x, point.y, PATCOPY);
    //填充菜单右侧框架
    point.x = rtWnd.Width() - 230;
    point.y = GetSystemMetrics(SM_CYMENU);
    pDC->PatBlt(230, GetSystemMetrics(SM_CYSIZE)+GetSystemMetrics(SM_CYFRAME), point.x, point.y, PATCOPY); //绘制美化线条
    CBrush BrushLine(RGB(255, 255, 255));
    pDC->SelectObject(&BrushLine);
    point.x = rtWnd.Width() - 150;
    point.y = GetSystemMetrics(SM_CYFRAME) + 2;
    pDC->PatBlt(GetSystemMetrics(SM_CXFRAME), point.y, point.x, 1, PATCOPY);
    point.y += 5;
    pDC->PatBlt(GetSystemMetrics(SM_CXFRAME), point.y, point.x, 1, PATCOPY);
    point.y += 5;
    pDC->PatBlt(GetSystemMetrics(SM_CXFRAME), point.y, point.x, 1, PATCOPY);
    point.x += 60;
    point.y += 12;
    pDC->PatBlt(point.x, point.y, 85, 1, PATCOPY);
    point.y += 5;
    pDC->PatBlt(point.x, point.y, 85, 1, PATCOPY);
    point.x -= 60 - GetSystemMetrics(SM_CXFRAME);
    point.y += 5;
    pDC->PatBlt(point.x, point.y, 145-GetSystemMetrics(SM_CXFRAME) , 1, PATCOPY);
    point.y -= 32;
    pDC->PatBlt(point.x, point.y, 1 , 32, PATCOPY);

    pDC->SelectObject(pOldBrush); //重画图标
    m_rtIcon.left = rtWnd.Width() - 135;
    m_rtIcon.top = GetSystemMetrics(SM_CYFRAME);
    m_rtIcon.right = m_rtIcon.left + 32;
    m_rtIcon.bottom = m_rtIcon.top + 32;
    ::DrawIconEx(pDC->m_hDC, m_rtIcon.left, m_rtIcon.top, AfxGetApp()->LoadIcon(IDR_MAINFRAME), 
    m_rtIcon.Width(), m_rtIcon.Height(), 0, NULL, DI_NORMAL);
    m_rtIcon.OffsetRect(rtWnd.TopLeft()); 
    //*/ //准备画XP风格按钮
    CBitmap* pBitmap = new CBitmap;
    CBitmap* pOldBitmap;
    CDC* pDisplayMemDC=new CDC;
    pDisplayMemDC->CreateCompatibleDC(pDC); //重画关闭button
    rtButtons.left = rtTitle.right - 19;
    rtButtons.top = rtTitle.top -3 ;
    rtButtons.right = rtButtons.left + 19;
    rtButtons.bottom = rtButtons.top + 19;
    pBitmap->LoadBitmap(IDB_EXIT_NORMAL);
    pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
    pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
    pDisplayMemDC->SelectObject(pOldBitmap);
    m_rtButtExit = rtButtons;
    m_rtButtExit.OffsetRect(rtWnd.TopLeft()); 
    pBitmap->DeleteObject(); //重画最大化/恢复button
    rtButtons.right = rtButtons.left - 3;
    rtButtons.left = rtButtons.right - 19;
    if (IsZoomed())
    pBitmap->LoadBitmap(IDB_RESTORE_NORMAL);
    else
    pBitmap->LoadBitmap(IDB_MAX_NORMAL);
    pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
    pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
    pDisplayMemDC->SelectObject(pOldBitmap);
    m_rtButtMax = rtButtons;
    m_rtButtMax.OffsetRect(rtWnd.TopLeft());
    pBitmap->DeleteObject(); //重画最小化button
    rtButtons.right = rtButtons.left - 3;
    rtButtons.left = rtButtons.right - 19;
    pBitmap->LoadBitmap(IDB_MIN_NORMAL);
    pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
    pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
    pDisplayMemDC->SelectObject(pOldBitmap);
    m_rtButtMin = rtButtons;
    m_rtButtMin.OffsetRect(rtWnd.TopLeft());
    pBitmap->DeleteObject();

    //重画帮助button
    rtButtons.right = rtButtons.left - 3;
    rtButtons.left = rtButtons.right - 19;
    pBitmap->LoadBitmap(IDB_HELP_NORMAL);
    pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
    pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);
    pDisplayMemDC->SelectObject(pOldBitmap);
    m_rtButtHelp = rtButtons;
    m_rtButtHelp.OffsetRect(rtWnd.TopLeft());
    pBitmap->DeleteObject();
    /*
    //重画caption
    int nOldMode = pDC->SetBkMode(TRANSPARENT);
    COLORREF clOldText=pDC->SetTextColor(RGB(255, 255, 255));
    pDC->SelectStockObject(SYSTEM_FIXED_FONT);
    rtTitle.left += 240; //我实在找不到什么好办法,能即时得到当前菜单的宽度了,如果各位有发现的,请Email me.
    rtTitle.top += GetSystemMetrics(SM_CYSIZE) + 2;
    rtTitle.bottom = rtTitle.top + 30;
    CString m_strTitle;
    GetWindowText(m_strTitle);
    pDC->DrawText(m_strTitle, &rtTitle, DT_LEFT);
    pDC->SetBkMode(nOldMode);
    pDC->SetTextColor(clOldText);
    //*/
    ReleaseDC(pDisplayMemDC);
    delete pDisplayMemDC;
    delete pBitmap;