Introduction
When we are typing in Visual Studio, there is an auto-completion list for us to complete the parameter information for the function we typed or function names for a class. I encountered a requirement that the user should be able to select some words from a tree control to complete the current place in the editor. So I created this control.
How Does It Work?
The control is publicly derived from CTreeCtrl
. You can create it using CreateTree
with the size, parent window and optional bitmap icons. When you need to display the control, simply use the member function ShowMe
with default parameters. When you double-click on a tree item, the window of the tree control will be closed and it will send a message to the parent window with selected string
.
Prototypes
class CXMLTreeCtrl : public CTreeCtrl
{
public:
BOOL CreateTree(CRect rect,CWnd *parent,UINT image=0);
void ShowMe(CPoint &pt,int show=SW_SHOW);
void SetImages(UINT resource);
BOOL loadXML(const CString &strPathName,
const BOOL bOptimizeMemory );
protected:
BOOL populateNode(MSXML::IXMLDOMElement* node, const HTREEITEM& hItem);
BOOL populateAttributes(MSXML::IXMLDOMElement *node, const HTREEITEM &hParent);
HTREEITEM insertItem(MSXML::IXMLDOMElement* node,
const CString &nodeName,
int nImage, int nSelectedImage,
HTREEITEM hParent = TVI_ROOT,
HTREEITEM hInsertAfter = TVI_LAST);
void deleteFirstChild(const HTREEITEM& hItem);
void deleteAllChildren(const HTREEITEM& hItem);
int getIconIndex(MSXML::IXMLDOMElement* node);
CImageList m_theImageList;
BOOL m_bOptimizeMemory;
protected:
afx_msg void OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDblclk(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
How to Use It?
Using this code is very simple. First, declare a member variable as CXMLTreeCtrl
and Create
it.
void CVs_treectrlView::OnInitialUpdate()
{
CView::OnInitialUpdate();
CRect rect(0,0,200,300);
m_Tree.CreateTree (rect,this,IDB_BITMAP_TREE_ICONS);
m_Tree.loadXML("catalog.xml",TRUE);
}
Secondly, override the WM_LBUTTONUP
or some other stimulus to display the tree control using ShowMe
function.
void CVs_treectrlView::OnLButtonUp(UINT nFlags, CPoint point)
{
m_Tree.ShowMe (point);
CView::OnLButtonUp(nFlags, point);
}
Finally, deal the message WM_FLOAT_CTRL
to do what you have selected from tree control.
LRESULT CVs_treectrlView::OnFloatCtrl(WPARAM wParam, LPARAM lParam)
{
CString str = (BSTR)wParam;
MessageBox(str);
m_Tree.ShowWindow (SW_HIDE);
return 0;
}
That's all! Enjoy it.
License
This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.
A list of licenses authors might use can be found here.