atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
frostar@wiki
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
frostar@wiki
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
frostar@wiki
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • frostar@wiki
  • チェックボックス付きリストビュー

frostar@wiki

チェックボックス付きリストビュー

最終更新:2013年11月16日 17:16

frostar

- view
管理者のみ編集可
リストビューにチェックボックスを付けるには拡張スタイルを使用する。
拡張スタイルを使用するにはComctl32.dll(ver4.70以降)を使用する。
Comctl32.dllを使用する際には、最初に初期化が必要である。
InitCommonControls();
実際にチェックボックスを付けるときは作成したリストビューにLVS_EX_CHECKBOXESスタイルを付ければいい。
ListView_SetExtendedListViewStyle(hList,ListView_GetExtendedListViewStyle(hList) | LVS_EX_CHECKBOXES);
hList:リストビューのハンドル
リストビューに付けられたチェックボックスの情報を取得するにはListView_GetCheckStateマクロを使用する。
ListView_GetCheckState(hList); //戻り値:BOOL チェックされていたらtrueを返す
逆にチェックを付けたり、外したりするときはListView_SetCheckStateマクロを使用する。
ListView_SetCheckState(hList,index,bool); 
index:操作を行う列
bool:trueならチェックする、falseなら外す
ただし、ListView_GetCheckStateマクロは定義されていないこともあるようなので、その時は自分でマクロを定義する。
#define ListView_SetCheckState(hwndLV, i, fCheck) \
  ListView_SetItemState(hwndLV, i, INDEXTOSTATEIMAGEMASK((fCheck)?2:1), LVIS_STATEIMAGEMASK)
#endif

しかし、この方法では列の先頭にしかチェックボックスを付けることができない。
いろいろな場所に付けたり複数付けるためにはオーナードローを使用する。
オーナードローを使うためにはまずListViewにLVS_OWNERDRAWFIXEDスタイルを付ける。
ListView_SetExtendedListViewStyle(hList,ListView_GetExtendedListViewStyle(hList) | LVS_OWNERDRAWFIXED);
そして目的のリストビューの親のプロシージャでWM_DRAWITEMメッセージが来たときに描画処理を行うことで実現できる。
case WM_DRAWITEM:
//描画処理
break;
描画処理の内容は以下のようになる。
LPDRAWITEMSTRUCT lpDraw = (LPDRAWITEMSTRUCT)lParam;//lParam:WM_DRAWITEMメッセージのlParam
HWND hList=lpDraw->hwndItem; //リストのハンドル
HDC hdc = lpDraw->hDC; //リストのデバイスコンテキスト
HBRUSH hBrush;//背景描画用ブラシ
char Text[256];//文字格納用

SaveDC(hdc);//デバイスコンテキストを保存
SetBkMode(hdc,OPAQUE);//デバイスコンテキストの設定(文字背景を不透過にする)
//背景色と文字色の設定
if (lpDraw->itemState & ODS_SELECTED) {//選択アイテムがあるなら強調表示
 hBrush=CreateSolidBrush (GetSysColor(COLOR_HIGHLIGHT));
 SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
 SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
}else{
 COLORREF Color=ListView_GetTextBkColor(hList);
 if(Color & 0xff000000) Color=GetSysColor(COLOR_WINDOW);
 hBrush=CreateSolidBrush (Color);
}
//アイテム数の取得
int SubItemNum=Header_GetItemCount(ListView_GetHeader(hList))-1;
//表示
for(SubItem=0;SubItem<=SubItemNum;SubItem++){
 //背景のクリア
 ListView_GetSubItemRect(hList,lpDraw->itemID,SubItem,LVIR_BOUNDS,&rc);	
 FillRect(hdc,&rc,hBrush); 
 ListView_GetSubItemRect(hList,lpDraw->itemID,SubItem,LVIR_LABEL,&rc);
 //アイテム情報の取得
 ListView_GetItemText(hList,lpDraw->itemID,SubItem,Text,sizeof(Text));
 //チェックボックス表示
 MoveWindow(hCheckBox,rc.left,rc.top,12,12,TRUE);
 rc.left+=12;//チェックボックスの大きさ分テキストをずらす
 rc.left+=2;//マージン
 DrawText(hdc,Text,strlen(Text),&rc,NULL);//テキスト描画
}
//ブラシの削除
DeleteObject(hBrush);
//デバイスコンテキストの復元
RestoreDC(hdc,-1);

hCheckBox:チェックボックスのハンドル

特定のアイテムだけにチェックボックスを表示させる場合はlpDraw->itemIDとSubItemなどの情報によって表示させる。
チェックボックスは表示させる数だけ必要であるが、この関数が呼び出されるたびに初期化すると、リストビューのアイテムが選択されたときに頻繁に処理が行われ、チェックボックスがちらつくため、アイテム追加時などに初期化を行い、グローバルな配列などに格納しておくのがよいだろう。

上述の方法では、チェックボックスをクリックしてもチェックがつかない。
チェックをつくようにするためには、サブクラス化を利用する。
リストの初期化時などに以下でリストビューのプロシージャをSetWindowLong関数でNewListViewProcに変更する。
OrgListViewProc = (WNDPROC) SetWindowLong(hList,GWL_WNDPROC, (LONG) NewListViewProc);
SetWindowLong関数の戻り値は元のプロシージャである。これは後で使用するためOrgListViewProcに格納しておく。
次に新しいプロシージャ(NewListViewProc)の中身を記述する。
OrgListViewProcはWNDPROC型である。
int CALLBACK NewListViewProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp){
 switch (msg){
  case WM_COMMAND:{
   SendMessage((HWND)lp,BM_SETCHECK,!SendMessage((HWND)lp,BM_GETCHECK,0,0),0);
   NMHDR nmhdr;
   ZeroMemory(&nmhdr,sizeof(NMHDR));
   nmhdr.idFrom = LOWORD(wp);
   nmhdr.hwndFrom = hWnd;
   nmhdr.code = LVN_ITEMCHANGED;
   SendMessage(GetParent(hWnd),WM_NOTIFY,LOWORD(wp),(LPARAM)&nmhdr);
  }
  return 0;
 }
 return CallWindowProc(OrgListViewProc,hWnd,msg,wp,lp);
}
チェックボックスがクリックされるとその親であるリストビューのプロシージャにWM_COMMANDメッセージが来る。メッセージが来たら、そのハンドルのチェック状態をBM_GETCHECKメッセージを送って調べ、その状態を反転してBM_SETCHECKで送って状態を設定している。
また、チェックが変更されたときにWM_NOTIFYでLVN_ITEMCHANGEDメッセージをリストビューの親ウィンドウに通知するようにしている。
オリジナルのメッセージを設定してもよいが、今回はLVS_EX_CHECKBOXESスタイルと同じように扱えるようにするため、このようにした。

以上を含んだライブラリを公開しています。
詳しくはここをどうぞ。
「チェックボックス付きリストビュー」をウィキ内検索
LINE
シェア
Tweet

[Amazon商品]


frostar@wiki
記事メニュー

メニュー

  • トップページ
  • プロフィール
  • コメント
    • 足跡
    • ツール
    • その他
  • 公開・更新状況について
作ったもの
  • 注意事項
  • TRPG支援ツール
    • SW2.0
      • キャラ管理ツールver2
      • 表出力ツール
      • 抽出ツール
    • でたとこサーガ
      • でたとこツール
    • 永い後日談のネクロニカ
      • キャラ管理ツール
    • その他
      • 2次元戦闘管理ツール
  • LimeChat2用マクロ
    • インストール・設定
    • 直線距離管理ツール
      • Reference
    • HPMPツール
      • Reference
    • 汎用ランダム出力ツール
      • Reference
    • 汎用デッキツール
      • Reference
  • ライブラリ
    • C++
      • ListViewEx

過去の遺物
  • ソフトの配布について
  • お手伝いについて
  • SW2.0
    • キャラ管理ツール
      • FAQ
    • GMツール
    • モンスターツール
  • DX3rd
    • キャラ管理ツール
  • 迷宮キングダム
    • キャラ管理ツール
    • まよきんダイス
  • それ以外
    • ADVスクリプタ
  • 作りたいもの
TRPG
  • コラム
    • コラムについて
    • TRPGとは
    • オンラインセッションについて
    • GM向け
      • GMを始める前に
      • シナリオの作り方
      • マスタリング
  • システム紹介
    • SW2.0
      • 基本ルールブック
      • データ系サプリメント
      • データ系サプリメント2
      • プレイヤーズハンドブック
      • シナリオ系サプリメント
      • ツアー系サプリメント
  • データ
    • SW2.0
      • モンスターデータ
プログラム
  • プログラムを始める人へ
  • プログラムメモ
    • データ構造
      • リスト構造
    • 時間計測
    • FPS管理
    • 数学関数
    • 文字列操作関数
      • strrep
    • 描画関数
      • TransparentAlphaBlt
      • RotateBlt
      • RotateTransparentAlphaBlt
      • 描画関数の時間比較
    • 知っておくと便利
    • コントロール
      • 色を変える
      • チェックボックス付きリストビュー
    • C++標準ライブラリ系
      • StringSplit
      • AccessIterator
      • Java風Iterator
    • winsock系
      • WebSocketサーバ
    • JavaScript系
      • JSONPででたとこのデータ取得
  • CodeIQ
    • 結城浩さんの問題
      • Bits
      • Nick
      • Scissors
    • Paiza Online Hackathon
      • 新人女子の書いたコードを直すやつ
リンク

自分関係

  • リンクについて
ここのページへのリンクについてはこちら
  • ブログ:幾星霜
TRPGのセッション記録とかメインのブログ
  • USTREAM:frostのプログラム雑談室
生配信チャンネル。プログラム<雑談
気が向いたときにやります
  • THE INTERVIEWS
個人的な質問に答えてます。

TRPG系

  • 月光華亭
お世話になっているオンラインセッションサイト
  • TRPG.NET
TRPGのことならここ!
IRCサーバなど、お世話になってます。
  • 屍少女たちの永い午睡(相互)
ネクロニカの支援サイトです。ツール開発やオンセもやっています。

プログラム系

  • 猫でもわかるプログラミング
初心者のためのプログラムのページ。WindowsSDKの方についても詳しく書いています。
  • 窓プログラミング
windowsSDKのテクニックがいろいろ書いてあります。
  • C/C++リファレンス
C++STL(標準テンプレートライブラリ)の日本語版リファレンスです。

@frost_star からのツイート

更新履歴

取得中です。


ここを編集
記事メニュー2
人気記事ランキング
  1. チェックボックス付きリストビュー
もっと見る
最近更新されたページ
  • 1974日前

    足跡
  • 3711日前

    JSONPででたとこのデータ取得
  • 3711日前

    メニュー
  • 3715日前

    でたとこサーガ支援ツール
  • 3715日前

    表出力ツール
  • 3716日前

    直線距離管理ツール
  • 3723日前

    直線距離管理ツール:Reference
  • 3723日前

    SW2.0キャラ管理ツールver2
  • 3802日前

    汎用ランダム出力ツール:Reference
  • 3802日前

    汎用デッキツール
もっと見る
人気記事ランキング
  1. チェックボックス付きリストビュー
もっと見る
最近更新されたページ
  • 1974日前

    足跡
  • 3711日前

    JSONPででたとこのデータ取得
  • 3711日前

    メニュー
  • 3715日前

    でたとこサーガ支援ツール
  • 3715日前

    表出力ツール
  • 3716日前

    直線距離管理ツール
  • 3723日前

    直線距離管理ツール:Reference
  • 3723日前

    SW2.0キャラ管理ツールver2
  • 3802日前

    汎用ランダム出力ツール:Reference
  • 3802日前

    汎用デッキツール
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. MadTown GTA (Beta) まとめウィキ
  2. GTA5 MADTOWN(β)まとめウィキ
  3. R.E.P.O. 日本語解説Wiki
  4. シュガードール情報まとめウィキ
  5. SYNDUALITY Echo of Ada 攻略 ウィキ
  6. ドタバタ王子くん攻略サイト
  7. ガンダムGQuuuuuuX 乃木坂46部@wiki
  8. パズル&コンクエスト(Puzzles&Conquest)攻略Wiki
  9. ありふれた職業で世界最強 リベリオンソウル @ ウィキ
  10. Idol Showdown(アイドルショーダウン)日本 @ ウィキ
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 初音ミク Wiki
  5. MadTown GTA (Beta) まとめウィキ
  6. 発車メロディーwiki
  7. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  8. 検索してはいけない言葉 @ ウィキ
  9. オレカバトル アプリ版 @ ウィキ
  10. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  2. 参加者一覧 - ストグラ まとめ @ウィキ
  3. 品川駅 - 発車メロディーwiki
  4. Famos Gray - ストグラ まとめ @ウィキ
  5. 参加者一覧 - MadTown GTA (Beta) まとめウィキ
  6. 発車メロディー変更履歴 - 発車メロディーwiki
  7. Lycoris - MadTown GTA (Beta) まとめウィキ
  8. オーバーモード/マスターモード(仮面ライダーガヴ) - アニヲタWiki(仮)
  9. FadeGate - ストグラ まとめ @ウィキ
  10. ぶんぶんギャング - MadTown GTA (Beta) まとめウィキ
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.