【发布时间】:2020-09-22 03:52:54
【问题描述】:
我正在开发一个 Windows 桌面应用程序,但我沮丧地注意到我的文本在闪烁,因此在搜索时我发现了两种方法 - 对于 erasebkgnd 和双缓冲返回 true。第一种方法没有做任何事情,第二种方法由于某种原因使我的背景全黑,它仍然闪烁。
下面是我称之为绘画和缓冲的地方:
case WM_PAINT: {
PAINTSTRUCT ps;
HDC screen = BeginPaint(hWnd, &ps);
putImage(screen, hWnd);
RECT rc;
GetClientRect(hWnd, &rc);
HDC memdc;
auto hbuff = BeginBufferedPaint(screen, &rc, BPBF_COMPATIBLEBITMAP, NULL, &memdc);
EndBufferedPaint(hbuff, TRUE);
EndPaint(hWnd, &ps); } break;
接下来的部分是 putImage 函数
void putImage(HDC hdc, HWND hWnd)
{
Graphics graphic(hdc);
graphic.DrawImage(Image::FromFile(filePath), 10, 10);
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
}
我想知道问题出在哪里,是否有解决办法。
【问题讨论】:
-
提供的代码无法重现此问题。你能展示一个迷你的、完整的和可重复的样品吗?您想使用
BeginBufferedPaint实现什么目标?graphic.DrawImage实际做画。 -
我读到要停止闪烁,我需要放置一个称为双缓冲区的东西,我不完全确定。因此,我决定尝试那里的解决方案,即 wmpaint 案例中 putImage 下面的行一直到 endbufferedpaint。当我注释掉那部分时,黑色窗口消失了,但闪烁仍然存在。