【问题标题】:Win32 TreeView AfterSelectionWin32 TreeView AfterSelection
【发布时间】:2014-01-04 06:08:03
【问题描述】:

快速提问...

我正在使用 win32 (VC++) 中的树视图。

我想删除为树视图提供的选择工具。谁能告诉在树视图的AfterSelect 事件上发布了什么窗口消息。

电视也有复选框。所以禁用鼠标点击不是一个选项......

提前谢谢...

- 瓦伦

更多信息 我被困在另一个地方。我的 win32 应用程序本质上是一个无模式对话框 - 使用 CreateDialog 和 ShowWindow。获得 TVN_SELCHANGING 后,当我返回 1 时,它不起作用。我认为在绕过 Windows 消息之前会调用默认的 wndproc。我现在该怎么办?

【问题讨论】:

  • 显然您需要 BeforeSelect 来阻止选择,AfterSelect 为时已晚。 TVN_SELCHANGING。

标签: winapi visual-c++


【解决方案1】:

我遇到了这个问题,只是在它已经发生后才反转选择。无论如何,如果你不回应它,那么应该不会有任何副作用。

case WM_NOTIFY:     
    {
        if(wParam == IDC_TREE_MC)
        {
            LPNMHDR lpnmh = (LPNMHDR) lParam;
            TVHITTESTINFO ht = {0};

            if ((lpnmh->code  == NM_CLICK) && (lpnmh->idFrom == IDC_TREE_MC)) // For Treeview Check Box Check Event
            {
                DWORD dwpos = GetMessagePos();

                ht.pt.x = GET_X_LPARAM(dwpos);
                ht.pt.y = GET_Y_LPARAM(dwpos);
                MapWindowPoints(HWND_DESKTOP, lpnmh->hwndFrom, &ht.pt, 1);

                TreeView_HitTest(lpnmh->hwndFrom, &ht);

                if(TVHT_ONITEMSTATEICON & ht.flags)
                    PostMessage(hDlg, UM_CHECKSTATECHANGE, (WPARAM)lpnmh->hwndFrom, (LPARAM)ht.hItem);
                else
                    TreeView_SelectItem(lpnmh->hwndFrom, NULL);
            }
            else if ((lpnmh->code  == TVN_SELCHANGED ) && (lpnmh->idFrom == IDC_TREE_MC))
                TreeView_SelectNode(lpnmh->hwndFrom, NULL);
        }
        break;
    }

【讨论】:

    【解决方案2】:

    删除为树视图提供的选择工具

    你能澄清一下吗?

    您想阻止用户更改选择吗?

    如果你真的想这样做,在父窗口中插入 WM_NOTIFY 案例处理程序,检查 NMTREEVIEW 代码成员(lParam 是指向 NMTREEVIEW 的指针)。

    如果代码是 TVN_SELCHANGING,如果您想阻止选择更改,则返回 1。 返回 0 将导致选择更改。

    【讨论】:

    • 是的,我不想在我的 TreeView 的任何节点上进行选择。获得 TVN_SELCHANGING 后,当我返回 1 时,它不起作用。我认为在绕过 Windows 消息之前会调用默认的 wndproc。我现在该怎么办?
    • 我不确定您如何在窗口过程中处理 WM_NOTIFY。我总是测试我的解决方案,它在我的应用程序中运行良好。你能贴出你的window proc的代码sn-p吗?
    • 我已经发布了 sn-p... 对于“究竟是什么不工作”,如果我返回 1...,选择仍然存在...
    【解决方案3】:

    int CALLBACK WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { hWndDialog = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, WndProc);

    if (hWndDialog != NULL)
    {
        ShowWindow(hWndDialog, SW_SHOW);
    }
    
    while(GetMessage(&Msg, NULL, 0, 0))
    {
        if(!IsDialogMessage(hWndDialog, &Msg))
        {
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
    }
    return 0;
    

    }

    INT_PTR CALLBACK WndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); 开关(消息) { 案例 WM_INITDIALOG: 返回 (INT_PTR)TRUE;

    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case IDC_BTN_REFRESH:
            RefreshButtonHandler();             
            break;
        case IDC_BTN_ADD_INSTALL:
            AddInstallBtnHandler();
            break;
        case IDOK:
        case IDCANCEL:
            DestroyWindow(hDlg);
            PostQuitMessage(0);
            return (INT_PTR)TRUE;
            break;  
        }
    case WM_NOTIFY:     
        {
            if(wParam == IDC_TREE_MC)
            {
                LPNMHDR lpnmh = (LPNMHDR) lParam;
                TVHITTESTINFO ht = {0};
    
                if ((lpnmh->code  == NM_CLICK) && (lpnmh->idFrom == IDC_TREE_MC)) // For Treeview Check Box Check Event
                {
                    DWORD dwpos = GetMessagePos();
    
                    ht.pt.x = GET_X_LPARAM(dwpos);
                    ht.pt.y = GET_Y_LPARAM(dwpos);
                    MapWindowPoints(HWND_DESKTOP, lpnmh->hwndFrom, &ht.pt, 1);
    
                    TreeView_HitTest(lpnmh->hwndFrom, &ht);
    
                    if(TVHT_ONITEMSTATEICON & ht.flags)
                        PostMessage(hDlg, UM_CHECKSTATECHANGE, (WPARAM)lpnmh->hwndFrom, (LPARAM)ht.hItem);
                    else
                        TreeView_SelectItem(lpnmh->hwndFrom, NULL);
                }
                else if ((lpnmh->code  == TVN_SELCHANGING ) && (lpnmh->idFrom == IDC_TREE_MC))
                    return (INT_PTR)TRUE;
            }
            break;
        }
    case UM_CHECKSTATECHANGE:
        {
            //Handle TreeView Check State Event
        }
        break;
    }
    return (INT_PTR)FALSE;
    

    }

    很抱歉格式错误...我睡眠不足:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多