アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

開発環境はVS.NET2003です。
リストビューでチェックボックスを使っているのですが、
チェックボックスを1つしかチェックできないようにしたいのです。
リストビューの拡張スタイルであるLVS_EX_CHECKBOXESを指定してチェックボックスのあるリストビューを作成したのですが、チェックできるのが一つのみにしたいのです。
LVN、LVNIメッセージを調べたのですが、これに該当するものが見つからないためここで質問しました。
LV_DISPINFO構造体を使ってメッセージを受け取るのですが、ここで変更を行ったほうがいいんでしょうか?
C++とありましたが、ListCheckBoxクラスを使用していません。
このクラスを使用しない方法をお願いします。



 

A 回答 (1件)

 こんばんは。



 WM_NOTIRYメッセージ内のLVN_ITEMCHANGEDで、以前クリックされたリスト項目に向かって、チェックを外す処理をするしかなさそうです。
 http://msdn.microsoft.com/en-us/library/bb774845 …

 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;
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/01/16 15:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています