如何继承 Windows 公共控件?
How to subclass Windows Common Controls?
我有问题。
我像这样子类化我的 TreeView:
SetWindowSubclass(hTV, SubClassProc, 0, 0);
其中 hTv - CreateWindowEx 生成的 WC_TREEVIEW window 句柄。
这是我的 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。
这在 window 主程序中处理。在这种情况下不需要子类。
检查 TVN_ITEMEXPANDED
,这是展开项目时收到的通知。如果您想扩展该项目,请发送 TVM_EXPAND
消息。
另请参阅:
- TreeView send Messages(示例:TVM_EXPAND
)
- TreeView receive Notifications(示例:TVN_ITEMEXPANDED
)
BOOL CALLBACK mainProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lParam)
{
switch (msg)
{
case WM_NOTIFY:
{
LPNMHDR hdr = (LPNMHDR)lParam;
if (hdr->hwndFrom == hWndTree && hdr->code == TVN_ITEMEXPANDED)
{
MessageBox(hwnd, _T("I'm expanded"), _T("TreeView"), MB_ICONINFORMATION);
break;
}
break;
}
...
}
我有问题。 我像这样子类化我的 TreeView:
SetWindowSubclass(hTV, SubClassProc, 0, 0);
其中 hTv - CreateWindowEx 生成的 WC_TREEVIEW window 句柄。 这是我的 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。
这在 window 主程序中处理。在这种情况下不需要子类。
检查 TVN_ITEMEXPANDED
,这是展开项目时收到的通知。如果您想扩展该项目,请发送 TVM_EXPAND
消息。
另请参阅:
- TreeView send Messages(示例:TVM_EXPAND
)
- TreeView receive Notifications(示例:TVN_ITEMEXPANDED
)
BOOL CALLBACK mainProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lParam)
{
switch (msg)
{
case WM_NOTIFY:
{
LPNMHDR hdr = (LPNMHDR)lParam;
if (hdr->hwndFrom == hWndTree && hdr->code == TVN_ITEMEXPANDED)
{
MessageBox(hwnd, _T("I'm expanded"), _T("TreeView"), MB_ICONINFORMATION);
break;
}
break;
}
...
}