ユーザーが TreeView コントロールのチェック ボックスをクリックしたタイミングを確認する方法
この記事では、ユーザーが TreeView コントロールのチェック ボックスをクリックするタイミングを確認する方法について説明します。
元の製品バージョン: Visual C++
元の KB 番号: 261289
概要
TVS_CHECKBOXES スタイルの TreeView コントロールでは、アイテムのチェックされた状態が変更されたことを示す通知はありません。 また、アイテムの状態が変更されたことを示す通知もありません。 ただし、ユーザーがアイテムの状態アイコンをクリックし、それに基づいて操作したと判断できます。
TreeView で チェック ボックスの状態を切り替える方法
ユーザーが TreeView アイテムのチェック ボックスをクリックすると、NM_CLICK
通知が親ウィンドウに送信されます。 が発生すると、メッセージは を TVM_HITTEST
返します TVHT_ONITEMSTATEICON
。 TreeView コントロールでは、この同じ条件を使用して、チェック ボックスの状態を切り替えます。 残念ながら、TreeView コントロールは通知の送信後に状態を NM_CLICK
切り替えます。
ユーザーが [チェック] ボックスをクリックしたときに知るサンプル コード
通知を処理しているのと同じウィンドウにユーザー定義メッセージを NM_CLICK
投稿し、このユーザー定義メッセージを、チェックされた状態が変更されたことを通知として扱うことができます。 次のサンプル コードは、その実現方法を示しています。
#define UM_CHECKSTATECHANGE (WM_USER + 100)
case WM_NOTIFY:
{
LPNMHDR lpnmh = (LPNMHDR) lParam;
TVHITTESTINFO ht = {0};
if(lpnmh->code == NM_CLICK) && (lpnmh->idFrom == IDC_MYTREE))
{
DWORD dwpos = GetMessagePos();
// include <windowsx.h> and <windows.h> header files
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(hWnd, UM_CHECKSTATECHANGE, 0, (LPARAM)ht.hItem);
}
}
}
break;
case UM_CHECKSTATECHANGE:
{
HTREEITEM hItemChanged = (HTREEITEM)lParam;
/*
Retrieve the new checked state of the item and handle the notification.
*/
}
break
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示