- ベストアンサー
WindowsAPIのリストビューのチェックボックスでの質問
- 開発環境はVS.NET2003で、リストビューでチェックボックスを使っているが、チェックボックスを1つしかチェックできないようにしたい。
- 拡張スタイルであるLVS_EX_CHECKBOXESを指定してチェックボックスのあるリストビューを作成したが、チェックできるのが一つのみにしたい。
- LV_DISPINFO構造体を使ってメッセージを受け取るが、変更を行うべきかどうかわからない。ListCheckBoxクラスは使用しない方法を知りたい。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 WM_NOTIRYメッセージ内のLVN_ITEMCHANGEDで、以前クリックされたリスト項目に向かって、チェックを外す処理をするしかなさそうです。 http://msdn.microsoft.com/en-us/library/bb774845(VS.85).aspx flag = (pnmv->uNewState & LVIS_STATEIMAGEMASK)として、 flag == INDEXTOSTATEIMAGEMASK(1)が、チェック無し、 flag == INDEXTOSTATEIMAGEMASK(2)が、チェックありです。 同じチェックボックスをクリックされて、チェックが外れてしまった時の事は考えていませんが、大体以下の様な感じです。参考程度で。 case WM_NOTIFY: { static int _S_iOldItem = -1; LPNMLISTVIEW pnmv = (LPNMLISTVIEW)lParam; if(pnmv->hdr.idFrom == IDC_LISTVIEW1) { switch(pnmv->hdr.code) { case LVN_ITEMCHANGED: { const int iState = pnmv->uNewState & LVIS_STATEIMAGEMASK; //チェックされた if(iState == INDEXTOSTATEIMAGEMASK(2)) { //以前クリックされたアイテムからチェックを外す if(_S_iOldItem != -1) { LVITEM item = {sizeof(item)}; item.mask = LVIF_STATE; item.stateMask = -1; item.iItem = _S_iOldItem; ListView_GetItem(pnmv->hdr.hwndFrom, &item); item.state &= ~LVIS_STATEIMAGEMASK; item.state |= INDEXTOSTATEIMAGEMASK(1); ListView_SetItem(pnmv->hdr.hwndFrom, &item); } _S_iOldItem = pnmv->iItem; } } break; } } } break;
お礼
回答ありがとうございます。 お陰でチェックボックスのチェックを外すことができました。 uNewStateメンバにマスクをして、チェックされているかをINDEXTOSTATEIMAGEMASK(2)で 判定すればいいんですね。 ListView_SetCheckStateマクロを使ってもうまくいくみたいです。 ソースを載せてくださり本当に感謝しています。 ありがとうございます。m( )m