VC6.0 + MFCで開発しています。
ツリービューにチェックボックスをつけているのですが、
そのチェックボックスにチェックをつけた場合、外した場合に
処理を行いたいのですがどのようにすればいいのでしょうか?
ツリービューの親のチェックボックスにチェックをいれたら、
子のすべてにチェックがつくような処理をおこないたいのです。
わかる方がいましたら教えてください。
よろしくお願いします。
> ツリービューにチェックボックスをつけているのですが、
> そのチェックボックスにチェックをつけた場合、外した場合に
> 処理を行いたいのですがどのようにすればいいのでしょうか?
TVN_GETDISPINFO辺りでしょうか?
ダイアログアプリとすると、ツリーコントロールのクリックイベントで
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
いろいろ試してみましたが、
>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;
}
ツイート | ![]() |