裏画面を使用して描画した際のスクロール – プログラミング – Home

裏画面を使用して描画した際のスクロール
 
通知
すべてクリア

[解決済] 裏画面を使用して描画した際のスクロール


くろ
 くろ
(@くろ)
ゲスト
結合: 25年前
投稿: 14
Topic starter  

現在、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);
}


引用未解決
トピックタグ
EIJI
 EIJI
(@EIJI)
ゲスト
結合: 24年前
投稿: 76
 

普通、Viewを使うときはOnPaint()でなくて、OnDraw()で描画します。
OnDraw()以外の場所で描画するときは、明示的にOnPrepareDC()を呼ぶ必要があります。


返信引用
くろ
 くろ
(@くろ)
ゲスト
結合: 25年前
投稿: 14
Topic starter  

EIJIさん、回答ありがとうございます。

ご指摘の通り、OnDraw()でビットマップを転送するとうまくいきました。
ありがとうございました。
またバカな質問をするかもしれませんが、よろしくお願いします。


返信引用
くろ
 くろ
(@くろ)
ゲスト
結合: 25年前
投稿: 14
Topic starter  

チェック忘れてました…


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました