MFC VC++6.0 XP
ビットマップエディタみたいなものを作成中なのですが、ユーザがマウスボタンの左を
押したところを開始点とし、離したところを終了点とする線を引きたいのですが、左ボ
タンを押してから、離すまで疑似線(開始点から現在のマウスのある地点までの線)を
ユーザにみせたいと思っています。
XXXView::OnMouseMove()内での実装で、線の動画をみせるのに、前の線を消したい
のですが、前の線を消すとバックグラウンドまで消えてしまいます。クライアントDC
をバックグラウンドごと書き直すと、スクロールしても、同じ絵ばから見えてしまいま
す。
もし、経験のあるかたいらっしやいましたら、よろしくおねがいあします。
>ユーザがマウスボタンの左を押したところを開始点とし、離したところを終了点とする
>線
xor で直接画面DCに描画する古典的な技法が簡単でいいでしょう
CDC::SetROP2() で R2_XOREN か R2_NOTXORPEN かを指定して下さい
開始点(x0, y0) から現在の終点(xl, yl) までの線を引きます
次の終点が(OnMouseMove で)確定したら
再度開始点(x0, y0)から前回の終点(xl, yl)まで線を引けば、直前に引いた線は
消えます
開始点から今回の終点までの直線を新たに引きます
後、ご存知かもしれませんが、画面の再描画でちらつきを抑えるには
オフスクリーンとか裏画面とかダブルバッファー(ダブルバッファリング)とか呼ぶ
よく使う技法があります
1 予(あらかじ)めメモリーDCに適切なビットマップを選択しておいてここに
2 直前までの描画内容を保持しておきます
3 最新の変更をこのメモリーDCに対して描画します
4 この最新の描画結果を画面DCに転送(例えば BitBlit() します)
5 画面の再描画を行います
しまさん、レスありがとうございました。
破線を設定してるつもりで、まだでませんが、バックグラウンドをのこしたまま、ひと
まず上手く消えました。
重ねて、ありがとうございました。
CXXXView::任意の関数()
{
CPoint PtStart,PtEnd,PtStartOld,PtendOld ;
//PtStart,PtEndを設定してください
:
DrawFocusLine(PtStart,PtEnd) ;//線を描く
PtStartOld = PtStart ; // 描いた始点、終点をセーブ
PtEndOld = PtEnd ;
DrawFocusLine(PtStartOld,PtEndOld) ;//線を消す
}
void CXXXView::DrawFocusLine(const CPoint aPtFront,const CPoint aPtBehind)
{
CClientDC wDC(this) ;
int wDrawModeOld = wDC.SetROP2(R2_XORPEN) ;
CPen wPen,*wOldPen ;
wPen.CreatePen(PS_DOT, 1, RGB(0x00,0xff,0x00)) ;
wOldPen = wDC.SelectObject(&wPen);
wDC.MoveTo(aPtFront) ;
wDC.LineTo(aPtBehind) ;
wDC.SetROP2(wDrawModeOld) ;
wPen.DeleteObject();
wDC.SelectObject(wOldPen);
}
SetROP2()の引数をR2_NOTXORPEN にすると破線とちゃんとでました。
ありがとうございました。