我自己绘的标题条的高度是和系统的高度一样,为什么用一些界面库绘制的标题条就高很多,而且不闪烁。我自绘了一个TAB控件,但是周围的系统色的边框一直去存在,不知道怎么去掉,我是重载DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)这个函数来绘制的。

解决方案 »

  1.   

    这个tab能给我一份吗,[email protected]
      

  2.   

    在OnPaint函数里自绘,OnEraseBkgnd函数里绘边框和非客户区域我随手写的代码如下:
    void CBaseTabCtrl::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting

    HBRUSH hr;
    int iSave;
    char szLable[64];
    TC_ITEM tci;
    CRect rc;
    //DRAWITEMSTRUCT信息
    LPDRAWITEMSTRUCT lpDrawItemStruct=new DRAWITEMSTRUCT;
    //填充DRAWITEMSTRUCT信息
    lpDrawItemStruct->CtlID=GetDlgCtrlID();
    lpDrawItemStruct->CtlType=ODT_TAB;
    lpDrawItemStruct->hwndItem=GetSafeHwnd();
    lpDrawItemStruct->hDC=dc.GetSafeHdc();
    lpDrawItemStruct->itemAction=ODA_DRAWENTIRE;

    //得到总页数和当前页码
    int iTab=GetItemCount();
    int iSel=GetCurSel();

    if (!iTab)
    return;
    //循环画同每个页
    while (iTab--)
    {
    //得到指定页面的信息
    tci.mask = TCIF_TEXT|TCIF_IMAGE;
    tci.pszText = szLable;
    tci.cchTextMax = 63;
    if (!GetItem(iTab, &tci )) 
    return;
    //绘非当前页
    if (iTab != iSel)
    {
    lpDrawItemStruct->itemID = iTab;
    lpDrawItemStruct->itemState = 0;

    VERIFY(GetItemRect(iTab, &lpDrawItemStruct->rcItem));

    lpDrawItemStruct->rcItem.bottom += 2;
    lpDrawItemStruct->rcItem.top -= 2;


    HBRUSH hr=CreateSolidBrush(RGB(255,0,0));
    int iSave=dc.SaveDC();

    dc.SelectObject(hr);
    dc.RoundRect(&lpDrawItemStruct->rcItem, CPoint(10,10));
    dc.SetBkMode(TRANSPARENT); rc=lpDrawItemStruct->rcItem; rc.top+=4;
    dc.SetTextColor(RGB(0,255,0));
    dc.DrawText(szLable, rc, DT_SINGLELINE|DT_BOTTOM|DT_CENTER|DT_VCENTER);
    dc.RestoreDC(iSave);
    DeleteObject(hr); m_pPages[iTab]->ShowWindow(SW_HIDE);
    }
    else
    {
    lpDrawItemStruct->itemID = iSel;
    lpDrawItemStruct->itemState = ODS_SELECTED;
    VERIFY(GetItemRect(iSel, &lpDrawItemStruct->rcItem)); lpDrawItemStruct->rcItem.bottom += 2;
    lpDrawItemStruct->rcItem.top -= 2; rc=lpDrawItemStruct->rcItem;

    rc.top+=4;

    hr=CreateSolidBrush(RGB(255,255,0));
    iSave=dc.SaveDC();
    dc.SelectObject(hr);
    dc.RoundRect(&lpDrawItemStruct->rcItem, CPoint(10,10)); dc.SetBkMode(TRANSPARENT);
      dc.SetTextColor(RGB(0,255,255));
    dc.DrawText(szLable, rc, DT_SINGLELINE|DT_BOTTOM|DT_CENTER|DT_VCENTER); dc.RestoreDC(iSave);
    DeleteObject(hr); m_pPages[iSel]->ShowWindow(SW_SHOW); }
    //画ICON
    CImageList* pImageList = GetImageList();
    //HIMAGELIST hilTabs = (HIMAGELIST)TabCtrl_GetImageList(GetSafeHwnd());
    if (pImageList && tci.iImage >= 0) 
    { rc.left += dc.GetTextExtent(_T(" ")).cx; //得到ICON的高度
    IMAGEINFO info;
    pImageList->GetImageInfo(tci.iImage, &info);
    CRect ImageRect(info.rcImage);
    int nYpos = rc.top;
    //画ICON
    pImageList->Draw(&dc, tci.iImage, CPoint(rc.left, nYpos), ILD_TRANSPARENT);
    //ImageList_Draw(hilTabs, tci.iImage, dc.m_hDC, rcPage.left, rcPage.top, ILD_TRANSPARENT);
    rc.left += ImageRect.Width();
    }
    }
    }BOOL CBaseTabCtrl::OnEraseBkgnd(CDC* pDC) 
    {
    //return CTabCtrl::OnEraseBkgnd(pDC);
    CRect rcClient;
    GetClientRect(&rcClient);
    pDC->Rectangle(&rcClient);
    return TRUE;
    }