Winapi 在获取焦点时更改编辑控件的背景

Winapi 在获取焦点时更改编辑控件的背景,winapi,mfc,Winapi,Mfc,我想更改该控件的EN_SETFOCUS中编辑控件(即常规编辑窗口类)的背景色。我知道我应该处理WM_CTLCOLOR,在我得到的DC上执行SetBkColor(),然后返回一个带有背景色的笔刷句柄。但是,当我从EN_SETFOCUS执行此操作时,我的控件不会失效或正确地重新绘制。基本上,我的文本周围有一个错误颜色的1像素边框;因此,黑色边框内的矩形已经围绕控件本身。如果我将鼠标光标移到控件上,错误边框的某些部分会正确地重新绘制,有时整个工件会在一小段时间后消失,就好像某个计时器正在导致完全重新绘

我想更改该控件的EN_SETFOCUS中编辑控件(即常规编辑窗口类)的背景色。我知道我应该处理WM_CTLCOLOR,在我得到的DC上执行SetBkColor(),然后返回一个带有背景色的笔刷句柄。但是,当我从EN_SETFOCUS执行此操作时,我的控件不会失效或正确地重新绘制。基本上,我的文本周围有一个错误颜色的1像素边框;因此,黑色边框内的矩形已经围绕控件本身。如果我将鼠标光标移到控件上,错误边框的某些部分会正确地重新绘制,有时整个工件会在一小段时间后消失,就好像某个计时器正在导致完全重新绘制一样

我尝试过在不同的地方使控件无效,重画窗口,在DC上选择RGN(NULL),玩wS_CLIPCHILDREN和对话框的-兄弟,在控件所在的rect上使对话框无效,但这些都不起作用。在2001年的一篇帖子中,我还发现网上有一个类似问题的模糊引用(!),但没有解决方案。有人遇到过这种情况吗?我可以试试其他东西吗

FWIW,这是在WinXP上使用VS9,并使用MFC,但我也“手动”发送消息,这并没有改变任何事情,我不认为MFC是罪魁祸首。当然我可能错了:)

编辑:

下面截图对话框的代码(最小示例)如下:。这是一个小向导生成的应用程序-没有什么特别的,完整的源代码可以从下载

控件在获得焦点后如下所示:

当它失去焦点时,就像这样:

如您所见,文本区域周围似乎有一个不会失效的边框


我曾尝试用纯win32复制此功能,但当我不使用commonctrl6时,它不会出现问题。不过,我无法让commonctrl6在win32中工作,所以我现在怀疑这与此有关。

你知道什么?在谷歌搜索中又一天断断续续地尝试各种事情和尝试不同角度后,我发现了一个神奇的关键词:非客户端失效。这使我想到,其中包含解决方案:

SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_DRAWFRAME);
(在SetFocus/KillFocus处理程序中) 我的理论是commonctrl6视觉样式管理器将编辑控件周围的边框视为非客户区域,并在控件获得焦点时错误计算一个像素的无效区域。SWP_DRAWFRAME似乎是唯一强制对控件进行完整更新的东西,但RDW_FRAME的RedrawWindow()并没有将其剪切


啊,好吧,希望我这里的问题至少能避免像我这样浪费时间的人…

你能显示代码的相关点吗?你没有使用标准的视觉样式渲染器,从奇怪的关闭按钮图标可以看到。我先从那里开始,对话框没有关闭按钮,你看到的按钮是由UltraMon添加的。我删除了所有的按钮,使样品尽可能短,但我没有注意到它时,使截图;只是为了确定我刚刚关闭了Ultramon,然后再试一次,结果还是一样的。