65.9K
CodeProject 正在变化。 阅读更多。
Home

一个类似 Visual Studio 中参数列表控件的浮点树控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.44/5 (6投票s)

2002年4月10日

1分钟阅读

viewsIcon

136655

downloadIcon

2617

在 Visual Studio 中,当你输入代码时,IDE 会显示一个自动补全列表。这个控件与之类似,但使用树形结构。

Sample Image - FloatTreeControl.gif

引言

当我们使用 Visual Studio 时,有一个自动补全列表帮助我们完成函数参数信息或类函数名。我遇到一个需求,用户应该能够从树形控件中选择一些词语来完成编辑器中的当前位置。因此,我创建了这个控件。

它是如何工作的?

该控件公开地继承自 CTreeCtrl。你可以使用 CreateTree 函数,并提供大小、父窗口和可选的位图图标来创建它。当需要显示控件时,只需使用成员函数 ShowMe,使用默认参数即可。当你双击树形项目时,树形控件的窗口将会关闭,并向父窗口发送一条消息,其中包含选定的 字符串

协议(Prototypes)

class CXMLTreeCtrl : public CTreeCtrl
{
public:
    // Create a new tree 
    // rect: size of tree control will be displayed.
    // parent: the parent windows
    // image: resource code for an image as icons will be displayed in the 
    //        tree control
    BOOL CreateTree(CRect rect,CWnd *parent,UINT image=0);
    
    // Display the tree control, auto wrapped will encounter the edge of 
    // parent window
    // pt: The top-left point of window, may be changed when edge of parent 
    // window encounter
    // show: SW_SHOW for show current tree, SW_HIDE to hide the control
    void ShowMe(CPoint &pt,int show=SW_SHOW);
    
    // Set the image resource as a serial of icons in the control
    // resource , the image resource.
    void SetImages(UINT resource);
    
    // To load XML as the tree item to initialize the tree control
    // strPathName: the file name saves the data of tree in XML format
    // bOptimizeMemory: How to draw the tree's item.
    BOOL loadXML(const CString &strPathName, 
                 const BOOL bOptimizeMemory /*= FALSE*/);

    // The following code is borrowed from Frank Le for XML tree 
    // construction
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;
   
    // Generated message map functions
protected:
    //{{AFX_MSG(CXMLTreeCtrl)
    afx_msg void OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult);
    // User select a item , close the control and return what he/she selected.
    afx_msg void OnDblclk(NMHDR* pNMHDR, LRESULT* pResult);
    // If user point out the control when it is shown, close it
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    //}}AFX_MSG

如何使用?

使用此代码非常简单。首先,声明一个成员变量为 CXMLTreeCtrl 类型,并使用 Create 函数创建它。

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);
}

其次,重写 WM_LBUTTONUP 或其他刺激事件,使用 ShowMe 函数显示树形控件。

void CVs_treectrlView::OnLButtonUp(UINT nFlags, CPoint point) 
{
    m_Tree.ShowMe (point);
    CView::OnLButtonUp(nFlags, point);
}

最后,处理 WM_FLOAT_CTRL 消息,以执行从树形控件中选择的操作。

LRESULT CVs_treectrlView::OnFloatCtrl(WPARAM wParam, LPARAM lParam)
{
    CString str = (BSTR)wParam;
    MessageBox(str);
    m_Tree.ShowWindow (SW_HIDE);
    return 0;
}

就这样!尽情享受吧。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.