【问题标题】:Creating static control with WS_EX_COMPOSITED fails使用 WS_EX_COMPOSITED 创建静态控件失败
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-17
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    相关资源
    最近更新 更多