チェックボックス付きのリストボックスはどう作るの?

解決


ぴょぴょ  2007-07-22 23:00:36  No: 65795

始めまして「ぴょぴょ」です。
VC++2003 で Win32 API と SDK で作っています。

エクスプローラのメニューから「表示」→「詳細表示の設定」を選択すると
チェックボックスの付いたリストボックスが出ますよね。
あれってどうやればいいのでしょうか?

一生懸命調べたらオーナードローすれば出来るところまで突き止めました。
でもその先が分かりません。
つまりどうやってチェックボックスの四角形を描画すれば良いのですか?
普通に四角形を描画したら XP スタイルの四角形と違うのですが。
分かる方がいましたら教えて下さい。
お願いします。


ななし  2007-07-23 05:07:49  No: 65796

ぼけ!自分で考えろ!頭わりーんだよ。オメーはw


ヤマ猫  2007-07-23 05:27:11  No: 65797

・・・・
ななしさんそんな言い方は失礼じゃないんですか?


どら  2007-07-23 06:46:52  No: 65798

この場合、リストボックスではなくてリストビューコントロールになります。
リストビューのではチェックボックスなど、様々なスタイルを

   ListView_SetExtendedListViewStyle

で設定できますよ^^
これをMSDNなどで調べてみてください。


瀬戸っぷ  2007-07-23 10:13:12  No: 65799

> ヤマ猫さん

相手にするだけ無駄なのでスルーしましょう。
# 学生は夏休みに入ったようですね。

Spy++で確認すると…
確かにListViewですね。
Report形式でサブアイテムなしなんでしょう。
サブアイテムなしだと、確かにリストボックスっぽく見えますね。

# MFCだとCheckedListBoxなんてのもあるようですが…


RAPT  URL  2007-07-23 11:03:20  No: 65800

> # MFCだとCheckedListBoxなんてのもあるようですが…
# WTL だと CCheckListViewCtrl なるものがあります。


ぴょぴょ  2007-07-23 19:49:21  No: 65801

>ななし 2007/07/22(日) 20:07:49 
>ぼけ!自分で考えろ!頭わりーんだよ。オメーはw
ボケ!でごめんなさい。
でもななしさんはリストボックスでチェックボックスを
XP スタイルと同じようにつける方法は分かるのですか?

他の書き込みを読み補足すべき点が1つあったようです。
それはリストビューならチェックボックスを付けられることは
既に知っていますので。なのでリストボックスでつける方法を
知りたかったのです。

ななしさんはボケではないと思うのでぜひななしさんから
教えて欲しいです。待ってます。
もちろん他の人でもかまいませんが…。

>ヤマ猫 2007/07/22(日) 20:27:11 
>・・・・
>ななしさんそんな言い方は失礼じゃないんですか?
この人の個性です。多分。もしくは品格でしょうね。

>どら 2007/07/22(日) 21:46:52 
>この場合、リストボックスではなくてリストビューコントロールになります。
ありがとうございます。

>瀬戸っぷ [E-Mail] 2007/07/23(月) 01:13:12 
>Report形式でサブアイテムなしなんでしょう。
>サブアイテムなしだと、確かにリストボックスっぽく見えますね。
サブアイテムなしも検討してみます。
この方法は簡単に思いつきましたので。

>RAPT [HomePage] 2007/07/23(月) 02:03:20 
>> # MFCだとCheckedListBoxなんてのもあるようですが…
># WTL だと CCheckListViewCtrl なるものがあります。
最近 WTL を知りました。
これからの参考とします。
ありがとう御座いました。

ななしさん。
待っていますよ。


ぴょぴょ  2007-07-23 20:07:17  No: 65802

この質問はリストビューのサブアイテムなしでリストボックスっぽく
見えるような使い方で問題を解決するように決めました。

でも技術的な事として質問を続行します。
今度は本当にリストボックス(リストビューではない)にチェックボックスを
つける方法を教えて頂きたいです。

また、ななしさんの様な品格のない方、精神年齢が年なりではない方、
あるいは自覚はないが他の人にそう呼ばれてしまった方はご遠慮願います。
ここから完全に技術的な事として書き込んで欲しいと思います。
よろしくお願いします。


Blue  2007-07-23 20:16:30  No: 65803

Xpスタイルではない場合
  DrawFrameControlでチェックボックスを描画
Xpスタイルである場合
  DrawThemeBackground でチェックボックスを描画

って方法があるらしいです。

参考
BS_BITMAPスタイルを持つボタンでのXPビジュアルの使用
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200411/04110073.txt
ListViewのオーナードローでのチェックボックス
http://forums.belution.com/ja/vc/000/121/42s.shtml


Blue  2007-07-24 09:57:05  No: 65804

VS2005でCCheckListBoxのソースコード見てみたところ
>Xpスタイルではない場合
>  DrawFrameControlでチェックボックスを描画
>Xpスタイルである場合
>  DrawThemeBackground でチェックボックスを描画
の処理は元から入っていました。
はやりXpスタイル(Vista BasicおよびAeroGlassも該当するはず)を適応中かどうかは
ロードしている?(ロード対象となる?)comctl32.dllのバージョンをみているようですね。
(uxtheme.dllのIsThemeActivehはビジュアルスタイルが適応できるテーマかどうかしか判定できない。)

※自作するなら
http://support.microsoft.com/kb/221836/ja
を参考にしてください。

また、uxtheme.dllがない環境も考慮して、LoadLibrary+GetProcAddress
でDrawThemeBackground やらを呼び出したほうが無難でしょう。

VS2003のCCheckListBoxは(ソースが手元にないので)どうインプリメントされているかはわかりません。
VC6の場合、当然のごとくuxtheme.dllを考慮されていないので、自作するしかないのです。

いずれにせよMFCを使わないのであっても、MFCのソースコードは参考になる
と思います。


ぴょぴょ  2007-07-24 15:34:22  No: 65805

>Blue 2007/07/23(月) 11:16:30 
>Xpスタイルではない場合
>  DrawFrameControlでチェックボックスを描画
この関数の存在は知っていました。
でもこの関数が XP スタイルではなかったので今回質問してみたのです。

>Xpスタイルである場合
>  DrawThemeBackground でチェックボックスを描画
この関数は初めて知りました。
情報をありがとう御座います。

>(uxtheme.dllのIsThemeActivehはビジュアルスタイルが適応できるテーマかどうかしか判定できない。)
そうなんですか。

>また、uxtheme.dllがない環境も考慮して、LoadLibrary+GetProcAddress
>でDrawThemeBackground やらを呼び出したほうが無難でしょう。
これは何の DLL を LoadLibrary() すれば良いのですか?
つまり uxtheme.dll ではないのでどの DLL って事です。

>VS2005でCCheckListBoxのソースコード見てみたところ

>いずれにせよMFCを使わないのであっても、MFCのソースコードは参考になる
>と思います。
となっていますがソースコードはどこにありますか?
私の環境は VC++2003.NET(Standard版)です。

MFC は良く分かりませんが C++ を少しだけ理解できますので今後の参考に
ソースコードを見たいと思います。
Blue さんもう一度この書き込みを読んで下さったならばフォルダとかの
場所を教えてくれますか?

お願いします。


Blue  2007-07-24 16:01:05  No: 65806

>これは何の DLL を LoadLibrary() すれば良いのですか?
>つまり uxtheme.dll ではないのでどの DLL って事です。
いや、uxtheme.dllです。
LoadLibraryで動的に使うということです。
(直接コールするのはダメということ)

>となっていますがソースコードはどこにありますか?
CCheckListBoxでVS2003のフォルダをGrepしてみては。


ぴょぴょ  2007-07-24 19:54:17  No: 65807

>いや、uxtheme.dllです。
>LoadLibraryで動的に使うということです。
>(直接コールするのはダメということ)
あっ、そういう意味でしたか。失礼しました。
ありがとうございます。

>CCheckListBoxでVS2003のフォルダをGrepしてみては。
「CCheckListBox」キーワードで検索してみましたが見つかりませんでした。
GREP ではなく Windows の検索システムで行いました。
次のフォルダをチェックしました。
C:\Program Files\Microsoft Visual Studio
C:\Program Files\Microsoft Visual Studio .NET 2003
C:\Program Files
C:\
ファイルに含まれる単語で検索しても見つかりませんでした。
もしかして私の環境ではインストールされていないのでしょうか?
お手数ですがもしあるとしたらどのフォルダ名になるのでしょうか。
あるいは見つけ方をアドバイスしてくれませんか。
あと「CCheckListBox」はファイル名?ファイル内のクラス名?何ですか。

ちなみに WTL はインストールはしていないので使えません。
これが関係しますか?

何度もすみません。
お願い致します。


Blue  2007-07-24 20:44:03  No: 65808

>GREP ではなく Windows の検索システムで行いました。
なぜに?
(Explorerのファイル内の検索はうまいこと出来なかったような)

VS2003でもフォルダのGrepが出来るはずですけど。

ちなみに私はDrawThemeBackgroundのキーワードでVC&のGrep機能を使って
(VS2005のフォルダを対象にして)CCheckListBoxで使っているというのを知りました。


Blue  2007-07-24 20:44:37  No: 65809

訂正
>VC&のGrep機能を使って
VC6のGrep機能を使って


ぴょぴょ  2007-07-24 21:51:01  No: 65810

>Blue 2007/07/24(火) 11:44:03 
>(Explorerのファイル内の検索はうまいこと出来なかったような)
やっぱりそうなのですか。
以前から Windows 検索機能で上手く検索できないのではと思っていました。
そこで次のフリーソフトをダウンロードして試してみました。
http://www.vector.co.jp/vpack/browse/pickup/pw5/pw005053.html

その結果。
やっと見つけました。
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc\winctrl3.cpp
ファイルの
CCheckListBox::PreDrawItemThemed()

DrawThemeBackground()
が使われているのを確認しました。
これからじっくりとソースを解読するつもりです。

最後にもう一つお願いします。
VC++2003.NET での GREP 検索方法を教えてくれませんか?
自分なりにメニューバーの項目をすべて見ましたが該当しそうな機能が
見当たりませんでした。つまり「GREP」とか、フォルダ検索などです。

>VC6のGrep機能を使って
この場合でも良いので教えて下さい。
お願いします。


Blue  2007-07-25 00:45:52  No: 65811

VC6の場合ですが、

メニューの「編集」→「ファイルから検索」

でGrep検索できます。
VS2003は持っていないのでどうなっているのかわかりません。
(VS2005ならもっていますけど。ただ今手元にはない。)

それと、一般的なテキストエディタでもGrep機能がついたものもあるので
それで探すのもありでしょう。
(フリーのエディタならSakuraEditorとか)


ぴょぴょ  2007-07-25 01:08:00  No: 65812

>Blue 2007/07/24(火) 15:45:52 
>VC6の場合ですが、
>メニューの「編集」→「ファイルから検索」
ありがとうございます。
メニューバーより「編集」→「検索と置換」→「ファイル内の検索」で
検索を試してみました。
当然ながら同じファイル名のものが見つかりました。

Blue さんには最後までお付き合いしていただき誠に有り難うございました。
これでこの質問は「解決」とさせていただきます。
本当に Blue さんには感謝します。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加