About CTreeView and CTreeCtrl
Hi there,
I would like to apply a derived CTreeCtrl in CMyTreeView which is
derived from CTreeView. For that purpose, I refer to the following
articles
http://www.codeguru.com/doc_view/custom_view.shtml
http://www.codeguru.com/doc_view/Control2View.shtml
My code of my code are:
class CMyTreeView : public CTreeView
{
protected:
CMyTreeView ();
DECLARE_DYNCREATE(CMyTreeView )
public:
CMyDoc* GetDocument();
CMyTreeCtrl& GetTreeCtrl() const;
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual ~CMyTreeView ();
protected:
virtual void OnInitialUpdate(); // called first time after construct
CMyTreeCtrl m_TreeCtrl;
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType, int cx, int cy);
};
// OnCreate and OnSize are implemented as follow
IMPLEMENT_DYNCREATE(CDragView, CTreeView)
BEGIN_MESSAGE_MAP(CMyTreeView, CTreeView)
//{{AFX_MSG_MAP(CMyTreeView)
ON_WM_CREATE()
ON_WM_SIZE()
END_MESSAGE_MAP()
CMyTreeCtrl& CMyTreeView::GetTreeCtrl() const
{
return (CMyTreeCtrl &)CTreeView::GetTreeCtrl();
}
int CMyTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeView::OnCreate(lpCreateStruct) == -1) return -1;
DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP;
BOOL bResult = m_TreeCtrl.Create(dwStyle, CRect(0,0,0,0), this,
IDC_TREEVIEW);
return (bResult ? 0 : -1);
}
void CMyTreeView::OnSize(UINT nType, int cx, int cy)
{
CTreeView::OnSize(nType, cx, cy);
if (::IsWindow(m_TreeCtrl.m_hWnd)) m_TreeCtrl.MoveWindow(0, 0, cx,
cy, TRUE);
}
Here, CMyTreeCtrl is a class derived from CTreeCtrl, as follow
class CMyTreeCtrl : public CTreeCtrl
{
public:
CMyTreeCtrl ();
virtual ~CMyTreeCtrl ();
protected:
afx_msg void OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
afx_msg void OnRclick(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnBeginrdrag(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
afx_msg void OnContextCmd(UINT uID);
afx_msg void OnDragContextCmd(UINT uID);
DECLARE_MESSAGE_MAP()
};
Note that this class is developed to handle the drag and drop issue
(the original code is from codeproject.com, Full-Featured Tree
Control, By J=F6rg K=F6nig. )
So far, everything is all right. I am sure the CMyTreeView recognize
the derived CMyTreeCtrl. I have also written a simple code to test if
CMyTreeView can show the tree view properly. It does, of course!
However, I found that ALMOST all messaged defined in CMyTreeCtrl will
not be catched within CMyTreeCtrl, so that the function of drag&drop
doesn't work. I am wondering how to notify CMyTreeCtrl the messages?
By the way, strangely enough, I found CMyTreeCtrl does catch the
messages of OnCntextCmd and OnDragContext, what's going on?
Thanks in advance.