【问题标题】:Changing the background of an edit control on getting focus在获得焦点时更改编辑控件的背景
【发布时间】:2013-07-30 08:08:28
【问题描述】:

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

我尝试在 DC 上的各个地方使控件无效,RedrawWindow,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下载。

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

当它失去焦点时是这样的:

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

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

【问题讨论】:

  • 你能显示你的代码的相关点吗?
  • 你没有使用标准的视觉风格渲染器,从奇怪的关闭按钮图标可以看出。我会先从那里开始。
  • 我是,对话框没有关闭按钮,你看到的按钮是UltraMon添加的。我删除了所有按钮以使示例尽可能短,但是在制作屏幕截图时我没有注意到它;只是为了确保我刚刚关闭了 Ultramon 并再次尝试,并且行为是相同的。

标签: winapi mfc


【解决方案1】:

好吧,你知道什么 - 在又断断续续地尝试各种事情并在谷歌搜索中尝试不同角度之后,我找到了神奇的关键字:非客户区失效。这导致我 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 似乎是唯一强制完全更新控件的东西,带有 RDW_FRAME 的 RedrawWindow() 并没有削减它。

嗯,希望我在这里的问题至少可以避免像我一样浪费时间的人......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    相关资源
    最近更新 更多