- 締切済み
ダイアログウィンドウのオーナードローボタンの画像を定期的に差し替えたい
いつも参考にさせていただいてます。 タイトルにも書きましたが、ダイアログベース(が関係してるかは分かりませんが)のウィンドウにあるオーナードローボタンのビットマップ画像を1秒ごとに更新したりすることは可能なのでしょうか? また可能であれば、どのように実装するのがいいのかご教示下さい。 宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・次の4つの部分を抜き出して補足に貼り付けて下さい。 (1)WM_INITDIALOG (2)WM_CLOSE (3)WM_TIMER (4)WM_DRAWITEM 一応、重要な部分をサンプルとして載せます。 // サンプル BOOL CALLBACK MyDialogProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { static HBITMAP hBmp1; static HBITMAP hBmp2; static BOOL bMode; switch ( uMsg ){ case WM_INITDIALOG: hBmp1 = (リソースより画像1をロード); hBmp2 = (リソースより画像2をロード); SetTimer( 記述 ); break; case WM_CLOSE: KillTimer( 記述 ); DeleteObject( hBmp1 ); DeleteObject( hBmp2 ); EndDialog( hDlg, IDOK ); break; case WM_TIMER: bMode = !bMode; InvalidateRect( GetDlgItem(hDlg,IDC_BUTTON), NULL, TRUE ); break; case WM_DRAWITEM: if ( bMode ){ // 画像1(hBmp1)でボタンをオーナードロー } else{ // 画像2(hBmp2)でボタンをオーナードロー } break; default:return FALSE; } return TRUE; } 以上。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス >オーナードローボタンのビットマップ画像を1秒ごとに更新したりすることは可能なのでしょうか? ↑ 可能です。 タイマーでも使えばいいと思いますけど。 (1)WM_INITDIALOG で SetTimer でタイマーをセット (2)WM_CLOSE などで KillTimer でタイマーを破棄 (3)WM_TIMER でトグル変数(BOOL型など)を1つ用意して 0、1 を1秒おきにセットします。 (4)オーナードローするときにトグル変数の 0、1 から描画する関数を分けるか、 ビットマップの HBITMAP ハンドルを切り替えて描画すればいいだけです。 ・以上。
補足
ものすごく遅くなってしまいましたが、ご回答ありがとうございます。 タイマー使う方法、試してみました。 ですが、WM_TIMERで描画関数をコールしても画像は切り替えられませんでした。 ボタンを押下したときに同じ関数をコールした場合は切り替わったんですが・・・