我创建了一个类继承自CButton,然后想要让我的类支持改变Button的颜色(Radio Button),我自己的button代码如下: // MyButton.h
#pragma once class CMyButton : public CButton
{
public:
CMyButton(void);
~CMyButton(void);
void SetTextColor(COLORREF color);
protected:
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
DECLARE_MESSAGE_MAP()
private:
COLORREF m_color;
}; // MyButton.cpp #include "StdAfx.h"
#include "MyButton.h" // CMLButton message map
BEGIN_MESSAGE_MAP(CMyButton, CButton)
//{{AFX_MSG_MAP(CMLButton)
ON_WM_CTLCOLOR_REFLECT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP() CMyButton::CMyButton(void)
{
m_color = GetSysColor(COLOR_WINDOWTEXT);
} CMyButton::~CMyButton(void)
{
} void CMyButton::SetTextColor(COLORREF color)
{
m_color = color;
RedrawWindow();
}
HBRUSH CMyButton::CtlColor(CDC* pDC, UINT nCtlColor)
{
HBRUSH hbr = CButton::OnCtlColor(pDC, GetParent(), nCtlColor); //if (CTLCOLOR_STATIC == nCtlColor)
//{
// pDC->SetTextColor(m_color);
//}
pDC->SetTextColor(m_color);
return hbr;
}
然后创建一个基于MFC的Dialog应用程序,添加一个Radio Button,给这个Radio Button添加一个变量(m_radio) 然后在Dialog的 BOOL CMyRadioDlg::OnInitDialog()中添加代码 m_radio.SetTextColor(RGB(255, 0, 0)); 运行程序。 经过我的观察,发现当我的程序加载的是C:\WINDOWS\system32\ 下的comctl32.dll, 这个程序的Radio Button可以改变文本的颜色,只是没有XP那种风格(如在鼠标移过时,Radio Button前的那个小圆圈的加亮效果)。 但是当我的程序使用的DLLs是通过Manifest指定,而且版本是6.0或者更高的时候,Radio Button就不能改变颜色,不过有XP风格。
可以使用Visual Studio.net 工具“open”(要通过Open按钮来打开,不能像源文件一样直接拖拽到IDE工具中) 编译后生成的exe,然后展开“RT_MANIFEST”项,里面有一个ID为"1"的资源,其内容为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugMFC" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="[color=#FFFF00]6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
</dependentAssembly>
</dependency>[/color]</assembly>
上面的XML格式的文件是我的Visual Studio 2005自动生成的,从蓝色标记的部分可以看出,加载的comctl32.dll 是从C:\WINDOWS\WinSxS\ 文件夹下加载的。当我把蓝色的部分删除(直接在打开exe后展开“RT_MANIFEST”后删除),我的radio button就可以改颜色。
不知道大家有没有好的方法改变Radio Button的文本颜色, 而且最好还有保留XP风格,代码越简洁越好啊。
#pragma once class CMyButton : public CButton
{
public:
CMyButton(void);
~CMyButton(void);
void SetTextColor(COLORREF color);
protected:
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
DECLARE_MESSAGE_MAP()
private:
COLORREF m_color;
}; // MyButton.cpp #include "StdAfx.h"
#include "MyButton.h" // CMLButton message map
BEGIN_MESSAGE_MAP(CMyButton, CButton)
//{{AFX_MSG_MAP(CMLButton)
ON_WM_CTLCOLOR_REFLECT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP() CMyButton::CMyButton(void)
{
m_color = GetSysColor(COLOR_WINDOWTEXT);
} CMyButton::~CMyButton(void)
{
} void CMyButton::SetTextColor(COLORREF color)
{
m_color = color;
RedrawWindow();
}
HBRUSH CMyButton::CtlColor(CDC* pDC, UINT nCtlColor)
{
HBRUSH hbr = CButton::OnCtlColor(pDC, GetParent(), nCtlColor); //if (CTLCOLOR_STATIC == nCtlColor)
//{
// pDC->SetTextColor(m_color);
//}
pDC->SetTextColor(m_color);
return hbr;
}
然后创建一个基于MFC的Dialog应用程序,添加一个Radio Button,给这个Radio Button添加一个变量(m_radio) 然后在Dialog的 BOOL CMyRadioDlg::OnInitDialog()中添加代码 m_radio.SetTextColor(RGB(255, 0, 0)); 运行程序。 经过我的观察,发现当我的程序加载的是C:\WINDOWS\system32\ 下的comctl32.dll, 这个程序的Radio Button可以改变文本的颜色,只是没有XP那种风格(如在鼠标移过时,Radio Button前的那个小圆圈的加亮效果)。 但是当我的程序使用的DLLs是通过Manifest指定,而且版本是6.0或者更高的时候,Radio Button就不能改变颜色,不过有XP风格。
可以使用Visual Studio.net 工具“open”(要通过Open按钮来打开,不能像源文件一样直接拖拽到IDE工具中) 编译后生成的exe,然后展开“RT_MANIFEST”项,里面有一个ID为"1"的资源,其内容为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugMFC" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="[color=#FFFF00]6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
</dependentAssembly>
</dependency>[/color]</assembly>
上面的XML格式的文件是我的Visual Studio 2005自动生成的,从蓝色标记的部分可以看出,加载的comctl32.dll 是从C:\WINDOWS\WinSxS\ 文件夹下加载的。当我把蓝色的部分删除(直接在打开exe后展开“RT_MANIFEST”后删除),我的radio button就可以改颜色。
不知道大家有没有好的方法改变Radio Button的文本颜色, 而且最好还有保留XP风格,代码越简洁越好啊。
[color=#00FFFF]<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="[color=#FFFF00]6.0.0.0[/color]" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
</dependentAssembly>
</dependency>[/color]
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.DebugMFC" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
// 这是XML Code的真正内容。
还有另一种方法使EXE无论在XP,还是2000,98下都是XP风格,只不过只对控件edit box,combobox,comboboxex,check box,button,radio(还有几个,我忘了)起作用,界面就是XP风格的,对tabctrl,listctrl,list box,groupbox,就不起作用,还是2000系统下那种.很简单,有个XXXx.dll(现在忘了,这个文件在我机子上),在CXXXApp::InitInstance下加两行代码就OK了,不过这个方法最大的缺点就是如果你的EXE里还有另一种CXXXButton的自绘类(已经跟IDD_BUTTON1联系了),就出错了,不会调那个。这种方法的Button不可以加载.bmp.icon上去,很死版,个人觉得,所有连XXX.dll名字都记不到.最好的方法就是自绘了,
CXXXButton::DrawItem(lpDrawItemStruct下边用这个结构取rect,dc,state..然后用CDC想怎么画就怎么画了