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()的内容复制到缓冲区,然后绘制线条,然后将更改应用到屏幕,这会给出您描述的确切结果。这样,您只需添加图形而不是替换,并且您会看到几行而不是一行。

如果你想显示一条被鼠标拖动的线,你需要首先用你想到的任何背景填充后台缓冲区(称之为constant-data),并在其上绘制相关图形(称之为change -data ) 每次鼠标移动。无论如何,我相信首先发表评论BitBlt()应该可以解决问题。

此外,您在调用使用pen的线函数之前选择画笔。那个电话不应该在打电话之前来吗? FloodFill()

编辑:

按照我对您的评论中的建议,使用第三个缓冲区来保存最新数据。在您的“鼠标上移”处理程序中,最后在该缓冲区上绘制新行。
因此,当用户最终确定他想要如何绘制线条时,您在鼠标移动处理程序和绘制处理程序中从该缓冲区读取,并在鼠标向上处理程序中写入该缓冲区。

于 2011-03-14T11:24:17.057 回答
0

在不使用后备缓冲区的情况下进行设计的一种方法是保留您每次绘制的行的动态列表。

您的消息过程可能如下所示:

  • WM_LBUTTONDOWN上,将新行添加到列表中,并以当前位置作为开始。
  • WM_MOUSEMOVE(左键按下)上,将列表中最后一行的结束位置更改为当前鼠标位置。

在每次重绘时,您只需遍历列表并绘制每一行。

于 2011-03-14T11:26:16.410 回答