線をひく動画 – プログラミング – Home

通知
すべてクリア

[解決済] 線をひく動画


熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

MFC VC++6.0 XP
ビットマップエディタみたいなものを作成中なのですが、ユーザがマウスボタンの左を
押したところを開始点とし、離したところを終了点とする線を引きたいのですが、左ボ
タンを押してから、離すまで疑似線(開始点から現在のマウスのある地点までの線)を
ユーザにみせたいと思っています。
XXXView::OnMouseMove()内での実装で、線の動画をみせるのに、前の線を消したい
のですが、前の線を消すとバックグラウンドまで消えてしまいます。クライアントDC
をバックグラウンドごと書き直すと、スクロールしても、同じ絵ばから見えてしまいま
す。
もし、経験のあるかたいらっしやいましたら、よろしくおねがいあします。


引用未解決
トピックタグ
しま
 しま
(@しま)
ゲスト
結合: 18年前
投稿: 123
 

>ユーザがマウスボタンの左を押したところを開始点とし、離したところを終了点とする
>線
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 画面の再描画を行います


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

しまさん、レスありがとうございました。
破線を設定してるつもりで、まだでませんが、バックグラウンドをのこしたまま、ひと
まず上手く消えました。
重ねて、ありがとうございました。

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);
}


返信引用
熱血
 熱血
(@熱血)
ゲスト
結合: 15年前
投稿: 100
Topic starter  

SetROP2()の引数をR2_NOTXORPEN にすると破線とちゃんとでました。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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