我使用WinApi創建了一個樹視圖控件。我想捕獲鼠標點擊複選框。通知消息NM_CLICK包含NMHDR,它沒有關於被點擊的節點的信息。由於點擊的節點可能與選定的節點不同,因此應該找到一種方法來查找哪個節點已被選中或未選中,可能是HTREEITEM,或者在將項添加到樹視圖時插入lParam。我想要實時捕獲/取消選中。我如何指定哪個節點被選中/取消選中?任何幫助或鏈接表示讚賞。 mr.abzadeh如何捕獲點擊哪個treeview節點
回答
您可以發送TVM_HITTEST消息(或使用TreeView_HitTest宏)找到樹型視圖項目,給予客戶相對座標。
要在生成NM_CLICK
消息時獲取光標位置,請使用GetMessagePos API。
這使您可以監視控件客戶區中的任何鼠標點擊。如果您對標準樹視圖控件實現的結果感興趣,則可以改爲處理TVN_ITEMCHANGING或TVN_ITEMCHANGED通知。兩者都提供NMTVITEMCHANGE結構,其中hItem
標識要更改的項目,而lParam
則攜帶應用程序特定數據。
我想捕獲實時檢查/取消選中。我如何 指定哪個節點被選中/取消選中?
這個存在通知TVN_ITEMCHANGING和TVN_ITEMCHANGED - 尋找的NMTVITEMCHANGE
uStateNew
和uStateOld
成員 - 當樹視圖具有複選框(TVS_CHECKBOXES
風格),它使用狀態圖像列表2個圖像 - unchecked
和checked
。
所以state & TVIS_STATEIMAGEMASK
將0
當沒有複選框,INDEXTOSTATEIMAGEMASK(1)
爲未選中和INDEXTOSTATEIMAGEMASK(2)
爲檢查。基於這個信息,我們可以捕獲鼠標點擊複選框
通過使用TVN_ITEMCHANGING您還可以防止當您爲此通知返回TRUE時的更改。如果你只需要通知 - 使用TVN_ITEMCHANGED
case WM_NOTIFY:
{
union {
LPARAM lp;
NMTVITEMCHANGE *pnm;
NMHDR* phdr;
};
lp = lParam;
switch (phdr->code)
{
case TVN_ITEMCHANGING:
{
UINT CheckStateOld = pnm->uStateOld & TVIS_STATEIMAGEMASK;
UINT CheckStateNew = pnm->uStateNew & TVIS_STATEIMAGEMASK;
if (CheckStateNew != CheckStateOld)
{
PCSTR szstate = "??";
switch (CheckStateNew)
{
case INDEXTOSTATEIMAGEMASK(1):
szstate = "uncheck";
break;
case INDEXTOSTATEIMAGEMASK(2):
szstate = "check";
break;
}
DbgPrint("%p>%s\n", pnm->lParam, szstate);
}
}
return FALSE;
}
}
也讀How to Work With State Image Indexes
// Image 1 in the tree-view check box image list is the unchecked box. // Image 2 is the checked box. tvItem.state = INDEXTOSTATEIMAGEMASK((fCheck ? 2 : 1));
通知TVN_ITEMCHANGING和TVN_ITEMCHANGED從Windows Vista的可用開始。如果你還需要XP的支持 - 在xp只有選項使用@IInspectable solution
重要的是要提到TVN_ITEMCHANGING從Vista開始可用,否則OP必須使用hittesting。 – AlwaysLearningNewStuff
@AlwaysLearningNewStuff是的..,我想念這個。我的錯誤 – RbMm
不是一個錯誤,只是重要的一點。我已經提出了你的答案。 – AlwaysLearningNewStuff
- 1. 捕獲點擊TreeView項目
- 2. 如何確定哪個節點被點擊。 Silverlight treeview
- 3. Treeview節點點擊行爲
- 4. MVVM Treeview點擊節點
- 5. 選擇TreeView中的哪個節點(PySide)?
- 6. 在Treeview節點上綁定Gridview點擊
- 7. WPF TreeView使兒童節點可點擊
- 8. 的tabcontrol當用戶點擊TreeView節點
- 9. treeview節點點擊事件c#asp.net。
- 10. 點擊treeview節點打開Webbrowser表格
- 11. 檢測TreeView節點圖像點擊
- 12. C#treeView,當用戶單擊子節點時如何獲得父節點
- 13. 如何獲取KendoUI treeView中特定節點的節點值?
- 14. 識別treeview節點集合中點擊的節點
- 15. TreeView檢測如果用戶單擊父節點或子節點
- 16. 如何捕獲哪個標籤列表按鈕被點擊?
- 17. 如何打開wpf treeview中的點擊節點上的文件
- 18. C#TreeView節點
- 19. ASP.NET:如何選擇多個TreeView節點?
- 20. 如何獲得點擊哪個按鈕?
- 21. 在angular-ivh-treeview中選擇父節點時只捕獲葉節點
- 22. UIWebView - 捕獲點擊
- 23. 如何知道使用mvvm點擊哪個treeview項目
- 24. TreeView NodeMouseClick - 如何判斷點擊了哪個部分
- 25. Treeview C#點擊一個節點上出現的文本
- 26. 執行事件僅在點擊一個TreeView節點
- 27. 如何通過單擊節標題(Silverlight)來展開treeview節點
- 28. 如何在節點點擊
- 29. 獲取節點點擊
- 30. C#右鍵單擊TreeView節點
downvote作爲壞的和OP問題的有效解決方案 - 「我怎樣才能指定哪些節點被檢查/未選中? – RbMm
您在**之後已經添加了有關'TVN_ITEMCHANGING'和'TVN_ITEMCHANGED'通知**的信息我用自己的答案編寫了自己的答案 - 編輯歷史記錄可以看到這個答案。這是如何最低限度不好:) – RbMm
@RbMm:因爲你還沒有完全掌握,這個地方是如何工作的,請參加[遊覽]並訪問[幫助]。納入來自反饋意見的建議**是正確的做法。 – IInspectable