• 締切済み

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

いつも参考にさせていただいてます。 タイトルにも書きましたが、ダイアログベース(が関係してるかは分かりませんが)のウィンドウにあるオーナードローボタンのビットマップ画像を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

  • オーナードローボタンでのバグ

    オーナードローボタンでのバグについて質問です。 ボタンの更新(再描画)を何度も繰り返すと、 再描画をしてもうまく表示(再描画)されなくなるのですが、 何が原因なのでしょうか? さらに、ボタンの再描画がうまく行かなくなった後に、 プロパティシートを開くとおかしくなります(ウィンドウの枠しか表示されない)。 ちなみに、ボタンの再描画処理をしないようにしてみた所、 こういう現象はありませんでした。 開発環境 XP Visual Studio 2005 C、C++でWindowsAPIを使用しています。

  • ダイアログのボタンコントロールで困っています

    winプログラムを始めて間がない初心者ですが、よろしくお願いします。 ダイアログ上に、ビットマップ画像を使ってボタンを作成するために、 MFCのCButtonのオーナー描画 や CBitmapButtonを使ってボタンコントロールを作成したところ、 ボタンの反応速度が遅く、連続でクリックが出来なくて、困っています。 反応速度の早いボタンコントロールを作成するには、どうすれば良いのでしょうか?

  • ダイアログのボタンにビットマップを表示

    ダイアログボックスのボタンにビットマップは、貼れるのですが、 256色の時におかしくなってしまいます。 やっぱり、オーナードローで、描画するしかないのでしょうか? ほかの方法が、あったら教えてください。

  • 2つのダイアログ間で共通のタイマーを持たせる方法

    お世話になります。 なかなかいいタイトルが浮かばず、いまいち分かりにくいタイトルになってしまいました。 なにがしたいかといいますと、 2つのダイアログ、ダイアログ1,ダイアログ2があります。ダイアログ2はダイアログ1からポップアップです。 ダイアログ1,ダイアログ2には同じ動作を示すボタンがありまして、そのボタンの動作というのが、ボタンを押すとボタンに 貼り付けているビットマップ画像が変化します。そして決められた時間が経過すると、元のビットマップ画像に戻るといった 動作をします。 その動作を2つのダイアログで共通に使いたいのです。 つまり、例えばボタンを押してから1分たったらビットマップ画像が元に戻るといった動作をするように設定したときに ダイアログ1でボタンをクリックして20秒経過し、ダイアログ2を呼び出したとします。 そして、ダイアログ2が呼び出されて40秒後(ボタンをはじめて押されてから60秒後)にボタンの画像がダイアログ1,2とも元の画像に 戻ってほしいのです。 このように動作させるにはどのようにしたらよいでしょうか? ご意見がありましたら、宜しくお願い致します。

  • ダイアログアプリのウィンドウ領域について

    いつもお世話になります。 VC++6.0MFCダイアログベースでアプリを開発しているのですが、 ビットマップ画像(100×100)をダイアログに貼り付けています。 円の画像ですが、ビットマップなので四角の画像になっています。 そこで楕円のリージョンを作って、 // 楕円のリージョンを作る m_rgn.CreateEllipticRgn(0,0,100,100); // ウィンドウのリージョンを設定する SetWindowRgn((HRGN)m_rgn ,TRUE); こんな感じで表示したらウィンドウは丸くなっています。 そこで上記で作成したリージョンの上をマウスがオーバーしたら 画像を差し替えたいのですが、どうしても、ダイアログ の領域(四角)で反応してしまいます。 CPoint pos; CRect rect; GetCursorPos(&pos); GetWindowRect(&rect); if (rect.PtInRect(pos)) { // マウスが上に来ている m_bMouseOver = TRUE; } else { // マウスは上にはない m_bMouseOver = FALSE; } こんな感じでm_bMouseOverの中身を見て画像を差し替えています。 リージョンで作成した楕円の上だけで反応させるには どのようにすればいいのでしょうか? わかりにくいかもしれませんがアドバイスよろしくお願い致します。

  • MFCダイアログベースでのボタン背景透過方法

    VC++初心者です。 MFCダイアログベースでボタンを描画したいのですが、 そのボタンの背景を透過(透明)にしたいのです。 環境はWinXP、VSC++2010です。 OnCtrlColor()関数でSetBkMode(TRANSPARENT)や brash.CreateStockObject(NULL_BRUSH)などを実装していますが、 背景は変わりません。 ちなみに、ダイアログにはbitmap画像を貼りつけています。 ボタンはCMFCButtonを使用しているので、 CMFCButtonの変数m_mfcBtnのメンバ(プロパティ?)の m_bTransparentをTrueにしてもダメでした。 なぜ背景が透過できないのかわかりません。 ご教授宜しくお願いします。

  • AutoLoad()関数の使い方がわかりません。

    VC++6.0 WindowsXPです。 ダイアログベースで作っていますが、ダイアログのボタンをビットマップで表示しようとしてます。 現在のやり方としては 1.ダイアログのスタイルは「オーナー描画」「ビットマップ」にチェックする。 2.リソースに貼り付けたいビットマップ画像を4枚挿入し、ビットマップのIDは対象のボタンのキャプションを「IMAGE」だとすると末尾に「U」「D」「F]「X」をつけたID、つまり「IMAGEU」「IMAGED」、、とする。 3.ダイアログのクラス(xxxDlg)の中で CBitmapButton bitmap1; のようにCBitmapButton型のオブジェクトを作る。 3.xxx::OnInitDialog()の中で bitmap1.AutoLoad(IDIMAGE,this); を追加する。 以上です。コンパイル自体はエラー、警告なしでできました。しかし実行するとエラーがおきます。 エラーの内容は 「例外 unknown software exception (0x8000003)がアプリケーションの0x77f767cdで発生しました。」 となります。 どこが間違いなのかわかりません。 よろしくお願いします。

  • ウィンドウやダイアログボックスを取り込み編集保管するには?

    WinMeに限らないのですが、Windowsの作業中に頻繁に表示される 各ウィンドウやプロパティー画面表示等のダイアログボックス部分だけを デジカメ画像のように専用ソフトなどにJEPEGイメージやビットマップ イメージとして取り込み、編集保管するのにはどのような操作が必要なんでしょうか? 当方PC初心者で質問自体、的を得ていなかったりカテゴリーが違っていたら すみませんが、よろしくお願い致します。

  • 画像操作について

    いつもお世話になります。 MFCベースでCreateDIBSectionの使い方を教えていただけないでしょうか? ビットマップ画像を回転させようとしているのですが、 MFCベースで作りこんでいるため、ウィンドウハンドルの 扱い方などがよくわかりません。 MFCベースだと再度HWNDとして取得する必要があるのでしょうか? それかキャストしないといけないのでしょうか? どなたかご教示おねがいいたします。

  • フォームボタンを画像にすると…

    http://www.west-mira.jp/javascript/color/Tbgcolor6.html 上記のページを参考にスクリプトを設置し、動作テストに問題がかったので、フォームボタンを画像にした所、上手く行かなくなりました。 詳細: 背景色を変えたいテーブルの中にインラインフレームを表示させてあるのですが、フォームボタン(画像)をクリックするとページ全体を更新、の繰り返しになり理想通りの背景色変更になりません。環境はMac9.2+IE5.2です。 正常な動作+フォームボタン(画像)を再現したいのですが、御教示頂けると助かります。 (上記のサイトで質問するのが一番なのでしょうが、サポートを行なっていないようなのでこちらで質問しています)

専門家に質問してみよう