Winapi Win32 TreeView选举后

Winapi Win32 TreeView选举后,winapi,visual-c++,Winapi,Visual C++,快速提问 我正在win32(VC++)中使用treeview 我想删除为treeview提供的选择功能。有人能告诉我在树视图的Selecte事件之后发布了什么窗口消息吗 电视也有复选框。所以禁用鼠标点击不是一个选项 先谢谢你 - 瓦伦 更多信息 我被困在另一个地方。我的win32应用程序本质上是一个无模式对话框-使用CreateDialog和ShowWindow。换了电视后,当我返回1时,它不工作了。我想在我绕过windows消息之前会调用默认的wndproc。我现在该怎么办 删除为treevi

快速提问

我正在win32(VC++)中使用treeview

我想删除为treeview提供的选择功能。有人能告诉我在树视图的Selecte事件之后发布了什么窗口消息吗

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

先谢谢你

- 瓦伦

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

删除为treeview提供的选择功能

你能澄清一下吗

是否要阻止用户更改选择

如果确实要这样做,请在父窗口中插入WM_NOTIFY case handler,检查NMTREEVIEW代码成员(lParam是指向NMTREEVIEW的指针)

如果代码为TVN_SELCHANGING,如果要防止选择更改,请返回1。 返回0将改变所有选择

int回调WinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、LPSTR lpCmdLine、int nCmdShow) { hWndDialog=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MAIN),NULL,WndProc)

}

INT_PTR回调WndProc(HWND hDlg、UINT消息、WPARAM WPARAM、LPARAM LPARAM) { 未引用的_参数(lpram); 开关(信息) { 案例WM_初始化对话框: 返回(INT_PTR)TRUE

}


很抱歉格式不正确…我睡眠不足:-)

我遇到了这个问题,并且在选择发生后立即将其反转。如果您对此没有反应,那么应该不会有任何副作用

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;
    }

显然,您需要BeforeSelect来阻止选择,BeforeSelect将太迟。TVN_SELCHANGING。是的,我不希望在我的树视图的任何节点上进行选择。在获取TVN_SELCHANGING后,当我返回1时,它不起作用。我想默认的wndproc将在我绕过windows消息之前被调用。我现在该怎么办?我不确定你如何在你的窗口过程中处理WM_NOTIFY。我总是测试我的解决方案,它在我的应用程序中运行良好。你能发布你的窗口过程的代码片段吗?我已经发布了代码片段…对于“到底什么不起作用”,如果我返回1,选择仍然存在。。。
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;
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;
    }