【问题标题】:Disable visual style for a single CButton禁用单个 CButton 的视觉样式
【发布时间】:2015-07-22 16:50:55
【问题描述】:

如果我创建普通的CButtons,它们看起来像这样:

我在执行以下操作时不小心创建了一些看起来较旧的按钮:

class CClickButton : public CButton
{
    afx_msg int OnCreate (LPCREATESTRUCT lpcs);
    DECLARE_DYNAMIC(CClickButton);
    DECLARE_MESSAGE_MAP();
};

IMPLEMENT_DYNAMIC(CClickButton, CButton);

BEGIN_MESSAGE_MAP(CClickButton, CButton)
    ON_WM_CREATE()
END_MESSAGE_MAP()

int CClickButton::OnCreate (LPCREATESTRUCT lpcs)
{
    return 0;
}

现在我想创建这种风格的按钮。 (因为我想添加一个位图。只有在使用这种样式时,它们才会给出“被按下”的视觉反馈。新样式只是将背景染成蓝色,这被按钮顶部的位图隐藏了。一个另一个问题是,如果有一种简单的方法可以在按下按钮时为图像着色。)

告诉 MFC 创建这类按钮的正确方法是什么?只是在基类中省略OnCreate 消息对我来说是错误的。而且我不确定这是否会导致我还不知道的其他副作用。

我找到了一些有关如何更改整个程序的视觉样式的信息。但我只想为某些选定的按钮更改它。

【问题讨论】:

  • 按钮的外观取决于您的 DLL 或 EXE 中的清单或您执行的 API 调用。当普通按钮看起来像您的第一个示例时,当您有相应的清单时,其他按钮应该看起来相同。你有清单吗?谁创建了按钮。 EXE 或 DLL 中的代码?
  • 如果我覆盖OnCreate 函数,正如我所解释的,我可以创建相邻的两种类型的按钮。这些按钮来自一个 DLL。我不知道清单。但我没有创建应用程序。
  • 只有当应用程序/DLL 具有 ComCtrl 32 版本 6.0 的清单时才能创建第一种样式的按钮! ...如果您有 DLL,我需要一个清单(Afaik ID24 也是)阅读有关他的 MSDN。

标签: mfc


【解决方案1】:

可以在每个窗口的基础上启用和禁用视觉样式。 MSDN 提供了有关如何Turn Off Visual Styles 的信息:

您可以通过调用SetWindowTheme 函数来关闭窗口中某个控件或所有控件的视觉样式,如下所示:

SetWindowTheme(hwnd, L" ", L" ");


要在您的 MFC CButton-派生类中实现此功能,请将代码放入您的 OnCreate-handler 中:
int CClickButton::OnCreate( LPCREATESTRUCT lpcs ) {
    ::SetWindowTheme( m_hWnd, L" ", L" " );
    return CButton::OnCreate( lpcs );
}


如果您使用对话框资源来构建您的 GUI,并在创建对话框(及其控件)后使用 DDX_Control 函数将您的 CClickButton 附加到现有的标准按钮控件,您的 OnCreate-handler不会被调用。对于这种特定情况,您必须稍后关闭视觉样式。一个理想的候选人是覆盖虚拟PreSubclassWindow 方法:
void CClickButton::PreSubclassWindow() {
    ::SetWindowTheme( m_hWnd, L" ", L" " );
    CButton::PreSubclassWindow();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多