【问题标题】:Why is my edit control ignoring the applied visual styles?为什么我的编辑控件会忽略应用的视觉样式?
【发布时间】:2013-02-09 09:30:57
【问题描述】:

我有一个窗口,上面有几个控件,但只有编辑控件忽略了视觉样式。我试图追查原因,但到目前为止还没有运气。这是它的样子:

正如所见,按钮和列表框控件具有正确的视觉风格。但是,编辑控件不会。几天前,我在更改了一堆与它无关的代码后应用了正确的样式一次,所以我知道这是可能的。

注意事项:

  • 我尝试调用InitCommonControlsInitCommonControlsEx 均未成功。
  • 我已将 WS_EX_CLIENTEDGE 应用于编辑控件,并且始终打开了扩展样式,即使它之前工作时也是如此。

我已包含尽可能多的代码来帮助追踪此问题。

来自我的 TextBox 类(继承 Component):

protected:

virtual void OnRegistering(CreationParameters& createParams)
{
    // this is passed in as the lpClassName parameter in 
    // CreateWindowEx() and the lpszClassName parameter in WNDCLASSEX
    createParams.BaseClassName = WC_EDIT;

    // passed as the dwStyle parameter in CreateWindowEx()
    createParams.WindowStyles |= ES_AUTOHSCROLL | ES_AUTOVSCROLL; 

    // passed as the dwExStyle parameter in CreateWindowEx()
    createParams.WindowExStyles |= WS_EX_CLIENTEDGE;
}

处理 WM_CTLCOLOREDIT 或 WM_ERASEBKGND 消息的问题与此有关吗?还是处理字体的问题? 还是别的什么?因为我现在 100% 没有想法。

【问题讨论】:

  • 尝试删除代码中包含 WS_EX_CLIENTEDGE 的行,看看是否有帮助。
  • @mfc:我这样做了,它所做的只是完全删除了边框。 WS_EX_STATICEDGE 有点接近我想要的,但实际上我最终自己解决了这个问题。
  • 如果问题只是没有边框,您可以通过将 WS_BORDER 添加到 WindowStyles 来添加它。

标签: c++ windows winapi atl


【解决方案1】:

问题是我用来为编辑控件着色的 HBRUSH 莫名其妙地从未初始化过,并且是NULL。因为我知道其他人对此有疑问,所以这是我的解决方案。

当 WM_CTLCOLOREDIT 到达消息队列时,问题就显现出来了。 如果在该消息到达时返回了不正确/不正确的 HBRUSH,则编辑控件将恢复为旧的视觉样式。由于我的 HBRUSH 是 NULL,因此旧的视觉样式已应用于编辑控件。

【讨论】:

  • 我也为不应该着色的编辑返回 FALSE,相反我应该将控制权返回给 DefWindowProc。谢谢,伙计,为我节省了一些时间;)
猜你喜欢
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 2017-09-06
相关资源
最近更新 更多