2011-03-14 76 views
1

我有一個win32應用程序,我想通過拖動鼠標畫一條線。我也使用雙緩衝,但問題是它在鼠標的路徑中繪製多行。這裏是我的繪製代碼:C++ 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); 

我想也不會複製背景到緩衝器繪製前行並正確繪製線,但是當我畫一條新的生產線以前繪製的線消失。 那麼我怎樣才能繪製多行雙緩衝和保持以前畫出的線?

回答

1

如果我正確理解要求,問題的設計就是固有的。

第一BitBlt()複製到緩衝區中的以前內容,那麼你劃清界線,然後更改應用到屏幕上,它給你描述的確切結果。這樣你只需要添加圖形而不是替換,而且你會看到幾行而不是一行。

如果你想顯示一個被鼠標拖動的行,你需要先填充後臺緩衝區,並考慮你想要的任何背景(稱爲常量數據),並在其上繪製相關圖形(稱之爲改變數據)每個鼠標移動。無論如何,我相信那個評論第一個BitBlt()應該做的伎倆。

此外,我們在調用行功能,它使用一個之前選擇。打電話給FloodFill()之前不應該打這個電話嗎?

編輯:

使用第三緩衝器中作爲我對你的意見建議保持最新的數據。在你的「鼠標移動」處理程序中,最後在上畫出新線,即緩衝區。
所以你從你的鼠標移動處理程序和塗料處理程序中的緩衝區中讀取,並且當用戶終於確定他想要如何繪製線條時,將它寫入中。

+0

我很抱歉在我的問題上有點不清楚。如果我評論第一個BitBlt,它可以繪製一條線。但我想繪製多行。但是當我開始繪製下一行時,前一個消失。我希望它保持下去。不知何故,我想保存背景,但只有當一條線被完全繪製時。而刷子是爲了另一個目的。我應該刪除它,但它不會影響我的代碼。 – Paul 2011-03-15 08:55:08

+0

在這種情況下,您需要另一個緩衝區,該緩衝區將存在於鼠標移動處理程序的作用域之外,幷包含最新的_applied_更改,並在繪製拖動的行之前從其中複製數據而不是「hdc」。我希望這能解決這個問題。 – 2011-03-15 09:55:24

0

不使用backbuffer而設計這種方法的一種方法是保存每次繪製的動態列表。

您的消息PROC可能是這個樣子:

  • WM_LBUTTONDOWN,新行添加到列表中與當前位置作爲開始。
  • WM_MOUSEMOVE(左鍵向下),將列表中最後一行的結束位置更改爲當前鼠標pos。

在每次重繪時,只需遍歷列表並繪製每一行。

+0

是的,這是正確的,但我不能使用這樣的列表。要求是以某種方式使用第三個緩衝區,並在那裏保存背景,但只在某些時候,我試圖找出什麼時候。 – Paul 2011-03-15 08:58:31

+0

好的,那麼你可以使用相同的原理,並且每次釋放鼠標時都會將前緩衝區BitBlt發送到後臺緩衝區。然後,當您繪製時,首先將後緩衝區BitBlt拖放到前緩衝區,然後在前方繪製當前行。 – 2011-03-15 11:31:36