我创建了一个类继承自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风格,代码越简洁越好啊。 

解决方案 »

  1.   

    抱歉,上面的XML code中本来想用颜色加亮最后一个 <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]
      

  2.   

    <?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="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
        </dependentAssembly>
      </dependency>
    </assembly> 
    // 这是XML Code的真正内容。
      

  3.   

    给个邮件我发一个radiobox的控件给你
      

  4.   

    那个在资源引入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风格
    还有另一种方法使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想怎么画就怎么画了
      

  5.   

    关键是如果要自己话,比如是Radio Button,那么在XP风格下,有很多特性的,比如鼠标移动过时Radio Button前的那个小圆圈有个突出的效果,难道这也要自己来处理?还有就是当鼠标选中一个Radio Button时,在Radio Button的文本区域有一个虚边框,这也要自己画?