• 締切済み

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

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

みんなの回答

  • alfeim
  • ベストアンサー率58% (114/195)
回答No.1

256色の時だけおかしくなるのでしょうか? であればPallete周りのメッセージを捕まえてちゃんと処理はされてますか? WM_QUERYNEWPALETTEやWM_PALETTECHANGEDあたりのメッセージを捕まえて別プロセスがパレットを切り替えた時などにちゃんと対処する必要があります。 また、256色モードではシステムが20色分予約してますので実質236色しか使えません(本当は254色まで利用可能ですが・・・)。 なのでビットマップが256色フルに使っているとパレット周りの処理をちゃんとしてもすべて正しい色で表示されるとはかぎりません。

関連するQ&A

  • VisualC++6.0にてボタンにビットマップを表示させる方法

    VisualC++6.0のダイアログベースのアプリにおいて、 フォーム上に配置したボタン上にビットマップを表示 させたいと思ってます。OnPaint()の中で、以下のコード を書いたのですが、うまくいきません。  CWnd* myWnd = GetDlgItem(IDC_BUTTON1);  CDC* pDC = myWnd->GetDC();  CDC myDC;  CBitmap myBMP;  myBMP.LoadBitmap(IDB_BITMAP);  myDC.CreateCompatibleDC(pDC);  CBitmap* oldBMP = myDC.SelectObject(&myBMP);  pDC->BitBlt(0,0,100,100,&myDC,0,0,SRCCOPY);  myDC.SelectObject(oldBMP); ビットマップはちゃんと書かれてはいますが、その上にボタンが 描かれてしまうので、ビットマップが隠されてしまいます。 解決方法を教えてくださいますでしょうか。 よろしくお願いします。 % 絵をクリックするとアクションを起こすようにしたいので、 % ピクチャーボックスでも試してみました。これだとビット % マップはちゃんと表示されますが、BN_CLICKEDを書いて % ピクチャーボックスをクリックしてもOnPict()に処理が % 移りません。

  • ダイアログ画面全体をマウスで動かせるようにするには

    VC++、MFC、WindowsXPです。 現在の状況としてはは ダイアログベースによる作成。 ダイアログにオーナー描画でビットマップを貼り付けている。 という感じです。 普通ウィンドウのタイトルバーをマウスで押してウィンドウの位置を動かしますが、たまに画面のどこを押しても動かせるようなウィンドウがありますが、あれは一体どうやっているのでしょうか? よろしくお願いします。

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

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

  • ダイアログにビットマップを貼り付けた時にフリーズしてしまう

    お世話になります、fujicafeです。 現在、MFCにてダイアログベースのアプリケーションを作成中なのですが、ダイアログにビットマップを貼り付けてOnPaint()で表示するようにプログラムを作成したのですが、何度かダイアログの表示を繰り返すとOnPaintでのビットマップの読み込みが途中まででフリーズしてしまう現象が起きてしまいました。 プログラムは以下のように作成しています void C****Dlg::OnPaint() {  CDC* pDC = this->GetDC(); CDC myDC; CBitmap newbitmap; CBitmap* oldbitmap; CRect rc; GetClientRect(rc); newbitmap.LoadBitmap(IDB_BITMAP); myDC.CreateCompatibleDC( pDC ); oldbitmap=myDC.SelectObject( &newbitmap ); pDC->BitBlt( 0, 0, rc.Width(), rc.Height(), &myDC, 0, 0, SRCCOPY ); myDC.SelectObject(oldbitmap); } としています。 初めにこのダイアログを表示時は、ちゃんとビットマップが表示されるのですが、他のダイアログでこのダイアログを表示させた時にビットマップが上半分まで表示されて、動作がフリーズしてしまう現状です。 なにかよい打開策がありましたら、教えていただけたらと思っています。宜しくお願いいたします。

  • ボタンの表示を改行表示したい

    ボタンの表示を改行表示したい Windows CE上で動作するソフトを作成中で、ダイアログ上に5個のボタンを置き、押されたボタンにより、それぞれのボタンの表示を変更しようとしています。 中には1行では表示しきれないものがあり、改行したいのですが、「**・・・」と表示されます。他のボタンとのバランスを考えると、横幅を広げる事は出来ません。 ボタンの色を変える為、Owner DrawをTRUEにしているせいだろと推測は出来るのですが、どうやれば改行出来るのでしょうか? ※Owner DrawをFALSEに戻し、MultilineをTRUEにし、Owner DrawをTRUEにし、プロパティのCaptionに\nを入れると改行はされますが...。 環境は以下の通りです。 ・Windows CE 5.0 ・Visual C++ 2005 ・MFCスマートデバイス 以上、よろしくお願いします。

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

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

  • ダイアログのボタンが押された時に、その「ボタン」のあるダイアログと、すでに表示されている他のダイアログを消したいです

    Win2000/MFC/ダイアログベース で作業しています。初心者です(^^;) Aというダイアログで「あるボタンa」を押してDoModalでBというダイアログを表示させ、Bダイアログで「あるボタンb」を押してDoModalでCというダイアログを表示させ、Cダイアログで「あるボタンc」を押した時にBダイアログとCダイアログを閉じたい(消したい)のですが EndDialogで消せません DoModalの戻り値をret_b,ret_cとした場合 EndDialog(ret_c); EndDialog(ret_b); としたのですが。。。 やり方がおかしいのか、よくわかりません・・ 初心者でもわかりやすいお返事お待ちしています(^^;)

  • ダイアログのボタン操作

    ダイアログのボタンが押されている間、文字列が表示されるようなプログラムを作りたいのですが、通常のプッシュボタンですと、押したあと離した時にイベント(WM_COMMAND)が発生してしまいます。(通常、OKやキャンセルを押した場合、実際に話した時に機能が働く) ボタンが押されていることを認識する方法はあるのでしょうか? ラジオボタンやチェックボックスなら設定によってできるような話を聞いたのですがプロパティをどのように設定したらよいかわりません。 よろしくお願い致します。

  • ダイアログボックスについて。

    ダイアログボックスについての質問です。 開発環境はVisual C++ 2005.netでありSDKを利用しています。 ダイアログボックスにPicture Controlを貼り付け、Combo Boxの内容が変わるたびにそのPicture Controlに画像を表示するようなプログラムを作りたいと考えています。 自分が考える手順としてはまずPicture Controlについてサブクラス化を行い、親のダイアログボックスが表示されると同時にPicture ControlのプロシージャでWM_CREATEメッセージを受け取り描画を行う。 そして親のダイアログボックスに貼り付けたCombo Boxの内容が変更された場合に、Picture ControlのウィンドウハンドルにむけてWM_PAINTメッセージを送信する。 こんな手順で行いたいのですが、少し不安な部分が出てきました。 Combo Boxの内容が変更され、Picture Controlのウィンドウハンドルに向けてWM_PAINTメッセージを送信し、Picture ControlプロシージャではWM_PAINTメッセージがきたとき画像の描画を行う場合、このプロシージャではどの画像を描画してよいか不明です。 そのため何番の画像の表示命令が来たのかを示すために、親のダイアログボックスに貼り付けたCombo Boxが変更された場合、Picture Controlに向けてWM_PAINTメッセージと表示画像番号をパラメータとして送信したいのです。 もちろんグローバル変数を用意すれば簡単なのですが、できるだけ使用しないように記述をしたいのです。そこで考えたのが、 SendMessage(GetDlgItem(hDlgWnd, IDC_PICTURE), WM_PAINT, 0, MAKELPARAM(0, number)); このようにnumberをLPARAMの下位ワードとして送信しようと考えました。 このメッセージ送信を行い、Picture ControlプロシージャでWM_PAINTメッセージが到着したとき、LOWORD(lparam)からnumberを取り出す。 実現したい目的のため、このような方法を考えましたが、エラーなく実行できるでしょうか? もしあやしい部分が見つかった場合はアドバイスをお願いします。そしてこの方法よりも簡単に処理できる方法があれば教えていただきたいです。 自分としてはサブクラス化は面倒なので、Picture Controlをオーナードローとして扱う方法も考えましたが、うまく動きませんでしたTT

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

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

専門家に質問してみよう