ツリービューのチェックボックスを押したときに処理をするには?


アリス  2006-10-20 08:20:19  No: 63376

VC6.0 + MFCで開発しています。

ツリービューにチェックボックスをつけているのですが、
そのチェックボックスにチェックをつけた場合、外した場合に
処理を行いたいのですがどのようにすればいいのでしょうか?

ツリービューの親のチェックボックスにチェックをいれたら、
子のすべてにチェックがつくような処理をおこないたいのです。

わかる方がいましたら教えてください。
よろしくお願いします。


瀬戸っぷ  2006-10-20 10:07:54  No: 63377

> ツリービューにチェックボックスをつけているのですが、
> そのチェックボックスにチェックをつけた場合、外した場合に
> 処理を行いたいのですがどのようにすればいいのでしょうか?

TVN_GETDISPINFO辺りでしょうか?

ググってみました。
http://www.google.co.jp/search?num=30&hl=ja&q=TVN_GETDISPINFO+%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja


Blue  2006-10-20 10:39:20  No: 63378

ダイアログアプリとすると、ツリーコントロールのクリックイベントで

void CXXXXDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
    // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    NMTREEVIEW *pNMTree = ( NMTREEVIEW* )pNMHDR;

    TVHITTESTINFO ht = {0};
    ht.pt = pNMTree->ptDrag;
    CTreeCtrl* pTree = ( CTreeCtrl* )this->GetDlgItem( IDC_TREE1 );
    pTree->HitTest( &ht );

    if ( TVHT_ONITEMSTATEICON & ht.flags )
    {
        AfxMessageBox( pTree->GetItemText( ht.hItem ) + _T( " Check!!" ) );
    }
    *pResult = 0;
}

とすると判定できるようです。

参考
[HOWTO] TreeView コントロールでユーザーがチェック ボックスをクリックしたときに通知を受け取る方法
http://support.microsoft.com/kb/261289/ja


Blue  2006-10-20 11:12:41  No: 63379

いろいろ試してみましたが、
>NMTREEVIEW *pNMTree = ( NMTREEVIEW* )pNMHDR;
>ht.pt = pNMTree->ptDrag;
では、うまくいかないようでした。

ですので、[HOWTO]のようにGetMessagePos→MapWindowPointsで位置を取得しないとダメっぽい。

void CXXXDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
    // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    NMTREEVIEW *pNMTree = ( NMTREEVIEW* )pNMHDR;
    TVHITTESTINFO ht = { 0 };
    CTreeCtrl* pTree = ( CTreeCtrl* )this->GetDlgItem( IDC_TREE1 );
    DWORD pos = ::GetMessagePos();
    ht.pt.x = LOWORD( pos );
    ht.pt.y = HIWORD( pos );
    ::MapWindowPoints( HWND_DESKTOP, pNMHDR->hwndFrom, &ht.pt, 1 );
    pTree->HitTest( &ht );

    if ( TVHT_ONITEMSTATEICON & ht.flags )
    {
        // チェックが入る時→チェックが入っていない状態
        if ( !pTree->GetCheck( ht.hItem ) )
        {
            HTREEITEM hItem = pTree->GetChildItem( ht.hItem );
            while ( hItem != NULL )
            {
                pTree->SetCheck( hItem );
                hItem = pTree->GetNextItem( hItem, TVGN_NEXT );
            }
        }
    }
    *pResult = 0;
}


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加