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

时间:2013-07-30 08:08:28

标签: winapi mfc

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

我已经尝试在各个地方使控件无效,RedrawWindow,DC上的SelectRgn(NULL),使用wS_CLIPCHILDREN和对话框的-SIBLINGS,使控件所在的矩形对话无效,但这些都不起作用。我在2001年的一篇文章中也发现了一个模糊的类似问题(!),但没有解决方案。有没有人见过这个?关于我可以尝试的其他事情的任何想法?

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

编辑:

以下屏幕截图对话框的代码(最小样本)位于:http://pastebin.com/zepdhdp5。这是一个小型向导生成的应用程序 - 没什么特别的,完整的源代码可以从https://www.dropbox.com/s/d8nxaryoo0vclue/edit_control_redrawing_sample.zip下载。

控件在获得焦点后看起来像这样:

enter image description here

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

enter image description here

正如您所看到的,看起来文本区域周围的边框不会失效。

我试图用纯win32重现这个,但是当我不使用commonctrl6时,它没有出现问题。我无法让winctrl6在win32中工作,所以我现在怀疑它与它有关。

1 个答案:

答案 0 :(得分:4)

那么你知道什么 - 在谷歌搜索中间歇性尝试各种事情并尝试不同角度的另一天之后,我找到了神奇的关键词:非客户区失效。这导致我http://forums.codeguru.com/showthread.php?307470-Invalidate-NC-area,其中包含解决方案:

SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_DRAWFRAME);

(在SetFocus / KillFocus处理程序中) 我的理论是,commonctrl6视觉样式管理器将编辑控件周围的边框视为非客户区域,并在控件获得焦点时错误计算一个像素无效的区域。 SWP_DRAWFRAME似乎是唯一强制完全更新控件的东西,RedrawWindow()与RDW_FRAME没有削减它。

啊,好吧,希望我的问题至少可以让某些人像我一样浪费他的时间......