【发布时间】:2020-10-04 07:39:32
【问题描述】:
我正在用 C 语言编写一个 Windows 程序,我有一个静态控件,其中包含一个图形,您可以单击并拖动鼠标来选择一个范围。但是,当您四处拖动鼠标时,选择范围会闪烁。我从谷歌上了解到这是一个常见问题,解决方案是使用 WS_EX_COMPOSITED 样式(也建议覆盖 WM_ERASEBKGND,但在我的情况下并不能解决)。问题是当我激活这种样式时,它会导致 CreateWindowEx 失败。这是一行:
CreateWindowEx(WS_EX_COMPOSITED, WC_STATIC, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, graphXPos, graphYPos, GRAPH_WIDTH, GRAPH_HEIGHT, mainWindowHandle, NULL, NULL, NULL);
这样创建窗口时效果很好:
CreateWindow(WC_STATIC, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, graphXPos, graphYPos, GRAPH_WIDTH, GRAPH_HEIGHT, mainWindowHandle, NULL, NULL, NULL);
CreateWindowEx 失败的错误代码是 0x57,表示“此参数不正确”。文档说 WS_EX_COMPOSITED 不适用于使用样式 CS_OWNDC 或 CS_CLASSDC 的窗口类,因此我使用 GetClassInfo 检查静态控件是否使用这些样式,但它们没有(它们仅使用 CS_DBLCLKS 和 CS_PARENTDC)。
我不知道这是否重要,但这个静态控件的子窗口具有以下样式:WS_OVERLAPPED、WS_MINIMIZEBOX、WS_SYSMENU、WS_VISIBLE、WS_CLIPSIBLINGS。它所属的窗口类只有 CS_DBLCLKS 样式。
【问题讨论】:
-
在子控件上没有意义,只在顶级窗口上。
-
根据document:使用双缓冲以自下而上的绘制顺序绘制窗口的所有后代。所以也许你应该将样式添加到
mainWindowHandle。 -
@ZhuSong - OP 没有提到该图形窗口的任何
descendants...
标签: c windows winapi flicker createwindowex