【问题标题】:How to handle click events on a Windows treeview items如何处理 Windows 树视图项目上的点击事件
【发布时间】:2015-12-01 22:49:15
【问题描述】:

如何处理在 MS Windows 树视图中单击的单个项目?

我的 windows proc 有:

LRESULT CALLBACK WndProcTreeView(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
PAINTSTRUCT paintStruct;
HDC hDC;

switch (message)
{
case WM_PAINT:
{
    hDC = BeginPaint(hwnd, &paintStruct);
    EndPaint(hwnd, &paintStruct);
    break;
}

case WM_NOTIFY:
{
    switch (reinterpret_cast<LPNMHDR>(lParam)->code) {
    case NM_CLICK:
        MessageBox(nullptr, "click", "click", MB_OK);
    }
}
default:
{
    return DefWindowProc(hwnd, message, wParam, lParam);
    break;
}
}

当我单击树视图控件时会输出一个消息框。如何处理单个元素?

将树视图项添加到列表的示例:

std::string vTxt = std::string("Vertex count : ") + std::to_string(mesh.v.size());
tvinsert.hInsertAfter = mesh_items[mesh_items.size() - 1];
tvinsert.hParent = mesh_items[mesh_items.size() - 1];
tvinsert.item.mask = TVIF_TEXT;
tvinsert.item.pszText = (LPSTR)vTxt.c_str();
mesh_items_sub.push_back((HTREEITEM)SendMessage(hwnd, TVM_INSERTITEM, 0, (LPARAM)&tvinsert));

我已经看到使用 SendDlgItemMessage 代替(它在 windows proc 中提供了一个 ID 为 LOWORD(wParam)),但它需要在资源文件中设置 ID - 我不知道如何创建。

【问题讨论】:

  • 我刚刚解决了我的问题(确实使用了TVN_SELCHANGED),但真正的问题是我为我的每个项目设置了tvinsert.item.mask = TVIF_TEXT;,这会阻止任何lparam 代码传递给window proc ...愚蠢的meh...:|

标签: windows c++11 winapi treeview


【解决方案1】:

我的代码需要做两件事:首先给每个项目一个 lparam 值并将 TVIF_TEXT 作为项目的掩码更改为 TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAMTVIF_PARAM 允许将 lparam 传递给窗口 proc 因此识别控制器)。

工作代码摘录:

TV_INSERTSTRUCT tvinsert;
// ...
tvinsert.hInsertAfter = Root;
tvinsert.hParent = Root;
tvinsert.item.pszText = std::string("some text...").c_str();
tvinsert.item.lParam = ID_SOME_ID; // << #defined constant or plain int
tvinsert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
root_sub.push_back((HTREEITEM)SendMessage(hwnd, TVM_INSERTITEM, 0, (LPARAM)&tvinsert));

// window proc code below
LRESULT CALLBACK WndProcTreeView(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    PAINTSTRUCT paintStruct;
    HDC hDC;

    switch (message)
    {
    case WM_PAINT:
    {
        hDC = BeginPaint(hwnd, &paintStruct);
        EndPaint(hwnd, &paintStruct);
        break;
    }

    case WM_NOTIFY:
    {
        LPNM_TREEVIEW pntv = (LPNM_TREEVIEW)lParam;

        if (pntv->hdr.code == TVN_SELCHANGED) {

            switch (pntv->itemNew.lParam) {

            case ID_SOME_ID:
                std::cout << "ID_SOME_ID selected caught here..." << std::endl;
                break;
            }
        }
    }
    default:
    {
        return DefWindowProc(hwnd, message, wParam, lParam);
        break;
    }
    }

    return 0;
}

这里有很好的解释/例子(法语)http://chgi.developpez.com/windows/treeview/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2017-09-03
    • 1970-01-01
    相关资源
    最近更新 更多