2011-03-14 170 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