• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文: WindowsAPIのリストビューのチェックボックスでの質問 )

WindowsAPIのリストビューのチェックボックスでの質問

このQ&Aのポイント
  • 開発環境はVS.NET2003で、リストビューでチェックボックスを使っているが、チェックボックスを1つしかチェックできないようにしたい。
  • 拡張スタイルであるLVS_EX_CHECKBOXESを指定してチェックボックスのあるリストビューを作成したが、チェックできるのが一つのみにしたい。
  • LV_DISPINFO構造体を使ってメッセージを受け取るが、変更を行うべきかどうかわからない。ListCheckBoxクラスは使用しない方法を知りたい。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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;

dotneer
質問者

お礼

回答ありがとうございます。 お陰でチェックボックスのチェックを外すことができました。 uNewStateメンバにマスクをして、チェックされているかをINDEXTOSTATEIMAGEMASK(2)で 判定すればいいんですね。 ListView_SetCheckStateマクロを使ってもうまくいくみたいです。 ソースを載せてくださり本当に感謝しています。 ありがとうございます。m( )m

関連するQ&A