【发布时间】:2014-12-29 06:46:51
【问题描述】:
我开发了一个显示 jpeg 图像的应用程序。它可以显示 4 个图像,在屏幕的每个象限中显示一个。它为此使用了 4 个窗口。窗口没有边框(框架)也没有标题栏。 加载新图像时,为新图像调整窗口大小,然后显示图像。
特别是当窗口变大时,经常会出现闪烁。在我看来,在显示新内容之前调整大小时似乎旧内容被移动了。
我查阅了很多资源并使用了所有技巧:
窗口只有
CS_DBLCLKS样式(没有CS_HREDRAW或CS_VREDRAW);背景画笔为NULL;
WM_ERASEBKGND返回 1;WM_NCPAINT返回 0;WM_NCCALCSIZE告诉对齐到未移动的一侧(你能告诉它丢弃客户区吗?);WM_WINDOWPOSCHANGING返回0;SetWindowPos 有标志
SWP_NOCOPYBITS | SWP_DEFERERASE | SWP_NOREDRAW | SWP_NOSENDCHANGING。
不过,在调整窗口大小时会发生闪烁(或内容移动)。我想要的是:
将WindowPos 设置为新的大小和位置;
InvalidateRect (hWnd, NULL, FALSE);
UpdateWindow(hWnd);
在WM_PAINT之前没有任何绘画、背景擦除或内容移动。
WM_PAINT 会:
hDC= BeginPaint (hWnd, &ps);
hMemDC= CreateCompatibleDC (hDC);
hOldBitmap = SelectObject (hMemDC, hNewBitmap);
BitBlt (hDC,...,hMemDC,0,0,SRCCOPY);
SelectObject (hMemDC, hOldBitmap);
DeleteDC (hMemDC);
EndPaint (hWnd, &ps);
谁能告诉我我是否/在哪里犯了导致窗口旧内容被移动的错误?
硬件等:HP Elitebook Core7 64 位 Windows 7 和 NVIDIA Quadro K1000m 驱动程序 9.18.13.3265(更新至 341.44)。
更新(2017 年 7 月)
我也在另一台 Windows 计算机 (Windows 8/10) 上看到了程序的行为。它似乎不是 NVIDIA 显示驱动程序。
将平铺到屏幕中心的窗口(右下角 = w/2, h/2)调整到左上角或左上角 (0, 0) 时,该行为最为明显。
我可能在计算 WM_NCCALCSIZE 消息时遇到问题,告诉 Windows 不要做任何事情。任何人都可以为我的目的提供一个示例计算吗?另见How do I force windows NOT to redraw anything in my dialog when the user is resizing my dialog?
【问题讨论】:
-
将
WS_EX_COMPOSITED添加到主窗口。如果没有什么可以帮助您使用 glew - glsl -
@АлексейНеудачин,
WS_EX_COMPOSITED并没有什么不同。请注意,所有窗口都是具有样式WS_OVERLAPPEDWINDOW和类样式CS_DBLCLKS的顶级窗口,因此我假设每个窗口都是您提到的“主窗口”。
标签: windows image winapi flicker