1

私は win32 アプリケーションを持っていて、マウスをドラッグして線を引きたいと思っています。私もダブルバッファリングを使用していますが、問題はマウスのパスに複数の行が描画されることです。ここに私の描画コードがあります:

hdc = BeginPaint(hWnd, &ps);
hdcBack = CreateCompatibleDC(hdc); 
GetClientRect(hWnd, &windowRect); 
backBuffer = CreateCompatibleBitmap(hdc, windowRect.right, windowRect.bottom);
SelectObject(hdcBack, backBuffer); 
FloodFill(hdcBack, 0, 0, RGB(255, 255, 255)); 
BitBlt(hdcBack,0,0,windowRect.right,windowRect.bottom,hdc,0,0,SRCCOPY);
color = RGB(rand() % 255, rand() % 255, rand() % 255); 
hBrush = CreateSolidBrush(color); 
SelectObject (hdcBack, hBrush); 

MoveToEx(hdcBack,x1,y1,NULL); //x1,y1,x2,y2 are the initial click point and the current position of the mouse when keeping the left button down and dragging
LineTo(hdcBack,x2,y2);
BitBlt(hdc, 0, 0, windowRect.right, windowRect.bottom, hdcBack, 0, 0, SRCCOPY);

DeleteObject(hBrush); 
DeleteDC(hdcBack);
DeleteObject(backBuffer);
EndPaint(hWnd, &ps);

また、線を描画する前に背景をバッファにコピーしないようにしましたが、線は正しく描画されますが、新しい線を描画すると、以前に描画された線が消えます。では、ダブルバッファリングを使用して複数の線を描画し、以前に描画した線を保持するにはどうすればよいですか?

4

2 に答える 2

1

要件を正しく理解していれば、問題は設計に内在しています。

最初にBitBlt()の内容をバッファーにコピーし、次に線を描画してから、変更を画面に適用します。これにより、説明したとおりの結果が得られます。この方法では、グラフィックを置き換えるのではなく追加するだけで、1 行ではなく複数の行が表示されます。

マウスでドラッグされている線を表示したい場合は、最初にバック バッファーを、考えていた背景 (定数データと呼びます) で埋め、その上に関連するグラフィックスをペイントする必要があります (変化と呼びます)。 -data ) マウスを動かすたびに。とにかく、最初にコメントすることBitBlt()でうまくいくと思います。

また、 penを使用する line 関数を呼び出す前に、ブラシを選択しています。その電話は電話する前に来るべきではありませんか? FloodFill()

編集:

私のコメントで提案されているように、最新のデータを保持するために3番目のバッファを使用してください。「マウスアップ」ハンドラーで、最後にそのバッファーに新しい行を描画します。
そのため、マウス移動ハンドラーとオンペイント ハンドラーでそのバッファーから読み取り、マウスアップ ハンドラーで書き込みます。これは、ユーザーが自分の線をどのように描画したいかを最終的に確信したときです。

于 2011-03-14T11:24:17.057 に答える
0

バックバッファを使用せずにこれを設計する 1 つの方法は、毎回描画する線の動的リストを保持することです。

メッセージ プロシージャは次のようになります。

  • WM_LBUTTONDOWNで、現在の位置を開始点としてリストに新しい行を追加します
  • WM_MOUSEMOVE (左ボタン押した状態) で、リストの最後の行の終了位置を現在のマウス位置に変更します。

再描画するたびに、リストを反復処理して各行を描画するだけです。

于 2011-03-14T11:26:16.410 に答える