要重载CTabCtrl类,以改变控件的显示背景及边线、显示字体,应该怎么做?

解决方案 »

  1.   

    http://www.vckbase.com/document/viewdoc/?id=398
    参考第5种方案,不需要自绘!
      

  2.   

    Tab Control需要选择“Owner Draw”选项
    在CTabCtrl的继承类里重写OnEraseBkgnd和DrawItem函数,(m_bgColor是背景颜色)如下:void CColoredTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    CRect rect = lpDrawItemStruct->rcItem;
    int nTabIndex = lpDrawItemStruct->itemID;
    if (nTabIndex < 0) return;
    BOOL bSelected = (nTabIndex == GetCurSel()); char label[64];
    TC_ITEM tci;
    tci.mask = TCIF_TEXT|TCIF_IMAGE;
    tci.pszText = label;
    tci.cchTextMax = 63;
    if (!GetItem(nTabIndex, &tci )) return; CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    if (!pDC) return;
    int nSavedDC = pDC->SaveDC(); // For some bizarre reason the rcItem you get extends above the actual
    // drawing area. We have to workaround this "feature".
    rect.top += ::GetSystemMetrics(SM_CYEDGE); pDC->SetBkMode(TRANSPARENT);
    pDC->FillSolidRect(rect, m_bgColor); // Draw image
    CImageList* pImageList = GetImageList();
    if (pImageList && tci.iImage >= 0) { rect.left += pDC->GetTextExtent(_T(" ")).cx; // Margin // Get height of image so we 
    IMAGEINFO info;
    pImageList->GetImageInfo(tci.iImage, &info);
    CRect ImageRect(info.rcImage);
    int nYpos = rect.top; pImageList->Draw(pDC, tci.iImage, CPoint(rect.left, nYpos), ILD_TRANSPARENT);
    rect.left += ImageRect.Width();
    } if (bSelected) {
    //pDC->SetTextColor(m_crSelColour);
    //pDC->SelectObject(&m_SelFont);
    rect.top -= ::GetSystemMetrics(SM_CYEDGE);
    pDC->DrawText(label, rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
    } else {
    //pDC->SetTextColor(m_crUnselColour);
    //pDC->SelectObject(&m_UnselFont);
    pDC->DrawText(label, rect, DT_SINGLELINE|DT_BOTTOM|DT_CENTER);
    } pDC->RestoreDC(nSavedDC);
    }
    BOOL CColoredTabCtrl::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default
        CTabCtrl::OnEraseBkgnd(pDC);
        CRect Rect; 
        GetClientRect(&Rect);
        
        pDC->FillSolidRect(Rect, m_bgColor);  return TRUE;
    }
      

  3.   

    自绘是唯一的办法...
    但是某些地方需要特殊处理,特别是up-down