お世話になります。
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内で何か記述が必要な気がするのですが。
検討がつかないため質問させて頂きました。
ご指導宜しくお願い致します。
m_Rectに変更後のサイズをセット。
みいさん、早速のご回答ありがとうございます。
OnSizeに、
GetClientRect(&m_Rect);
を入れてみました。
ダイアログ右下をドラッグしてサイズ変更してみましたが、
背景画像は拡大縮小してくれません。
さらにサイズを小さくして、そこから大きくすると
背景画像が欠けてしまいます。
タイプミスなら良いのですが、
StretchBltの後にあるSelectObjectは間違っていませんか?
m_bitmapを未選択状態にしたいのではないかと思うのですが、
このコードではそうなりません。
あと、デバッガで追って見ましたか?
OnSize内の挙動とか、OnPaint内での挙動とか。
変えてみて動作だけを見て判断しても
状況を正確につかめないと思うのですが。
まず、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を疑ってみてはどうでしょう。
PATIOさん
仲澤@失業者さん
ご回答ありがとうございます。
仲澤@失業者さんのやり方でうまく出来ました!
また、PATIOさん言うとおり、
デバッガでもっと詳しく中身を見ていく必要がありました。
ありがとうございました!