【发布时间】:2015-08-16 07:48:35
【问题描述】:
我有问题。 我像这样子类化我的 TreeView:
SetWindowSubclass(hTV, SubClassProc, 0, 0);
其中 hTv - 由 CreateWindowEx 生成的 WC_TREEVIEW 窗口句柄。 这是我的 SubClassProc:
LRESULT CALLBACK SubClassProc(HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
switch (uMsg)
{
case TVM_EXPAND:
// This line of code is never executed
MessageBox(NULL, _T("I'm expanded"), _T("TreeView"), MB_ICONINFORMATION);
break;
case WM_NCDESTROY:
RemoveWindowSubclass(hWnd, SubClassProc, uIdSubclass);
break;
}
return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}
为什么我不能处理 TVM_EXPAND 消息?我的代码有什么问题?
我上传了我的项目here。
【问题讨论】:
-
不清楚您在问什么,但我想您想知道为什么当您单击 + 号以展开树的分支时看不到
TVM_EXPAND。这是因为树不会将TVM_EXPAND发送给它自己。如果您想捕获 all 扩展,则需要对树的 parent 进行子类化并注意TVN_ITEMEXPANDING通知消息。 -
好的,我去试试。但是除了树视图控件,还有谁可以收到
TVM_EXPAND?如果我是发件人(或其他任何人),则必须有人处理此邮件。 -
@Jonathan Potter,请将您的评论格式化为答案。从技术上讲,它工作正常。但是语义呢?现在,我仍然是一个独立的控件,但我的父母似乎不是这样。如果其他人在我之后/之前打电话给
SetWindowSubclass怎么办?那会发生什么? -
SetWindowSubclass为您处理,无需担心。 -
正如用户 IInspectable 所指出的,我已经尝试处理树展开/折叠节点时的所有其他情况,但这太过分了。我会强烈建议您按照其他答案建议的方式做事 -> 通过通知消息。我已经删除了我的答案,以免误导其他有同样问题的读者。如果您仍然希望继续“我的方式”,请发表评论,我将取消删除答案。最好的问候。
标签: c user-interface winapi subclassing