プロパティシート上へのビットマップ描画

[戻る]
cogfine 2009/09/07(月) 16:26:41
VC++6.0+WinXP環境で、CPropertySheetクラスベースのアプリを開発しています。
プロパティページ上にピクチャボックスとその他のボタン等のコントロールを同時に配
置していますが、描画がうまく行きません。
ソースは下記の通りです。

-------------------------------------------------------------------
void MyPropertySheet::OnPaint()
{
    if (IsIconic(9)
    {
        //省略
    }
    else
    {
        CPropertySheet::OnPaint();

        // 画像の表示 ←◆追加
        DispImg();
    }
}

void DispImg()
{
    //メモリデバイスコンテキストを使って、ピクチャボックス上に
    //BitBlt()で画像転送する処理
}

-------------------------------------------------------------------

症状としては、OnPaint()をコールしても、画像が一瞬表示されるがすぐに消える。ピク
チャボックスの一部を他のウインドウ等で隠すと表示される。

当然ですが、以下の事実は分かっています。
OnPaint()関数中の「CPropertySheet::OnPaint();」をコメントアウトすると、画像は正
常に表示されるようになるが、他のコントロールの表示が崩れる。また、「DispImg
();」をコメントアウトするとコントロール系は正常表示になるが、画像は表示されな
い。
「CPropertySheet::OnPaint();」+「DispImg();」となると画像が表示されない。。

どなたか解決法をご教授いただけないでしょうか。
3日ほどハマッています。。。

よろしくお願い致します。

通りすがり 2009/09/07(月) 17:40:23
DispImg()に問題がありそうな...
DispImg()のコードを提示した方が良いと思いますよ。

ロマ 2009/09/07(月) 18:41:50
原因は、親、子、孫の順にWM_PAINTがPostされるからです。
ページのOnPaintに移動すれば解決するかもしれません。

ところで、ピクチャボックスの描画について以前から気になっていることがあります。
次のようなコードは綱渡り的かつ無駄が多いです。

BOOL CALLBACK DlgProc(HWND hDlg,,,)
{
  ......
  case WM_PAINT:
    hdc = GetDC(GetDlgItem(hDlg, IDC_PICTUREBOX));
    DrawMyPicture(hdc);
  .......
}

ピクチャボックスの派生クラスを作るか、SS_OWNERDRAWを使うべきと思います。

cogfine 2009/09/08(火) 13:20:56
[[解決]]
ロマさんのご指摘どおり、これまで先のソースの通りプロパティシートに記述していた
画像描画処理をプロパティページのOnPaint()に変更したところ、正常に表示されまし
た。

ありがとうございます。取り急ぎご報告まで。

古いスレッドには追加発言できません。