Mfc 禁用单个CButton的视觉样式

Mfc 禁用单个CButton的视觉样式,mfc,Mfc,如果我创建正常的CButtons,它们看起来如下所示: 在执行以下操作时,我意外创建了一些外观较旧的按钮: class CClickButton : public CButton { afx_msg int OnCreate (LPCREATESTRUCT lpcs); DECLARE_DYNAMIC(CClickButton); DECLARE_MESSAGE_MAP(); }; IMPLEMENT_DYNAMIC(CClickButton, CButton);

如果我创建正常的
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
消息是不对的。我不确定这是否会导致我还没有意识到的其他副作用


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

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

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

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

要在MFC
CButton
-派生类中实现此功能,请将代码放入
OnCreate
-处理程序中:

int CClickButton::OnCreate( LPCREATESTRUCT lpcs ) {
    ::SetWindowTheme( m_hWnd, L" ", L" " );
    return CButton::OnCreate( lpcs );
}

如果您正在使用对话框资源构建GUI,并在创建对话框(及其控件)后使用函数将
CClickButton
附加到现有的标准按钮控件,则不会调用
OnCreate
-处理程序。对于此特定场景,您必须在稍后关闭视觉样式。理想的候选者是覆盖虚拟
PreSubclassWindow
方法:

void CClickButton::PreSubclassWindow() {
    ::SetWindowTheme( m_hWnd, L" ", L" " );
    CButton::PreSubclassWindow();
}

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