c-使用WS_EX_COMPOSITED创建静态控件失败



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

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

解决方法是双重缓冲。你把所有的东西都画到屏幕外的内存DC上,然后一次BitBlt

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

相关内容

  • 没有找到相关文章

最新更新