为什么我的编辑控件忽略应用的视觉样式?

时间:2013-02-23 22:50:16

标签: c++ windows winapi atl

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

Edit control has old 3D style

如图所示,按钮和列表框控件具有适当的视觉样式。但是,编辑控件不会。几天前,在更改了一堆与之无关的代码之后,我已经使用了一次的正确样式,所以我知道这是可能的。

注意事项:

  • 我尝试过调用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%没有想法。

1 个答案:

答案 0 :(得分:3)

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

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