更改Radio Button文本颜色的有关问题(MFC)

更改Radio Button文本颜色的问题(MFC)
我创建了一个类继承自CButton,然后想要让我的类支持改变Button的颜色(Radio Button),我自己的button代码如下: 

// MyButton.h 

C/C++ code

#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 

C/C++ code
#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()中添加代码 

C/C++ code
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 code

<?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>
  [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> 
  

上面的XML格式的文件是我的Visual Studio 2005自动生成的,从蓝色标记的部分可以看出,加载的comctl32.dll 是从C:\WINDOWS\WinSxS\ 文件夹下加载的。当我把蓝色的部分删除(直接在打开exe后展开“RT_MANIFEST”后删除),我的radio button就可以改颜色。 


不知道大家有没有好的方法改变Radio Button的文本颜色, 而且最好还有保留XP风格,代码越简洁越好啊。 


------解决方案--------------------
那个在资源引入24,改ID为1的然后粘上XML code那一段代码或是添加.Manifest,(2003以上版本好像就不用,EXE直接就是“XP风格)然后EXE就成了“XP风格”,这个EXE放在XP操作系统,并且使用了XP样式主题,EXE界面就会随着主题的改变而改变,但是当改变到"使用Window 经典样式"的主题后,这个原本有XP风格的程序就变成了WIN2000界面,解决的办法就是重绘(应该是自绘吧)Radio,你上边那个VC代码不应该算是'自绘',我以前也有想过,为什么同是XP系统,改主题为WIN2000的,EXE界面就不是XP风格了,是不是在用了XP主题风格后,加载着某个DLL,正因为这个DLL,才使上面的XML code那些生效,当用WIN2000主题后,这个DLL就释放了,所以EXE就没了XP风格