Kullanıcının TreeView denetimindeki bir onay kutusuna ne zaman tıkladığında nasıl bilgi edinersiniz?

Bu makalede, kullanıcının TreeView denetimindeki bir onay kutusuna ne zaman tıkladığı açıklanır.

Orijinal ürün sürümü: Visual C++
Özgün KB numarası: 261289

Özet

TVS_CHECKBOXES stiline sahip bir TreeView denetiminde, öğenin denetlenen durumunun değiştirildiğine dair bir bildirim yoktur. Ayrıca öğenin durumunun değiştiğini belirten bir bildirim de yoktur. Ancak, kullanıcının öğenin durum simgesine tıkladığını belirleyebilir ve bunun üzerinde işlem yapabilirsiniz.

TreeView onay kutusunun durumunu nasıl değiştirir?

Kullanıcı bir TreeView öğesinin onay kutusuna tıkladığında, üst pencereye bir NM_CLICK bildirim gönderilir. Bu gerçekleştiğinde TVM_HITTEST , ileti döndürür TVHT_ONITEMSTATEICON. TreeView denetimi, onay kutusunun durumunu değiştirmek için aynı koşulu kullanır. Ne yazık ki, TreeView denetimi bildirim gönderildikten sonra NM_CLICK durumu değiştirir.

Kullanıcıların bir onay kutusuna tıkladığında bilmeniz gereken örnek kod

Kullanıcı tanımlı bir iletiyi bildirimi işleyen NM_CLICK pencereye gönderebilir ve bu kullanıcı tanımlı iletiyi, denetlenen durumun değiştiğini belirten bir bildirim olarak değerlendirebilirsiniz. Aşağıdaki örnek kod, bunun nasıl gerçekleştirilebileceğini gösterir.

#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