为什么这样做,CDialogBar的关于其子窗体产生事件的处理函数得不到执行?? 急盼回音...
eEric 2004-10-05 05:01:55 创建一CDialogBar派等类ZOnlineBar, 并为其添加一CTreeCtrl类型的成员对象m_wndTreeCtrl, 并在ZOnlineBar::OnCreate()中调用
CTreeCtrl::CreateEx()和CTreeCtrl::InsertItem()。
在CMainFrame::OnCreate()中 'Create' ZOnlineBar实例m_wndOlBar。
程序运行后,DialogBar和TreeCtrl的窗体显示一切正常, 但鼠标点击m_wndTreeCtrl的不同的item时,负责处理TVN_SELCHANGED消息的ZOnlineBar::OnTvnSelchangedTree1()却得不到执行,为什么 ??
但如果我通过资源编辑器在'dialog template' IDD_DIALOGBAR上拖放一个Tree Control(而不是手工 'Create' 一个m_wndTreeCtrl),并且通过VC自动生成的事件处理函数,却是能够响应TVN_SELCHANGED。我查看了自动生成的响应TVN_SELCHANGED消息的那部分代码,除了id外,与我手工添加的代码基本是一样的,不知这是什么原因 ??????
(平台为winxp sp1 + vs.net 2003 )
代码如下:
class ZOnlineBar : public CDialogBar
{
DECLARE_DYNAMIC(ZOnlineBar)
public:
ZOnlineBar();
virtual ~ZOnlineBar();
protected:
DECLARE_MESSAGE_MAP()
public:
CTreeCtrl m_wndTreeCtrl;
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult);/* 手工添加*/
};
BEGIN_MESSAGE_MAP(ZOnlineBar, CDialogBar)
ON_WM_CREATE()
ON_NOTIFY(TVN_SELCHANGED, 0x1005, OnTvnSelchangedTree1) /* 手工添加 */
END_MESSAGE_MAP()
int ZOnlineBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogBar::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rect;
GetClientRect(&rect);
m_wndTreeCtrl.CreateEx(WS_EX_STATICEDGE,
WS_VISIBLE | WS_TABSTOP | WS_CHILD | TVS_CHECKBOXE
|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_HASLINES|TVS_DISABLEDRAGDROP,
rect, this, 0x1005);
HTREEITEM ht0 = m_wndTreeCtrl.InsertItem("root");
HTREEITEM ht1 = m_wndTreeCtrl.InsertItem("home", ht0);
/* ... */
return 0;
}
void ZOnlineBar::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
/* ... */
*pResult = 0;
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
/* ...*/
/* ZOnlineBar m_wndOlBar; */
m_wndOlBar.Create(this, IDD_DIALOGBAR, CBRS_LEFT|CBRS_TOOLTIPS|CBRS_FLYBY, IDD_DIALOGBAR);
/* ...*/
}