我已经创建了一个主窗口(CreateWindowEx),并使用WNDCLASSEXW设置了事件过程:
wcex.lpfnWndProc = WndProc;
。
接下来,我创建了一个用作树视图的子窗口:
HWND hwndTRV = CreateWindowEx(
WS_EX_CLIENTEDGE,
WC_TREEVIEW,
TEXT("Tree View"),
WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES | TVS_EDITLABELS,
0,
0,
rcClient.right,
rcClient.bottom,
hwndParent,
NULL,
hInstance,
NULL);
我想在单独的函数中处理树状视图的特定事件。我使用以下代码:
SetWindowLongPtr(hwndTRV, GWLP_WNDPROC, (LONG_PTR)TRVProc);
我应如何实施TRVProc?这是一个示例代码,TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT事件在TRVProc中不可见:
LRESULT CALLBACK TRVProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_NOTIFY:
{
LPNMHDR l = (LPNMHDR)lParam;
switch (l->code)
{
case TVN_BEGINLABELEDIT:
{
return 0;
}
case TVN_ENDLABELEDIT:
{
return 1;
}
}
}
}
return CallWindowProc(WndProc, hWnd, message, wParam, lParam);
}
消息循环看起来是这样的:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
根据文档,可以为树视图实施单独的事件过程:
使用
SetWindowLongPtr
索引调用GWLP_WNDPROC
会创建一个用于创建窗口的窗口类的subclass。一个应用程序必须将新窗口过程未处理的任何消息传递给通过调用CallWindowProc
来执行上一个窗口过程。这允许应用程序创建窗口程序链。
您要替换父窗口(hwndParent
)的默认窗口过程,而不是树形视图窗口(hwndTRV
)。因此相关的代码行将如下所示:
SetWindowLongPtr(hwndParent, GWLP_WNDPROC, (LONG_PTR)TRVProc);
另外,要接收TVN_BEGINLABELEDIT
和TVN_BEGINLABELEDIT
通知代码,您可能首先具有添加一些项目到树形视图中。然后,当您编辑项目的标签时,TVN_ENDLABELEDIT
将收到上述通知代码。有关如何添加某些项目的示例,请参阅TVN_ENDLABELEDIT
官方文档。