ダイアログのサイズ変更による背景画像の拡大縮小

[戻る]
しげ 2009/12/03(木) 18:16:43
お世話になります。
VC6.0 MFC ダイアログベースにて作成しております。

BOOL CTESTDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    GetClientRect(&m_Rect);
    m_bitmap.LoadBitmap(IDB_BITMAP2);

    return TRUE;  // TRUE を返すとコントロールに設定したフォーカスは失われません。
}

void CTESTDlg::OnPaint() 
{
    CPaintDC dc(this); // 描画用のデバイス コンテキスト
    CDC dcImage;

    if(!dcImage.CreateCompatibleDC(&dc))
        return;

    BITMAP bm;
    m_bitmap.GetBitmap(&bm);//

    CBitmap* pOldBitmap = dcImage.SelectObject(&m_bitmap);

    int nWidth = m_Rect.right - m_Rect.left;
    int nHeight = m_Rect.bottom - m_Rect.top;

    dc.StretchBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, bm.bmWidth, bm.bmHeight,
SRCCOPY);

    dcImage.SelectObject(&m_bitmap);

    CDialog::OnPaint();
}

上記の記述でビットマップを背景画像に設定しております。
質問は、ダイアログ右下をドラッグすることでサイズ変更したとき、
同時に背景画像もサイズが変更されるようにしたいのです。
OnSize内で何か記述が必要な気がするのですが。
検討がつかないため質問させて頂きました。

ご指導宜しくお願い致します。

みい 2009/12/03(木) 18:21:20
m_Rectに変更後のサイズをセット。

しげ 2009/12/03(木) 18:36:47
みいさん、早速のご回答ありがとうございます。

OnSizeに、

    GetClientRect(&m_Rect);

を入れてみました。

ダイアログ右下をドラッグしてサイズ変更してみましたが、
背景画像は拡大縮小してくれません。

さらにサイズを小さくして、そこから大きくすると
背景画像が欠けてしまいます。

PATIO 2009/12/03(木) 19:05:48
タイプミスなら良いのですが、
StretchBltの後にあるSelectObjectは間違っていませんか?
m_bitmapを未選択状態にしたいのではないかと思うのですが、
このコードではそうなりません。

あと、デバッガで追って見ましたか?
OnSize内の挙動とか、OnPaint内での挙動とか。
変えてみて動作だけを見て判断しても
状況を正確につかめないと思うのですが。

仲澤@失業者 2009/12/04(金) 10:23:28
まず、m_Rectはメンバでなければなりません。
また、WM_SIZE後にWM_PAINTがこない場合は再描画を強制します

void OnSize(UINT nType, int cx, int cy){
   GetClientRect( &m_Rect);
   InvalidateRect( NULL, TRUE); // 強制
   UpdateWindow();       // 再描画
   ValidateRect( &m_Rect);      // 次のWM_PAINTをキャンセル
}

あんまり処理が遅くなる場合で、WM_EXITSIZEMOVEが取れるのならば
そこでやってください。
OnPaintが来ているのにストレッチされない場合は
StretchBlt()まわりとm_Rectを疑ってみてはどうでしょう。

しげ 2009/12/04(金) 13:35:36
[[解決]]
PATIOさん
仲澤@失業者さん
ご回答ありがとうございます。

仲澤@失業者さんのやり方でうまく出来ました!

また、PATIOさん言うとおり、
デバッガでもっと詳しく中身を見ていく必要がありました。

ありがとうございました!

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