自绘标准CTreeCtrl的实现(NM_CUSTORMDRAW方法)

来源:互联网 发布:淘宝产品推广 编辑:程序博客网 时间:2024/06/05 13:24

自绘树CTreeCtrl可以自己用子类化在派生类里的OnPaint里绘制也可以响应

NM_CUSTORMDRAW这个反射消息,然后绘制,NM_CUSTORMDRAW里有个什么绘画周期的概念,他可以在不同的绘画段

绘制不同的内容,这里具体细节不再赘述,读者可以参考MSDN,这里主要阐述NM_CUSTORMDRAW的绘制方式:

[cpp] view plaincopy
  1. void CSkinTreeCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)  
  2. {  
  3.     LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);  
  4.       
  5.     LPNMTVCUSTOMDRAW lpnmcd = (LPNMTVCUSTOMDRAW) pNMCD;  
  6.     if (lpnmcd ->nmcd.dwDrawStage == CDDS_PREPAINT)  
  7.     {  
  8.         *pResult = CDRF_NOTIFYITEMDRAW;  
  9.         return;  
  10.     }  
  11.     else if (lpnmcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)  
  12.     {  
  13.         CRect rcItem(pNMCD->rc);          // Item的区域  
  14.         POINT ptItem ;   
  15.         ptItem.x = rcItem.left + 1 ;   
  16.         ptItem.y = rcItem.top + 1 ;   
  17.         UINT uFlags;   
  18.         HTREEITEM hItem = HitTest(ptItem, &uFlags);  // Item 句柄  
  19.         if(!hItem)   
  20.         {  
  21.             *pResult = CDRF_DODEFAULT;  
  22.             return;  
  23.         }  
  24.         CRect rcClient;  
  25.         GetClientRect(&rcClient);  
  26.         rcItem.left=0;  
  27.         rcItem.right=rcClient.right;  
  28.         rcItem.NormalizeRect();  
  29.         HDC  hdcItem = pNMCD->hdc ;  //  Item的dc  
  30.         CDC dc;  
  31.         dc.Attach(hdcItem);  
  32.         int nSave = dc.SaveDC();  
  33.         dc.FillSolidRect(&rcItem,RGB(234, 237, 242));  
  34.         //draw something  
  35.         CString strText;  
  36.         strText=GetItemText(hItem);  
  37.         if (GetItemState(hItem, TVIS_SELECTED) == TVIS_SELECTED)  
  38.         {     
  39.             CImage img;  
  40.             if (GetFocus() == this)  
  41.             {  
  42.                 img.LoadFromResource(AfxGetResourceHandle(), IDB_TREE_SELECT_BKG);  
  43.             }  
  44.             else  
  45.             {  
  46.                 img.LoadFromResource(AfxGetResourceHandle(), IDB_TREESELECT_NOFOCUS_BKG);  
  47.             }  
  48.             img.Draw(dc,rcItem);  
  49.             img.Destroy();  
  50.         }  
  51.         rcItem.left += 30;  
  52.         dc.SetTextColor(RGB(0,0,0));  
  53.         dc.SetBkMode(TRANSPARENT);  
  54.         CFont font;  
  55.         font.CreateFont(12,   // nHeight  
  56.             0,                         // nWidth  
  57.             0,                         // nEscapement  
  58.             0,                         // nOrientation  
  59.             FW_NORMAL,                   // nWeight  
  60.             FALSE,                     // bItalic  
  61.             FALSE,                     // bUnderline  
  62.             0,                         // cStrikeOut  
  63.             ANSI_CHARSET,              // nCharSet  
  64.             OUT_DEFAULT_PRECIS,        // nOutPrecision  
  65.             CLIP_DEFAULT_PRECIS,       // nClipPrecision  
  66.             DEFAULT_QUALITY,           // nQuality  
  67.             DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily  
  68.             TEXT("宋体"));  
  69.         dc.SelectObject(&font);  
  70.         dc.DrawText(strText, strText.GetLength(), &rcItem, DT_LEFT | DT_SINGLELINE | DT_VCENTER);  
  71.         rcItem.left -= 30;  
  72.         dc.RestoreDC(nSave);  
  73.         dc.Detach();  
  74.         *pResult = CDRF_SKIPDEFAULT;  
  75.         return;  
  76.     }  
  77.      
  78.     *pResult = CDRF_DODEFAULT;  
  79.     return;  
  80. }  
  81. BOOL CSkinTreeCtrl::OnEraseBkgnd(CDC* pDC)  
  82. {  
  83.     CRect rcClient;  
  84.     GetClientRect(&rcClient);  
  85.     pDC->FillSolidRect(&rcClient,RGB(234, 237, 242));  
  86.    return TRUE;  
  87. }  
 

 

ui demo:

 



转帖:http://blog.csdn.net/hurryboylqs/article/details/5548605

原创粉丝点击