Vistaのデスクトップアイコンにチェックボックスを表示できますが、似たような操作性のものを作ってみました。
つまり、チェックボックスでも、Ctrlクリックでも複数選択ができるというものです。
Ctrlキーの状態によってチェックボックスへの反映を止めているのがポイントで、これをしないとCtrl+スペースが押された時に選択できなくなります。
WM_NOTIFY処理の抜粋
つまり、チェックボックスでも、Ctrlクリックでも複数選択ができるというものです。
Ctrlキーの状態によってチェックボックスへの反映を止めているのがポイントで、これをしないとCtrl+スペースが押された時に選択できなくなります。
WM_NOTIFY処理の抜粋
case LVN_ITEMCHANGED:
pnmlist = (LPNMLISTVIEW)lParam;
if ( ( pnmlist->uNewState & LVIS_STATEIMAGEMASK ) == 0 ) {
SHORT ctrlState = GetKeyState( VK_CONTROL );
if ( ListView_GetItemState( hList, pnmlist->iItem, LVIS_SELECTED ) ) {
if ( ( ctrlState >= 0 ) ||
( ( ctrlState < 0 ) && ( !ListView_GetItemState( hList, pnmlist->iItem, LVIS_FOCUSED ) ) ) ) {
ListView_SetCheckState( hList, pnmlist->iItem, TRUE );
}
}
else {
if ( ( ctrlState >= 0 ) ||
( ( ctrlState < 0 ) && ( !ListView_GetItemState( hList, pnmlist->iItem, LVIS_FOCUSED ) ) ) ) {
ListView_SetCheckState( hList, pnmlist->iItem, FALSE );
}
}
}
else {
if ( ( pnmlist->uNewState & LVIS_STATEIMAGEMASK ) == INDEXTOSTATEIMAGEMASK(2) ) {
ListView_SetItemState( hList, pnmlist->iItem, LVIS_SELECTED, LVIS_SELECTED );
}
else {
ListView_SetItemState( hList, pnmlist->iItem, 0, LVIS_SELECTED );
}
}
break;
コメントする