折分窗口中动态创建CTreeCtrl不能拖曳?需要特别熟悉控件消息机制的人回答。
在SDI工程,左边创建了一个DialogBar,里面放了一个CTreeCtrl控件,再在这个CtreeCtrl(父窗口)上动态创建一个派生子CTreeCtrl控件(子窗口),这个子CTreeCtrl控件无法实现拖曳,lbuttondown,lbuttonup,onmousemove都可以响应,唯独TVN_BEGINDRAG响应不了,而我新建一个基于对话框的工程,动态创建CtreeCTrl是可以实现的(直接在对话框上创建,而不是以另一个CtreeCtrl为父窗口创建)。 什么去掉CtreeCtrl的TVS_DISABLEDRAG之类的就不要说了,没那简单。
[解决办法]
我不清楚你怎么写的,我测试一下是可以的~
我测试代码大致如下:
- C/C++ code
CDialogBar派生类中定义一个InitDialogBar函数,在该函数中创建子CNewTreeCtrl(派生自CTreeCtrl控件)控件,然后在调用CNewTreeCtrl::InitChildTree()函数,CNewTreeCtrl::InitChildTree()函数中创建子控件的子控件void CNewDialogBar::InitDialogBar(){ // 在dialogbar控件中创建子树控件 ASSERT(GetSafeHwnd()); if(NULL == m_tree.GetSafeHwnd()) // m_tree变量为CNewTreeCtrl类型 { CRect rect; rect.SetRect(10, 10, 300, 200); m_tree.Create(WS_VISIBLE | WS_CHILD, rect, this, 0x11); m_tree.InitChildTree(); } m_tree.InsertItem(_T("AAA")); m_tree.InsertItem(_T("BBB"));}void CNewTreeCtrl::InitChildTree(){// 在父树控件中创建它自己的子树控件 ASSERT(GetSafeHwnd()); if(NULL == m_tree.GetSafeHwnd()) // m_tree定义为CTreeCtrl类型对象,定义为CNewTreeCtrl类的成员变量 { CRect rect; GetClientRect(&rect); rect.DeflateRect(CSize(10, 10)); m_tree.Create(WS_VISIBLE | WS_BORDER | WS_CHILD | TVS_FULLROWSELECT, rect, this, 0x111); m_tree.InsertItem(_T("DDDD")); m_tree.InsertItem(_T("EEEE")); }}// 这个是CNewTreeCtrl类的WM_NOTIFY消息响应函数,处理它子树的WM_BEGINDRAG消息BOOL CNewTreeCtrl::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { // TODO: Add your specialized code here and/or call the base class NMHDR* pHdr = (NMHDR*)lParam; ASSERT(NULL != pHdr); if(0x111 == wParam) { if((TVN_BEGINDRAGA == pHdr->code) || (TVN_BEGINDRAGW == pHdr->code)) AfxMessageBox(_T("DRAG")); } return CTreeCtrl::OnNotify(wParam, lParam, pResult);}