0

我正在用 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 样式。

4

1 回答 1

0

闪烁是用交替的对比色重复绘制同一区域。

解决方案是双缓冲。您将所有内容都绘制到屏幕外内存 DC 上,并且BitBlt一次完成。

更复杂的替代方法是在图形顶部创建一个半透明窗口并在其上绘制选择。

于 2020-10-03T23:39:32.503 回答