如何自绘树形控件(QQ好友列表)
由于Windows控件本身有许多局限性,有些界面要求如果使用标准的Windows控件没有办法实现,或者效率太低。本文主要介绍的是自定义的树形控件,这种控件多用来实现用户列表等功能,如QQ,MSN用户列表效果。
传统的Tree control有如下局限:
Item高度相同,不能实现不等高的界面效果item绘制复杂,效率不高难以实现背景透明等效果
其中第一条不能设置Item的不同高度是TreeCtrl最大的局限。因为大多数树形列表,希望能用不同的高度来区分不同Item意义,更好的展示Item内容。如下图所示:
DSkinLite新特性:支持扩展自绘:dsTreeControl控件和dsTabControl自绘控件
dsTreeControl控件是一款类似Tree control的树形控件,主要支持一些标准树形控件
不能完成的功能,如设置不同item的不同高度。
dsTabControl控件是一款类似Tab control的树形控件,主要是为了解决标准Tab控件的限制,满足更多需求。
自绘树形控件,在DSkinLite界面库中以导出类dsTreeControl的形式提供,我们采用类似MFC/WTL 库CTreeCtrl的方式封装,用户将更加容易和使用dsTreeControl类。部分成员函数如下:
class DSKINDLL_API dsTreeControl{ public: dsTreeControl( void); virtual ~dsTreeControl( void); static dsTreeControl* CreateTreeWidget( HWND hwnd, LPCTSTR strStyle); enum { Item_Nor, Item_Over, Item_Checked } itemState; HTREEITEM GetChildItem( HTREEITEM hItem); int GetItemHeight( HTREEITEM hItem, UINT nState ); void SetItemHeight( HTREEITEM hItem , int nHeight, UINT nState); DWORD GetItemData( HTREEITEM hItem); void SetItemData( HTREEITEM hItem , DWORD dwData); HTREEITEM HitTest(CPoint pt ) const; BOOL GetItemRect( HTREEITEM hItem , LPRECT lpRect); int GetItemState( HTREEITEM hItem ); BOOL ItemHasChildren(HTREEITEM hItem) const; LPCTSTR GetItemText( HTREEITEM item ); HTREEITEM GetNextSiblingItem( HTREEITEM hItem); HTREEITEM GetParentItem( HTREEITEM hItem ); HTREEITEM GetPrevSiblingItem ( HTREEITEM hItem ); HTREEITEM GetRootItem(); HTREEITEM GetSelectedItem(); BOOL DeleteAllItems(); BOOL DeleteItem( HTREEITEM hItem ); BOOL Expand(HTREEITEM hItem, UINT nCode); HTREEITEM InsertItem(LPCTSTR lpszItem, HTREEITEM hParent); private: HWND m_hWnd;};
如您对此扩展控件树形有任何想法和建议,也欢迎您在我们博客留言,或者与我们Email联系。
DSkinLite除支持一般控件之外,还完整支持各种控件的内置滚动条。同时还采用可以配置listctrl,listbox,treectrl等控件的item内容的绘制,无需额外编写绘制代码。具体请参见:
同时针对Win32控件本身的一个局限,DSkinLite中加入了一些自绘的控件,来解决使用标准Win32控件无法解决的界面需求。详细了解,WidgetTree自绘控件,WidgetTab自绘控件。