Winapi Win32 TreeView选举后
快速提问 我正在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 }Winapi Win32 TreeView选举后,winapi,visual-c++,Winapi,Visual C++,快速提问 我正在win32(VC++)中使用treeview 我想删除为treeview提供的选择功能。有人能告诉我在树视图的Selecte事件之后发布了什么窗口消息吗 电视也有复选框。所以禁用鼠标点击不是一个选项 先谢谢你 - 瓦伦 更多信息 我被困在另一个地方。我的win32应用程序本质上是一个无模式对话框-使用CreateDialog和ShowWindow。换了电视后,当我返回1时,它不工作了。我想在我绕过windows消息之前会调用默认的wndproc。我现在该怎么办 删除为treevi
很抱歉格式不正确…我睡眠不足:-)我遇到了这个问题,并且在选择发生后立即将其反转。如果您对此没有反应,那么应该不会有任何副作用
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;
}