概述:

CQSTreeView基础与 CTreeViewCtrl,主要实现控件列表的选中颜色和背景颜色,以及选中圆角等一些特性。

代码实现如下:

#pragma once
#pragma warning(disable:4995)#include "QsInclude.h"#define        QS_TVS_NODRAW             0x00000001 //使用系统默认方式和属性
#define     QS_TVS_OWNERDRAW          0x00000002 //使用自绘属性
#define     QS_TVS_SAMFRONTDRAW       0x00000010 // 前景使用相同的图片的属性
#define     QS_TVS_DIFFERFRONTDRAW    0x00000100 // 前景使用不同的图片的属性#define     TREEFONTIMAELEFT             0X00    // 左边显示
#define     TREEFONTIMAERIGHT            0x01    //右边显示#define     TREEFONTIMAELBTN             0x01    //单击响应
#define     TREEFONTIMAEUNLBTN           0x00    //单击响应class CQSTreeView:public CWindowImpl<CQSTreeView, CTreeViewCtrl>,public CImageMgrCtrlBase<CQSTreeView>
{typedef CWindowImpl<CQSTreeView, CTreeViewCtrl> theBaseClass;typedef CImageMgrCtrlBase<CQSTreeView> theImageCtrlBaseClass;
public:BEGIN_MSG_MAP( CQSTreeView )MSG_WM_KEYDOWN(OnKeyDown)MESSAGE_HANDLER( WM_PAINT, OnPaint )MESSAGE_HANDLER( WM_ERASEBKGND, OnEraseBKGnd )MESSAGE_HANDLER( WM_LBUTTONDOWN, OnLButtonDown )MESSAGE_HANDLER( WM_LBUTTONDBLCLK, OnLButtonDblClk )CHAIN_MSG_MAP( theImageCtrlBaseClass )DEFAULT_REFLECTION_HANDLER()END_MSG_MAP()// 文件夹选中和没选中的图标
public:enum enIcon{IMAGE_ROOTUNSELECTED = 0,IMAGE_ROOTSELECTED,IMAGE_UNSELECTED,IMAGE_SELECTED,IMAGE_EXPANDED,};
public:/***@method   CQSTreeView*@brief        CQSTreeViewCtrl类构造函数*    *@return   */CQSTreeView(){m_uFirstPos = CONTROL_TVC_FIRST;  //图片偏移量m_uLastPos = CONTROL_TVC_LAST;    // 图片结束位置m_iItemHeight = 0;m_vtIcon.resize(IMAGE_EXPANDED+1, 0);m_hFont = NULL;txtColor = Color(255, 66, 66, 66 );m_QsStyle = QS_TVS_OWNERDRAW|QS_TVS_DIFFERFRONTDRAW;SetQSFont(_T("宋体"),14,FW_BOLD,ANSI_CHARSET);m_nformart = DT_SINGLELINE | DT_LEFT |DT_VCENTER| DT_WORD_ELLIPSIS | DT_PATH_ELLIPSIS |DT_END_ELLIPSIS ;m_nLevelLeft =10;m_pImageBK = NULL;m_bFlagEdit = FALSE;}/***@method   ~CQSTreeView*@brief      CQSTreeViewCtrl析构造函数*    *@return   */virtual ~CQSTreeView(){DeleteQSFont();for(UINT i =0;i<m_vtIcon.size();i++){Image * pImage = (Image*)m_vtIcon[i];if(pImage !=NULL){delete    pImage;pImage = NULL;}}m_vtIcon.clear();for(UINT i =0;i<m_TreeItemImage.size();i++){HTREEITMEIMAGE htree= m_TreeItemImage[i];if(htree.pImage!= NULL){delete htree.pImage;htree.pImage = NULL;}}m_TreeItemImage.clear();}/***@method   SetLevelTextLeft*@brief    *    *@param    int nLevelLeft*@return   void*/void SetLevelTextLeft(int nLevelLeft){m_nLevelLeft = nLevelLeft;}/***@method   SetQSTextColor*@brief      设置自绘时的字体颜色*    *@param    Color crColor*@return   void*/void SetQSTextColor(Color crColor){txtColor = crColor;}/***@method   SetQsSelTextColor*@brief      设置自绘时的字体颜色*    *@param    Color crColor*@return   void*/void SetQsSelTextColor(Color crSelColor){txtSelColor = crSelColor;}/***@method   SetTreeFlagEdit*@brief    设置Tree是否编辑状态*    *@param    BOOL bFlagEdit*@return   void*/void SetTreeFlagEdit(BOOL bFlagEdit){m_bFlagEdit = bFlagEdit;}/***@method   GetQSTextColor*@brief       得到自绘时的字体颜色*    *@return   Color*/Color GetQSTextColor(){return txtColor;}/***@method   SetTxtFormart*@brief        设置字体的格式*      *@param    int nformart*@return   void*/void SetTxtFormart(int nformart){m_nformart = nformart;}/***@method   SetBKImage*@brief    设置背景图片*    *@param    Image * pImage*@return   void*/void SetBKImage(Image* pImage){if(pImage != NULL){m_pImageBK = pImage->Clone();}}/***@method   InsertItem*@brief       插入节点中*    *@param    LPCTSTR lpszItem*@param    HTREEITEM hParent*@param    HTREEITEM hInsertAfter*@return   HTREEITEM*/HTREEITEM InsertItem(LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter){//WTL::CString StrText(lpszItem);/*if(m_QsStyle&QS_TVS_OWNERDRAW){FormartTextShow(StrText,false);}*/return CTreeViewCtrl::InsertItem(lpszItem, hParent, hInsertAfter);}/***@method   SetItemText*@brief      设置节点名称*    *@param    HTREEITEM hItem*@param    LPCTSTR lpszItem*@return   BOOL*/BOOL SetItemText(HTREEITEM hItem, LPCTSTR lpszItem){//WTL::CString StrText(lpszItem);/*if(m_QsStyle&QS_TVS_OWNERDRAW){FormartTextShow(StrText,false);}*/return CTreeViewCtrl:: SetItemText(hItem,lpszItem);}/***@method   SetQSWindowsStyle*@brief        设置自绘时的窗口的属性*    *@param    DWORD QsStyle  窗口的扩展属性*@return   void*/void SetQSWindowsStyle(DWORD QsStyle){m_QsStyle = QsStyle;}/***@method   Create*@brief      通过Create来创建窗口*    *@param    HWND hWndParent  parent window*@param    ATL::_U_RECT rect   window rect*@param    LPCTSTR szWindowName  the window name*@param    DWORD dwStyle window style*@param    DWORD dwExStyle  extended window style*@param    ATL::_U_MENUorID MenuOrID*@param    LPVOID lpCreateParam*@return   HWND*/HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL,DWORD dwStyle = 0, DWORD dwExStyle = 0,ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL){return theBaseClass::Create( hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam);}/***@method   DeleteQSFont*@brief       删除字体对象*    *@return   void*/void DeleteQSFont(){if (NULL != m_hFont){DeleteObject(m_hFont);m_hFont = NULL;}}/***@method   SubclassWindow*@brief        类对象关联*    *@param    HWND hWnd  对象句柄*@return   BOOL  成功返回TRUE,失败返回FALSE*/BOOL SubclassWindow( HWND hWnd ){BOOL bRet = theBaseClass::SubclassWindow( hWnd );//设置标签尺寸Image *pImage = GetImage( CONTROL_TVC_NORMAL );if( pImage ){SetItemHeight( pImage->GetHeight() );}return bRet;}/***@method   AddIcon*@brief     设置图标 *    *@param    Image * pImage   图标*@param    enIcon enIcn   类型*@return   void*/void AddIcon(Image* pImage, enIcon enIcn){if(pImage!=NULL){m_vtIcon[enIcn] = pImage->Clone();}}/***@method   SetTreeItemImage*@brief    *    *@param    HTREEITEM htreeItem*@param    Image * pImage*@param    int nImageMode*@param    int nLBtnDown*@return   void*/void SetTreeItemImage(HTREEITEM htreeItem,Image* pImage,int nImageMode =TREEFONTIMAELEFT,int nLBtnDown =TREEFONTIMAEUNLBTN){HTREEITMEIMAGE hreeItemImage;hreeItemImage.htreeItem = htreeItem;if(pImage != NULL){hreeItemImage.pImage = pImage->Clone();}hreeItemImage.nImageMode = nImageMode;hreeItemImage.nLBtnDown = nLBtnDown;m_TreeItemImage.push_back(hreeItemImage);}/***@method   SetQSFont*@brief        设置文字的大小*    *@param    TCHAR * fontName  字体名称 不得大小32*@param    int lfHeight  字体大小*@param    int lfWeight*@param    BYTE fCharSet*@return   void*/void SetQSFont(LPCTSTR fontName,int lfHeight,int lfWeight = FW_BOLD,BYTE fCharSet = DEFAULT_CHARSET){DeleteQSFont();LOGFONT itemFont;itemFont.lfCharSet = fCharSet;itemFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;itemFont.lfEscapement = 0;memset(itemFont.lfFaceName, 0, LF_FACESIZE);memcpy_s(itemFont.lfFaceName, LF_FACESIZE, fontName, LF_FACESIZE);itemFont.lfHeight = lfHeight;itemFont.lfItalic = FALSE;itemFont.lfOrientation = 0;itemFont.lfOutPrecision = OUT_DEFAULT_PRECIS;itemFont.lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;itemFont.lfQuality = CLEARTYPE_QUALITY;itemFont.lfStrikeOut = FALSE;itemFont.lfUnderline = FALSE;itemFont.lfWeight = lfWeight;itemFont.lfWidth = 0;if(!(m_QsStyle&QS_TVS_OWNERDRAW))  //是否有自绘属性{SetFont( ::CreateFontIndirect( &itemFont));}else{SetFontQS( ::CreateFontIndirect( &itemFont));}}/***@method   GetFontQS*@brief       获取字体对象*    *@return   HFONT*/HFONT GetFontQS(){return m_hFont;}private:/***@method   SetFontQS*@brief        设置字体*    *@param    HFONT hFnt*@return   HFONT 原来的字体*/HFONT SetFontQS(HFONT hFnt){HFONT hOldFnt = m_hFont;m_hFont = hFnt;return hOldFnt;}
protected:/***@method   DrawFrontImage*@brief    绘制前景图图片*    *@param    CDC & memDC*@param    Image * pImage*@param    CRect & rcItem*@return   void*/void DrawFrontImage(CDC& memDC,Image*pImage,CRect& rcItem,int&nTextFormat){Graphics graph(memDC.m_hDC);graph.SetPageScale( 1.0 );graph.SetPageUnit( UnitPixel ); graph.SetSmoothingMode(SmoothingModeNone);CRect drawRect;if(nTextFormat == DT_LEFT){drawRect.left = (rcItem.right/2-rcItem.right/3)-pImage->GetWidth()-4;}else{drawRect.left = 0;}drawRect.top = rcItem.top + (rcItem.Height() - pImage->GetHeight())/2;drawRect.right = drawRect.left + pImage->GetWidth();drawRect.bottom = drawRect.top + pImage->GetHeight();graph.DrawImage(pImage, drawRect.left, drawRect.top, drawRect.Width(), drawRect.Height());graph.ReleaseHDC(memDC.m_hDC);}/***@method   DrawFrontImageEx*@brief    绘制前景图图片*    *@param    CDC & memDC*@param    Image * pImage*@param    CRect & rcItem*@return   void*/void DrawFrontImageEx(CDC& memDC,Image*pImage,CRect& rcItem,int&nTextFormat){Graphics graph(memDC.m_hDC);graph.SetPageScale( 1.0 );graph.SetPageUnit( UnitPixel ); graph.SetSmoothingMode(SmoothingModeNone);CRect drawRect;if(nTextFormat == DT_LEFT){drawRect.left = rcItem.right-pImage->GetWidth()-24;}else{drawRect.left = 0;}drawRect.top = rcItem.top + (rcItem.Height() - pImage->GetHeight())/2;drawRect.right = drawRect.left + pImage->GetWidth();drawRect.bottom = drawRect.top + pImage->GetHeight();graph.DrawImage(pImage, drawRect.left, drawRect.top, drawRect.Width(), drawRect.Height());graph.ReleaseHDC(memDC.m_hDC);}/***@method   Gettxtformat*@brief     得到所有的txtFormat *    *@param    int & nTextFormat*@return   void*/void Gettxtformat(int& nTextFormat){if((m_nformart&DT_LEFT)==0){nTextFormat = DT_LEFT;}else if(m_nformart&DT_CENTER){nTextFormat = DT_CENTER;}else{nTextFormat = DT_RIGHT;}}/***@method   GetTreeItemLevel*@brief    得到节点的级别*    *@return   int*/int GetTreeItemLevel(HTREEITEM htreeItem){int nLevel = 0;HTREEITEM hItem = htreeItem;while(GetParentItem(hItem)){hItem = GetParentItem(hItem);nLevel++;}return nLevel;}/***@method   DrawFrontStyleImage*@brief    *    *@param    HTREEITEM hTreeItem*@param    CDC memDC*@param    CRect rcItem*@param    int nTextFormat*@return   void*/void DrawFrontSamStyleImage(HTREEITEM hTreeItem,CDC& memDC,CRect rcItem,int nTextFormat,BOOL bSelected){Image* pImage = NULL;if(NULL == GetParentItem( hTreeItem )) // 第一层{UINT nstate =GetItemState(hTreeItem,TVIS_EXPANDED);if( bSelected ){BOOL has_children = ItemHasChildren( hTreeItem );if((nstate&TVIS_EXPANDED)&&(has_children==TRUE)){pImage = m_vtIcon[IMAGE_EXPANDED];}else{pImage = m_vtIcon[IMAGE_ROOTSELECTED];}}else{pImage = m_vtIcon[IMAGE_ROOTUNSELECTED];}if(pImage){DrawFrontImage(memDC,pImage,rcItem,nTextFormat);}}//绘制节点图像if(NULL != GetParentItem( hTreeItem )) // 不是第一层{ if( bSelected ){pImage = m_vtIcon[IMAGE_SELECTED];}else{pImage = m_vtIcon[IMAGE_UNSELECTED];}if (NULL != pImage){DrawFrontImage(memDC,pImage,rcItem,nTextFormat);}}}/***@method   DrawFrontStyleImage*@brief    *    *@param    HTREEITEM hTreeItem*@param    CDC memDC*@param    CRect rcItem*@param    int nTextFormat*@return   void*/void DrawFrontDifStyleImage(HTREEITEM hTreeItem,CDC& memDC,CRect rcItem,int nTextFormat){Image* pImage = NULL;for(UINT i =0;i<m_TreeItemImage.size();i++){if(m_TreeItemImage[i].htreeItem == hTreeItem){pImage = m_TreeItemImage[i].pImage;if(pImage!= NULL){int nImageMode = m_TreeItemImage[i].nImageMode;if(nImageMode == TREEFONTIMAELEFT){DrawFrontImage(memDC,pImage,rcItem,nTextFormat);}else{DrawFrontImageEx(memDC,pImage,rcItem,nTextFormat);}}break;}}}/***@method   OnPaint*@brief        绘制消息函数*     *@param    UINT uMsg*@param    WPARAM wParam*@param    LPARAM lParam*@param    BOOL &*@return   LRESULT*/LRESULT OnPaint( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/ ){if(m_QsStyle&QS_TVS_NODRAW){return DefWindowProc( uMsg, wParam, lParam);}int nTextFormat = DT_LEFT;Gettxtformat(nTextFormat);WTL::CPaintDC paintDC( m_hWnd );paintDC.SetBkMode( TRANSPARENT );CRect rc;GetClientRect( rc );//创建内存作图对象WTL::CDC memDC;memDC.CreateCompatibleDC( paintDC.m_hDC );WTL::CBitmap memBitmap;memBitmap.CreateCompatibleBitmap( paintDC.m_hDC, rc.Width(), rc.Height() );HBITMAP hOldBmp = memDC.SelectBitmap( memBitmap );memDC.SetBkMode( TRANSPARENT );//获得控件背景if (NULL != m_pImageBK){Graphics graph( memDC.m_hDC );RectF des(0, 0, (Gdiplus::REAL)rc.Width(), (Gdiplus::REAL)rc.Height());graph.DrawImage(m_pImageBK, des, 0, 0, (Gdiplus::REAL)m_pImageBK->GetWidth(), (Gdiplus::REAL)m_pImageBK->GetHeight(),UnitPixel, NULL);graph.ReleaseHDC( memDC.m_hDC );}//::SendMessage( GetParent(), WM_DRAWBKGNDUI, ( WPARAM )memDC.m_hDC, ( LPARAM )m_hWnd );绘制当前有效的节点HTREEITEM hTreeItem = GetFirstVisibleItem();while( hTreeItem != NULL ){     CRect rcItem;GetItemRect(hTreeItem, rcItem, FALSE);//当前是否被选中BOOL bSelected = (GetSelectedItem() == hTreeItem );int nLevel =GetTreeItemLevel(hTreeItem);//绘制节点背景Image *pImage = NULL;if( bSelected ){pImage = GetImage( CONTROL_TVC_SELECTED + nLevel );if(pImage == NULL){pImage = GetImage( CONTROL_TVC_SELECTED);}}else{pImage = GetImage( CONTROL_TVC_NORMAL + nLevel );}if((TRUE == m_bFlagEdit) && (GetSelectedItem() == hTreeItem)){;}else{if(NULL != pImage){Graphics graph( memDC.m_hDC );graph.SetPageScale( 1.0 );graph.SetPageUnit( UnitPixel ); graph.SetSmoothingMode( SmoothingModeNone );graph.DrawImage( pImage, rcItem.left, rcItem.top, rcItem.Width(), rcItem.Height() );graph.ReleaseHDC( memDC.m_hDC );}if(m_QsStyle&QS_TVS_SAMFRONTDRAW){DrawFrontSamStyleImage(hTreeItem,memDC,rcItem,nTextFormat,bSelected);}if(m_QsStyle&QS_TVS_DIFFERFRONTDRAW){DrawFrontDifStyleImage(hTreeItem,memDC,rcItem,nTextFormat);}if(nTextFormat == DT_LEFT){rcItem.left = rcItem.right/2-rcItem.right/3+nLevel*m_nLevelLeft;}//绘制节点文字///CString strText;GetItemText( hTreeItem, strText);HFONT hNewFont(NULL);if( m_hFont == NULL ){hNewFont = (HFONT)::GetStockObject( SYSTEM_FONT );}else{hNewFont = m_hFont;}HFONT hOldFont = memDC.SelectFont( hNewFont );if(bSelected == TRUE){memDC.SetTextColor(RGB(txtSelColor.GetR(),txtSelColor.GetG(),txtSelColor.GetB()));}else{memDC.SetTextColor(RGB(txtColor.GetR(),txtColor.GetG(),txtColor.GetB()));}memDC.DrawText( strText, strText.GetLength(), rcItem, m_nformart );memDC.SelectFont( hOldFont );}hTreeItem = GetNextVisibleItem( hTreeItem );}//提交图像paintDC.BitBlt( 0, 0, rc.Width(), rc.Height(), memDC.m_hDC, 0, 0, SRCCOPY );memDC.SelectBitmap( hOldBmp );memBitmap.DeleteObject();  //释放GDImemDC.DeleteDC();         //释放内存DCreturn 0;}
public:/***@method   FormartTextShow*@brief        设置体的显示方式*    *@param    WTL::CString & strSrc   设置显示的字体*@param    bool bIndent   字体是否缩进*@return   void*/void FormartTextShow(CString& strSrc,bool bIndent = false ){HDC hDC = GetDC();CRect rectItem;GetClientRect(rectItem);::SelectObject(hDC, GetFontQS());TEXTMETRIC tm = {0};GetTextMetrics(hDC, &tm);int charWidth = (tm.tmPitchAndFamily & 1? 3: 2) * tm.tmAveCharWidth /2;int iCharNum = (bIndent? rectItem.Width()-40: rectItem.Width()) / charWidth;int windth = rectItem.Width();int nn = windth/(tm.tmAveCharWidth*3);   iCharNum -= nn;if (iCharNum < strSrc.GetLength()){strSrc = strSrc.Mid(0, iCharNum-1);strSrc = strSrc + TEXT("...");}ReleaseDC(hDC);}/***@method   OnEraseBKGnd*@brief        背景绘制消息函数*    *@param    UINT*@param    WPARAM*@param    LPARAM*@param    BOOL &*@return   LRESULT*/LRESULT OnEraseBKGnd( UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/ ){//bHandled = FALSE;//禁止绘制底色return 0;}/***@method   HitTreeItem*@brief    单击事件*    *@return   void*/BOOL HitTreeItem(HTREEITEM hTreeItem,CPoint point){for (UINT i =0;i< m_TreeItemImage.size();i++){HTREEITMEIMAGE  hTreeItemImage = m_TreeItemImage[i];if(hTreeItemImage.htreeItem == hTreeItem){if(hTreeItemImage.nLBtnDown == TREEFONTIMAELBTN){CRect rcItem;GetItemRect(hTreeItem,rcItem,FALSE);Image* pImage = hTreeItemImage.pImage;if(pImage !=NULL){CRect drawRect;drawRect.left = rcItem.right-pImage->GetWidth()-24;drawRect.top = rcItem.top + (rcItem.Height() - pImage->GetHeight())/2;drawRect.right = drawRect.left + pImage->GetWidth();drawRect.bottom = drawRect.top + pImage->GetHeight();if(drawRect.PtInRect(point)){int nCtrlID = GetDlgCtrlID( );NMHDR da;ZeroMemory( &da, sizeof( da ) );da.hwndFrom = m_hWnd;da.code = LCN_TREEITEMCLICK;da.idFrom = nCtrlID;::SendMessage( GetParent(), WM_NOTIFY, (WPARAM)nCtrlID,LPARAM(&da));return TRUE;}}}}}return FALSE;}/***@method   OnLButtonDown*@brief         右键消息处理*    *@param    UINT uMsg*@param    WPARAM wParam*@param    LPARAM lParam*@param    BOOL &*@return   LRESULT*/LRESULT OnLButtonDown( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){bHandled = FALSE;if(m_QsStyle&QS_TVS_NODRAW){return DefWindowProc(uMsg,wParam,lParam);}TVHITTESTINFO ht;ht.pt.x = GET_X_LPARAM( lParam ); ht.pt.y = GET_Y_LPARAM( lParam ); HitTest( &ht );BOOL bRet = HitTreeItem(ht.hItem,CPoint(ht.pt.x,ht.pt.y));if(TRUE == bRet) //不进行折叠{return 0;}if( ht.hItem ){CEdit editLable = GetEditControl();if (editLable.IsWindow()){CRect editRect;editLable.GetWindowRect(editRect);CRect itemRect;GetItemRect(ht.hItem, itemRect, FALSE);if (!itemRect.PtInRect(editRect.CenterPoint())){EndEditLabelNow(FALSE);}}SelectItem( ht.hItem );if( GetChildItem( ht.hItem ) ){Expand( ht.hItem, TVE_TOGGLE );}}return 0;}/***@method   OnLButtonDblClk*@brief        窗口双击消息*    *@param    UINT uMsg*@param    WPARAM wParam*@param    LPARAM lParam*@param    BOOL &*@return   LRESULT*/LRESULT OnLButtonDblClk( UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/){POINT pos;pos.x = GET_X_LPARAM( lParam ); pos.y = GET_Y_LPARAM( lParam ); UINT uFlag = 0;HitTest( pos, &uFlag );if( ( uFlag & TVHT_ONITEM ) || ( uFlag & TVHT_ONITEMBUTTON ) || ( uFlag & TVHT_ONITEMICON )|| ( uFlag & TVHT_ONITEMINDENT ) || ( uFlag & TVHT_ONITEMLABEL ) || ( uFlag & TVHT_ONITEMRIGHT )|| ( uFlag & TVHT_ONITEMSTATEICON )   ){TVHITTESTINFO ht;ht.pt = pos;HitTest( &ht );if( ht.hItem ){SelectItem( ht.hItem );if( GetChildItem( ht.hItem ) ){Expand( ht.hItem, TVE_TOGGLE );}NMHDR nm;ZeroMemory( &nm, sizeof(NMHDR) );nm.code = NM_DBLCLK;nm.hwndFrom = m_hWnd;nm.idFrom = ::GetDlgCtrlID(m_hWnd);::SendMessage( GetParent().m_hWnd, WM_NOTIFY, (WPARAM)::GetDlgCtrlID(m_hWnd), (LPARAM)&nm );}}/*if(m_QsStyle&QS_TVS_NODRAW){return DefWindowProc(uMsg,wParam,lParam);}TVHITTESTINFO ht;ht.pt.x = GET_X_LPARAM( lParam ); ht.pt.y = GET_Y_LPARAM( lParam ); HitTest( &ht );if( ht.hItem ){CEdit editLable = GetEditControl();if (editLable.IsWindow()){CRect editRect;editLable.GetWindowRect(editRect);CRect itemRect;GetItemRect(ht.hItem, itemRect, FALSE);if (!itemRect.PtInRect(editRect.CenterPoint())){EndEditLabelNow(FALSE);}}SelectItem( ht.hItem );if( GetChildItem( ht.hItem ) ){Expand( ht.hItem, TVE_TOGGLE );}}NMHDR nm;ZeroMemory( &nm, sizeof(NMHDR) );nm.code = NM_DBLCLK;nm.hwndFrom = m_hWnd;nm.idFrom = ::GetDlgCtrlID(m_hWnd);::SendMessage( GetParent().m_hWnd, WM_NOTIFY, (WPARAM)::GetDlgCtrlID(m_hWnd), (LPARAM)&nm );*/return 0;}/***@method   OnKeyDown*@brief    *    *@param    TCHAR nChar*@param    UINT /*nRepCnt*@param    UINT nFlags*@return   void*/void OnKeyDown( TCHAR nChar, UINT /*nRepCnt*/, UINT nFlags ){int nCtrlID = GetDlgCtrlID( );NMLVKEYDOWN  nm_key;nm_key.wVKey = nChar;nm_key.flags =   nFlags;nm_key.hdr.code = NM_KEYDOWN;nm_key.hdr.hwndFrom = m_hWnd;nm_key.hdr.idFrom = nCtrlID;::SendMessage( GetParent(), WM_NOTIFY, (WPARAM)nCtrlID,LPARAM(&nm_key));}private:HFONT m_hFont;                            //字体对象std::vector<Image*> m_vtIcon;            // 选中和没选中的图标 目前只会在子结点会显示UINT m_iItemHeight;                        //item的宽度Color  txtColor;                        //自绘时字体颜色Color  txtSelColor;                        //自绘选中时字体颜色int m_nformart;                                 //字体的排布方式DWORD m_QsStyle;                           //QS的自绘的颜色int m_nLevelLeft;Image* m_pImageBK;BOOL m_bFlagEdit;typedef struct _HTREEITMEIMAGE{Image* pImage;HTREEITEM htreeItem;int       nImageMode;int       nLBtnDown;_HTREEITMEIMAGE(){pImage = NULL;htreeItem = NULL;nImageMode = 0;nLBtnDown = 0;}}HTREEITMEIMAGE;std::vector<HTREEITMEIMAGE> m_TreeItemImage;            // 根据子节点显示不同的前景图片
};

WTL 自绘控件库 (CQSTreeView)相关推荐

  1. WTL 自绘控件库 (CQsTabCtrl)

    概述: CQsTabCtrl 继承与 CTabCtrl,通过自绘来背景的绘制,以及各种选中状态的的绘制,以及选中和非选中字体的颜色等一些属性. 代码实现如下: #pragma once; #inclu ...

  2. WTL 自绘控件库 (CQSProgressBar)

    概述: CQSProgressBar 进度条,是显示进度控制.但是需要添加自绘属性. 代码实现如下: #pragma once; #pragma warning(disable:4995 4819)# ...

  3. winform checkbox要点击两次_开源C# Winform控件库SunnyUI强力推荐

    本站(https://dotnet9.com)曾介绍过一款Winform开源控件库<HZHControls>,文章发布后不少朋友热情的咨询相关控件库信息,由此看来Winform在大家心中的 ...

  4. 开源C# Winform控件库《SunnyUI》强力推荐

    本站(https://dotnet9.com)曾介绍过一款Winform开源控件库<HZHControls>,文章发布后不少朋友热情的咨询相关控件库信息,由此看来Winform在大家心中的 ...

  5. Github 开源:升讯威 Winform 开源控件库( Sheng.Winform.Controls)

    Github 地址:https://github.com/iccb1013/Sheng.Winform.Controls 本控件库中的代码大约写于10年前(2007年左右),难免有不成熟与欠考虑之处, ...

  6. 如何在WPF中调用C#控件库(HexEdit)

    1 编写一个Hex Edit控件,使用VS2010建立一个类控件库,分别增加两个类文件,一个命名为HexEdit.cs, 一个命名为TextEditControl.cs,具体内容如下所示: 1)Hex ...

  7. MFC自绘控件系列-按钮PNG贴图(GDI+)

    常规的GDI自绘控件仅支持BMP图片,不支持png图片.png图片体积小,支持透明色,可以做圆角界面.自绘控件想要支持PNG图片,需要在MFC工程引入GDI+.需要注意的是MFC工程默认是不支持GDI ...

  8. UI控件库分享:DWZ(j-UI)、LigerUI、Linb

    DWZ(j-UI): 在线演示地址:http://demo.dwzjs.com 在线文档:http://demo.dwzjs.com/doc/dwz-user-guide.pdf DWZ框架Ajax开 ...

  9. 虚拟桌面模拟查找点击自绘控件

    // VDesktopClick.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <string> #inclu ...

  10. [原创]基于Extjs的开源控件库 - http://extaspnet.codeplex.com/

    ExtAspNet   ExtAspNet - ExtJS based ASP.NET Controls with Full AJAX Support     ExtAspNet是一组专业的Asp.n ...

最新文章

  1. 力扣每日一题——独一无二出现的次数
  2. 高速串行总线系列(5)总线的各种基础问题
  3. C++中函数参数形式的总结
  4. Linux 安装卸载软件及管理软件仓库
  5. 计算机管理系统绪论,数据库系统概论 第一章 绪论
  6. android布局layout中的一些属性
  7. 【个人笔记】rabbitMQ下Fanout与Topic两种模式同时用注意事项
  8. 虚拟机VMware tools安装
  9. linux根文件系统制作
  10. 安装VMware,主机键盘不能用解决方法
  11. 正离子计算机扫描检测,扫描电子显微镜
  12. UltraISO 软碟通制作 Windows 7 系统 U 盘启动盘
  13. 拨号时显示无法连接服务器失败,拨号网络常见的错误提示解释及解决方法大全...
  14. MOSFET管驱动电路的设计
  15. 爱立信助力银和瓷业打造智慧工厂;埃森哲2021财年全球营业收入达505亿美元;华为发布11大场景化解决方案 | 全球TMT...
  16. excal怎么设置模板阈值
  17. 02 NCC定时任务开发
  18. word文档生成目录的方法,word生成目录之后怎么修改页码
  19. 对java 链表删除节点 引用误区理解:对局部变量 cur= cur.next及cur.next=cur.next.next,及cur.next = cur.next.next.next的理解图解
  20. SECS/GEM 半导体设备通讯标准学习笔记

热门文章

  1. PHP网站发短信到手机
  2. html5 canvas实现桌面效果,基于html5 canvas实现漫天飞雪效果实例
  3. IDEA美化主题插件Xcode Dark theme Material Theme UI插件保姆级教程
  4. 38241415106——胡应兰(实验一)
  5. strcmp, strcasecmp, memcmp
  6. 稽首文殊,寒山之士;南无普…
  7. 桌面计算机右键管理没反应,右键计算机(我的电脑)管理选项打不开解决措施
  8. ICON设计的7个实用原则
  9. 陈睿竟也是个“大龄二次元宅”?还不知道的集美看过来
  10. Tenth season eleventh episode,Ross is Monica‘s first kiss?????the stripper cried?????