• 締切済み

ダイアログウィンドウのオーナードローボタンの画像を定期的に差し替えたい

いつも参考にさせていただいてます。 タイトルにも書きましたが、ダイアログベース(が関係してるかは分かりませんが)のウィンドウにあるオーナードローボタンのビットマップ画像を1秒ごとに更新したりすることは可能なのでしょうか? また可能であれば、どのように実装するのがいいのかご教示下さい。 宜しくお願い致します。

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドバイス ・次の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)
回答No.1

★アドバイス >オーナードローボタンのビットマップ画像を1秒ごとに更新したりすることは可能なのでしょうか?  ↑  可能です。  タイマーでも使えばいいと思いますけど。  (1)WM_INITDIALOG で SetTimer でタイマーをセット  (2)WM_CLOSE などで KillTimer でタイマーを破棄  (3)WM_TIMER でトグル変数(BOOL型など)を1つ用意して 0、1 を1秒おきにセットします。  (4)オーナードローするときにトグル変数の 0、1 から描画する関数を分けるか、   ビットマップの HBITMAP ハンドルを切り替えて描画すればいいだけです。 ・以上。

kazu26
質問者

補足

ものすごく遅くなってしまいましたが、ご回答ありがとうございます。 タイマー使う方法、試してみました。 ですが、WM_TIMERで描画関数をコールしても画像は切り替えられませんでした。 ボタンを押下したときに同じ関数をコールした場合は切り替わったんですが・・・

関連するQ&A