現在、CScrollViewを使用して線描画プログラムを作成しています。
起動時にビットマップを作成し、ボタンが押下されたら裏画面に線を描画し、
CScrollViewに指定された範囲の線を表示しています。
ここまではできたのですが、ビューをスクロールバーでスクロールしようとしても
スクロールされません。
正確には新しい線が描かれようとしているようですが線の残像が残ってしまっています。
ウィンドウを一度最小化して元に戻すと以前の位置で線が描画されます。
この解決策をご存知の方、いらっしゃいましたらご教授ください。
全く方法がわからないのでキーワードだけでも教えていただけたら自分で調べてみます。
よろしくお願いします。
int CDrawView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CScrollView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: この位置に固有の作成用コードを追加してください
CDC *pDC = GetDC();
memDC.CreateCompatibleDC(pDC);
m_bkbm.CreateCompatibleBitmap(&memDC,500,500);
memDC.SelectObject(&m_bkbm);
m_rctDrawRange.top = 0;
m_rctDrawRange.bottom = 500;
m_rctDrawRange.left = 0;
m_rctDrawRange.right = 500;
memDC.FillRect(m_rctDrawRange, &CBrush(::GetSysColor(COLOR_WINDOW)));
return 0;
}
void CDrawView::OnPaint()
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト
// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
memDC.SelectObject(&m_bkbm);
dc.BitBlt(0,0,500,500,&memDC,0,0,SRCCOPY);
// 描画用メッセージとして CScrollView::OnPaint() を呼び出してはいけません
}
↓ボタン押下で呼ばれます
void CDrawView::CreateLine()
{
int n = memDC.SetMapMode(MM_LOMETRIC); // 0.1mm
memDC.LPtoDP(m_rctDraw); // m_rctDraw:描画範囲
CPen lPen;
lPen.CreatePen(PS_SOLID, 0, RGB(0,0,0));
CBrush* pBrush;
pBrush = (CBrush *)memDC.SelectStockObject(BLACK_BRUSH);
memDC.SelectObject(&lPen);
memDC.Rectangle(m_rctDraw);
InvalidateRect(0);
memDC.SetMapMode(n);
}
普通、Viewを使うときはOnPaint()でなくて、OnDraw()で描画します。
OnDraw()以外の場所で描画するときは、明示的にOnPrepareDC()を呼ぶ必要があります。
EIJIさん、回答ありがとうございます。
ご指摘の通り、OnDraw()でビットマップを転送するとうまくいきました。
ありがとうございました。
またバカな質問をするかもしれませんが、よろしくお願いします。
チェック忘れてました…