RT.在NM_CUSTOMDRAW里怎么用双缓冲。CTreeCtrl

解决方案 »

  1.   

    网上使用双缓冲的例子程序很多的吧
    lz应该是想问怎么自绘CTreeCtrl控件吧
    codeproject上有很多的;
    http://www.codeproject.com/info/search.aspx?artkw=CTreeCtrl
      

  2.   

    在OnPaint里你会用么?
    一样的
      

  3.   

    OnPaint里跟NM_CUSTORMDRAW里不一样呀, NM_CUSTORMDRAW里有个什么绘画周期: 通知擦除所有->擦除项->开始绘->开始绘项->项绘制结束->所有项绘制结束,我已经按根据不同的时期处理,但是还是有问题。我先看看codeproject.
      

  4.   


    你说用SDK?
    我重绘listctrl就是按着类似OnPaint中的方法实现的
      

  5.   


    用的还是MFC。那可能是我nmcd.dwDrawStage和*pResult的值不对.应该是怎么的nmcd.dwDrawStage
      

  6.   


    感觉有一点点闪。
            CDC *pDC = CDC::FromHandle(lpTVCD->nmcd.hdc);        switch(lpTVCD->nmcd.dwDrawStage)
    {
    case CDDS_PREPAINT:
    {
    *pResult = CDRF_NOTIFYITEMDRAW ;
    }
    break; case CDDS_ITEMPREPAINT:
    {
                            HTREEITEM htItem = (HTREEITEM)(lpTVCD->nmcd.dwItemSpec); DrawItemBk(pDC, htItem, nState);
                            DrawItemText(pDC, htItem, nState);

    *pResult = CDRF_SKIPDEFAULT;
    }
    break; case CDDS_POSTPAINT:
    {
    *pResult = CDRF_DODEFAULT;
    }
    break; default:
    *pResult = CDRF_DODEFAULT;
    break;
    }这是原来的,显示各方面一切正常。如果使用内存贴图画的话, 那我应该在那个位置MemDC.SelectObject(&MemBit),在哪个位置pDC->Bitblt
      

  7.   


    void CSkinTreeCtrl::OnPaint()
    {
    CPaintDC dc(this); // device context for painting
    CRect rcClient; GetClientRect(&rcClient);
    CDC MemDC;
    MemDC.CreateCompatibleDC(&dc);
    CBitmap bmp;
    bmp.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
    MemDC.SelectObject(&bmp);
    CFont font;
    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
    TEXT("宋体"));
    MemDC.FillSolidRect(&rcClient, RGB(234, 237, 242));
    MemDC.SelectObject(&font);
    MemDC.SetTextColor(RGB(0, 0, 0));
    MemDC.SetBkMode(TRANSPARENT); HTREEITEM hItem = GetFirstVisibleItem();
    while (hItem)
    {
    CRect rcItem;
    GetItemRect(hItem, &rcItem, FALSE);
    if (rcItem.top > rcClient.bottom)
    {
    break;
    }
    //draw something
    CString strText;
    strText=GetItemText(hItem);
    if (GetItemState(hItem, TVIS_SELECTED) == TVIS_SELECTED)
    {
    CImage img;
    if (GetFocus() == this)
    {
    img.LoadFromResource(AfxGetResourceHandle(), IDB_TREE_SELECT_BKG);
    }
    else
    {
    img.LoadFromResource(AfxGetResourceHandle(), IDB_TREESELECT_NOFOCUS_BKG);
    }
    img.Draw(MemDC,rcItem);
    img.Destroy();
    }
    rcItem.left += 30;
    MemDC.DrawText(strText, strText.GetLength(), &rcItem, DT_LEFT | DT_SINGLELINE | DT_VCENTER);
    hItem = GetNextVisibleItem(hItem);
    } dc.BitBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),&MemDC,0,0,SRCCOPY);
    }
      

  8.   

    lz应该是想问怎么自绘CTreeCtrl控件吧
    codeproject上有很多的;
    http://www.codeproject.com/info/search.aspx?artkw=CTreeCtrl
      

  9.   

    最后在WM_PAINT里和在NM_CUSTOMDRAW里感觉了一下,我感觉没多大区别, WM_PAINT里确实容易些, 以前一直都被灌输了一个思想:控件窗口的重绘,重载DrawItem是首选,其次是NM_CUSTOMDRAW,然后才是WM_PAINT, 像EDIT这些WM_PAINT也不好处理,就重载OnCtlColor了。对于重绘控件WM_PAINT比DrawItem,应该在哪个地方处理呢? 还是完全决定于实际