【发布时间】:2014-04-18 01:42:15
【问题描述】:
在我的绘图功能中,我通过在屏幕上绘制黑色矩形来清除屏幕,然后绘制一组水平和垂直线以显示一些图形。在我的应用程序中,x 轴很长。所以我使用水平滚动来允许用户查看 x 轴上的数据。以下是如上所述绘制背景和线条的程序的一部分。
case WM_PAINT:
HRGN hrgnUpdate = CreateRectRgn(0, 0, 0, 0);
PAINTSTRUCT ps;
if (GetUpdateRgn(m_hWnd, hrgnUpdate, FALSE) != NULLREGION)
{
if (BeginPaint(m_hWnd, &ps))
{
HBRUSH hBr;
hBr = CreateSolidBrush(RGB(0,0,0));
RECT rect;
// Set rect to window size
// Draw black background. This will also work like erasing previous data.
FillRect( m_hDC, &rect, hBr ) ;
COLORREF testColor = RGB(0,255,0);
HPEN hPen = CreatePen(PS_SOLID, 0, testColor);
HPEN hOldPen = (HPEN) SelectObject(m_hDC, hPen);
// Draw Numbers of Horizontal and Vertical lines using MoveToEx and LineTo.
}
EndPaint(m_hWnd, &ps);
}
break;
似乎每次我通过拖动滚动条滚动窗口时,屏幕都会闪烁。在我看来,当绘制背景时,它会在绘制线条之前立即显示在窗口上,然后绘制线条并显示在屏幕上。
有没有办法确保只有在绘制完所有线条后才能在屏幕上更新所有绘图?或者有什么办法可以延迟背景绘制的效果,直到所有线条都画完?
【问题讨论】:
-
是的,双缓冲(检查 WS_EX_COMPOSITED 窗口样式)。此外,您正在为每幅画创建画笔(从某种意义上说,这在资源和时间方面都是一项相当广泛的任务)。你的代码里没有但是你也释放资源吗?
-
感谢您指出创建画笔。我会做一些事情的:)
-
在
WM_ERASEBKGRND中绘制背景 -
@DavidHeffernan :感谢您的评论 :) 但将来,我还计划绘制一个黑色矩形来隐藏图形的某些部分。在这种情况下,我最终需要在 WM_PAINT 中进行。
-
我无法读懂你的想法。问题中的代码做得不好。
FillRect需要在WM_ERASEBKGRND中。