自绘CCheckListBox,那个checkbox还是显露出来好像,我是在DrawItem里绘制的

解决方案 »

  1.   

    没人知道么?难道这是微软的bug?
    在DrawItem里绘制那个默认的checkbox还是会显露出来
    想自己绘制都不行
      

  2.   

    没用过这个CCheckListBox
    猜一下吧
    1、checkbox是不是有句柄的控件所以不受父窗口绘制的影响,是不是应该子类化
    2、在OnPaint中试试,或许可以实现完全自绘
      

  3.   

    没用过CCheckListBox,如果你不想要那个CheckBox,建议直接自绘CListBox,在DrawItem绘制就可以了.
      

  4.   

    貌似他那个checkbox是一定会显示的。除非你获得checkbox的句柄,然后把它隐藏。
      

  5.   

    问题找到了,CCheckListBox是MFC自己封装CListBox来绘制那个CheckBox的
    之所以我不想从CListBox直接派生自绘是因为我不想自己来维护那个
    每一项的勾选状态
    我看了下CCheckListBox的源码,里面在调用DrawItem前会把checkbox画好了
    所以在DrawItem画里已经迟了,现在我直接在OnPaint里画,但是遇到一个小的问题
    我稍后把源码上传到CSDN资源,大家帮我看看Item选中状态(不是指checkBox的勾选状态)
    为什么会是:选中第一项,后面的所有项都同时被着上选中的颜色了。基本代码:void CSkinCheckListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
    {
    lpMeasureItemStruct->itemHeight = 20;
    }void CSkinCheckListBox::PreSubclassWindow()
    {
    ModifyStyle(0, LBS_OWNERDRAWFIXED|LBS_HASSTRINGS);
    CCheckListBox::PreSubclassWindow();
    }BOOL CSkinCheckListBox::OnEraseBkgnd(CDC* pDC)
    {
    return TRUE;
    }void CSkinCheckListBox::OnPaint()
    {
    CPaintDC dc(this);

    CDC MemDC;
    MemDC.CreateCompatibleDC(&dc);
    CBitmap bmp;
    CRect rect;
    GetClientRect(&rect);
    bmp.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
    MemDC.SelectObject(&bmp);
    MemDC.FillSolidRect(&rect,RGB(255,194,192)); int nFirstIndex = GetTopIndex();
    int nItemCount = GetCount();
        int nHeight = 0;
    int nItemHeight;
    CRect rcTemp;
    CString strItemText;
    int nItemState; CFont font;
    VERIFY(font.CreateFont(
    12,                        // nHeight
    0,                         // nWidth
    0,                         // nEscapement
    0,                         // nOrientation
    FW_NORMAL,                 // nWeight
    FALSE,                     // bItalic
    FALSE,                     // bUnderline
    0,                         // cStrikeOut
    ANSI_CHARSET,              // nCharSet
    OUT_DEFAULT_PRECIS,        // nOutPrecision
    CLIP_DEFAULT_PRECIS,       // nClipPrecision
    DEFAULT_QUALITY,           // nQuality
    DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
    _T("宋体")));                 // lpszFacename MemDC.SelectObject(&font);
    int nSelItem = GetCurSel();
    int yPos;
    for (int i= nFirstIndex;i<nItemCount&&nHeight< rect.Height(); i++)
    {
            nHeight += GetItemHeight(i);
    GetItemRect(i,&rcTemp);
    rcTemp.left = rect.left+2;
    rcTemp.right = rect.right;
    //选中Item着色
    nItemHeight = GetItemHeight(i);
    if (i == nSelItem)
    {
    CRect rc = rcTemp;
    rc.bottom = rc.top+nItemHeight;
    MemDC.FillSolidRect(&rc,RGB(0,0,255));
    }

            GetText(i,strItemText);
    nItemState = GetCheck(i); //画CheckBox
            CImage img;
    img.LoadFromResource(AfxGetResourceHandle(),IDB_BITMAP4);
    yPos = rcTemp.top+nItemHeight/2 - 5;
    img.Draw(MemDC,rcTemp.left,yPos,11,11,nItemState*11,0,11,11); //画文本
            rcTemp.left+=13;
    MemDC.DrawText(strItemText,&rcTemp,DT_VCENTER|DT_SINGLELINE); } dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);
    }BOOL CSkinCheckListBox::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult)
    { switch (message)
    {
    case WM_DRAWITEM:
    ASSERT(pLResult == NULL);       // no return value expected
    Invalidate(FALSE);
    break;
    case WM_MEASUREITEM:
    ASSERT(pLResult == NULL);       // no return value expected
    PreMeasureItem((LPMEASUREITEMSTRUCT)lParam);
    break;
    case WM_COMPAREITEM:
    ASSERT(pLResult != NULL);       // return value expected
    *pLResult = PreCompareItem((LPCOMPAREITEMSTRUCT)lParam);
    break;
    case WM_DELETEITEM:
    ASSERT(pLResult == NULL);       // no return value expected
    PreDeleteItem((LPDELETEITEMSTRUCT)lParam);
    break;
    default:
    return CListBox::OnChildNotify(message, wParam, lParam, pLResult);
    }

    return  TRUE;
    }
      

  6.   

    好像可以了,选中状态我用一个图片拉伸来显示就行
            //选中Item着色
            nItemHeight = GetItemHeight(i);
            if (i == nSelItem)
            {
                CRect rc = rcTemp;
                rc.bottom = rc.top+nItemHeight;
                MemDC.FillSolidRect(&rc,RGB(0,0,255));
            }上面这段代码有神马问题? 难道是这个rc超出了范围?
      

  7.   

    有毛病吧,搞不出来就说微软bug,