更改Radio Button文本颜色的有关问题(MFC)
更改Radio Button文本颜色的问题(MFC)
我创建了一个类继承自CButton,然后想要让我的类支持改变Button的颜色(Radio Button),我自己的button代码如下:
// MyButton.h
// MyButton.cpp
然后创建一个基于MFC的Dialog应用程序,添加一个Radio Button,给这个Radio Button添加一个变量(m_radio)
然后在Dialog的 BOOL CMyRadioDlg::OnInitDialog()中添加代码
运行程序。
经过我的观察,发现当我的程序加载的是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格式的文件是我的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风格
我创建了一个类继承自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风格