いつもお世話になっています。
さっそくですが質問させていただきます。
環境はWinXP VC++6.0 MFCです。
CBitmapButtonから派生するCMyBmpButtonクラスを作り、ボタンコントロールをこのクラ
スの型で宣言しました。
CMyBmpButton m_btn1;
そして親ダイアログの呼び出し時に
m_btn1.LoadBitmaps( IDB_BITMAP1, IDB_BITMAP2, IDB_BITMAP3, IDB_BITMAP4);
m_btn1.SetMouseBitmap(IDB_BITMAP1);
とし、各状態でのボタンの描画まではできています。
ここでボタンの状態を押下時に切り替え、というチェックボックスのような機能にした
いのですがどのようにしたら実現できるのでしょうか?
具体的には通常はBITMAP1、フォーカス時にBITMAP3、クリックされた時点でBITMAP2に切
り替え(離してもBITMAP1には戻らない)。
この状態から再びフォーカスを当てるとBITMAP5、クリックするとBITMAP1に戻る。
このように考えています。
使われる関数や構造体等、アドバイスありましたらよろしくお願いします。
ボタンのスタイルを、
BS_CHECKBOX | BS_AUTOCHECKBOX | BS_PUSHLIKE | BS_BITMAP
にしてみるとか。
グーグル様は教えてくれます。
http://m--takahashi.com/bbs/pastlog/10900/10845.html
http://homepage3.nifty.com/mitui707/VisualC/VCod_btn.html/
ソースコードを出さないと良いアドバイスは無いでしょう。
BITMAP5は誤記かな?
m_btn1.LoadBitmaps( IDB_BITMAP1, IDB_BITMAP2, IDB_BITMAP3, IDB_BITMAP4);
m_btn1.SetMouseBitmap(IDB_BITMAP1);
にありませんぜ。
オーナードローチェックボックスって出来ないのか。
俺の投稿は忘れてください。
オーナードローにするとどのボタンでもなくなるんだよね。
プッシュボタンに似てるけどダブルクリックとデフォルトボタンの動作ができない。
自分でそれらも何とかしなければならないが無茶な話。
途中でビットマップを差し替えるっていうのいい考えだね。
気がつかんかった。
おはようございます。
たくさんの返答ありがとうございます。
シャノンさん>
スタイルの変更も考えてみたんです。ただその情報を持っている構造体(でしょうか?)
がわからなくて。。。
DRAWITEMSTRUCTは描画に関するものなので違いますよね・・・
杏の里さん>
まさしくこのあたりのページを参考にさせていただいて作っていたのです。
普通のオーナードロービットマップボタンとしては完成しているのですが、スタイル変
更もしくは状態の保持といった部分については、どこもあまり触れられていないので
す。
BITMAP5とは誤記ではなく、BITMAP3とは違う押下状態のフォーカス用BITMAPです。説明
足らずで混乱させてしまいすみません。
ソースに関しては元々ほぼ貼っていただいたページのものを転用していたのですが、い
ろいろ変更を加えた残骸が残っていまして、大変見苦しいものになっています。ので載
せるのを躊躇ってしまいました。
wclrp ( 'o')さん>
途中でビットマップの差し替えと言いますと・・・
自分で状態のフラグを作り、クリック時にはSetBitmap()等でビットマップの変更のみを
行う、ということでしょうか?
質問者でありながら、会社でしかネットを使えないため返事が遅くなってしまい、大変
申し訳ありませんでした。
CBitmapButton には、通常(非フォーカス状態)、フォーカス状態、押されている状態、
無効状態の4つのビットマップが設定できますが、作ろうとしているものは、非フォーカ
ス、フォーカス、無効の3パターンのそれぞれに対し、チェックされている状態とされて
いない状態の2通り、計6通りのビットマップが必要と言うわけですな(無効状態は考慮
されていなかったかもしれませんが)。
で、
> オーナードローにするとどのボタンでもなくなるんだよね。
だとすると、
> 自分で状態のフラグを作り
というのが必要だと思いますね。
シャノンさん>
またも説明不足で申し訳ありません。
diableFlag(無効状態)も必要ですので、フォーカス、非フォーカスに対し、チェックさ
れている、されていないの2パターンと、無効状態の計5パターンを考えています。
さらに補足しますと、チェックでの切り替えを行うビットマップボタンと通常のプッシ
ュボタン式のビットマップボタンは別で存在します。この場合やはりオーナードローボ
タンのクラスは二つ必要になってきますよね。
皆さんのアドバイスのおかげで構想ができてきましたので、とりあえずチェック式のボ
タンを作ってみます。
一通り動くものができたらソースを載せた上でまたアドバイスを頂きたいと思います。
時間がかかってしまうかもしれませんがよろしくお願いします。
遅くなりましたが問題解決です。
方法としては、MAIN.rcを開き、ボタンのコントロール部分を直接書き換えました。
IDD_MAIN_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION main
FONT 9, MS Pゴシック
BEGIN
:
:
CONTROL チェックボタン,IDC_BMBB,Button,BS_AUTOCHECKBOX |
BS_PUSHLIKE | WS_TABSTOP,16,16,50,14
END
このような感じです。「BS_AUTOCHECKBOX」と追加しただけですが、目的のものを作るこ
とができました。
これに各状態のビットマップを設定し、フォーカス時の描画に関しては、フォーカスが
あるときだけビットマップを貼り付ける(?)というなんともよくわからないものが出来
上がりました。
かなりムダの多いやり方なんだろうなぁ、と思いながらも当座の目的は達成できたので
解決とさせていただきます。
お付き合いありがとうございました。