使用WS_EX_COMPOSITED创建静态控件失败

问题描述

我正在用C编写Windows程序,我有一个静态控件,其中包含一个图形,您可以单击并拖动鼠标以选择范围。但是,在拖动鼠标时,选择范围会闪烁。我从Googling中学到了这是一个常见问题,解决方案是使用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);

当这样创建窗口时,此方法工作正常:

CreateWindow(WC_STATIC,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样式。

解决方法

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

解决方案是双缓冲。您可以将所有内容绘制到屏幕外的内存DC上,并立即BitBlt

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...