MFC该怎么实现多个Button控件不同颜色的控制

问题:使用VS 2019中MFC该怎么实现多个Button控件不同颜色的控制
显示效果:见图
操作:比如按一次“数据刷新”后字体变成红色,再按一次恢复原来颜色。
说明:参考了很多加入新的一个类以及WM_DRAWITEM的方式,无法实现我要的功能。
建工程方式:打开Visual Studio 2019——开始使用——创建新项目——所有语言选择C++——MFC应用——设置项目名称、位置、解决方案名称——创建——应用程序类型里面选择“基于对话框”——使用MFC中选择“在静态库中使用MFC”——完成。
软件:Visual Studio 2019——C++——MFC方式。

img

提供参考实例:MFC中改变按钮颜色的方法,里面讲解的非常详细,
链接:https://blog.csdn.net/zxccaoya/article/details/54142523?spm=1001.2101.3001.6650.9&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-54142523-blog-125254783.235%5Ev36%5Epc_relevant_default_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-54142523-blog-125254783.235%5Ev36%5Epc_relevant_default_base3&utm_relevant_index=13

以下答案由GPT-4.0Plus大模型与博主A努力中.......共同编写:

  1. 在资源视图中添加多个Button控件,定义ID分别为IDC_BUTTON1、IDC_BUTTON2等,文本分别为“数据刷新”、“修改数据”等。
  2. 在构造函数中获取Button控件指针,并为每个Button绑定单击事件:
cpp
Button1 = (CButton *)GetDlgItem(IDC_BUTTON1);
Button1->SetEvent(IDC_BUTTON1, _T("onclick"), _T("Btn1_Click()"));

Button2 = (CButton *)GetDlgItem(IDC_BUTTON2); 
Button2->SetEvent(IDC_BUTTON2, _T("onclick"), _T("Btn2_Click()"));

  1. 在.h文件中声明两个函数原型:
cpp
void Btn1_Click();
void Btn2_Click(); 

  1. 在.cpp文件中实现两个函数,通过调用JavaScript函数切换Button文本颜色:
cpp
void CMFCApplication1Dlg::Btn1_Click() 
{
    ExecJSScript(L"changeColor('red')");  
}

void CMFCApplication1Dlg::Btn2_Click()
{
    ExecJSScript(L"changeColor('green')");
}

  1. 在.html文件中添加JavaScript函数:
html
<script type="text/javascript">
function changeColor(color) 
{
    document.getElementById('IDC_BUTTON1').style.color = color;
}
</script>

  1. 重新编译并运行,单击不同的Button,通过JavaScript调用切换对应Button的文本颜色。

主要步骤是:获取Button指针并绑定单击事件,在事件中通过ExecJSScript函数调用JavaScript来切换颜色,然后在.html文件中实现JavaScript函数完成颜色切换。

MFC前端利用ExecJSScript调用JavaScript与前端HTML/JS交互的方式,可以实现更为复杂的前端展示和交互效果。

可以通过以下步骤实现多个Button控件不同颜色的控制:

1、打开资源视图,在对话框资源中双击按钮控件,打开属性窗口。

2、选择 "外观" 标签页,找到 "背景颜色" 属性,设置初始颜色,并记录下该颜色值。

3、在 Class View 窗口中找到对应对话框的类,右键单击该类,并选择 "添加 变量"。

4、在弹出的 "添加成员变量" 对话框中,选择需要控制颜色的按钮控件,命名为一个易于识别的变量名。例如:m_btnRefresh。

5、在该类的头文件中添加一个成员变量存储控件初始颜色,以及一个成员变量记录当前颜色是否为红色。

COLORREF m_clrInitBtn; // 存储按钮初始颜色
bool m_bBtnRed; // 记录按钮当前颜色是否为红色

6、在 OnInitDialog() 函数中记录按钮初始颜色并初始化记录按钮当前颜色的变量。

BOOL CYourDialog::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 记录按钮初始颜色
    m_clrInitBtn = m_btnRefresh.GetBackgroundColor();

    // 初始化记录按钮当前颜色的变量为 false
    m_bBtnRed = false;

    return TRUE;
}

7、在按钮单击事件处理函数中,通过检查按钮当前颜色是否为红色来设置不同的颜色。

void CYourDialog::OnBtnRefresh()
{
    // 如果按钮当前颜色为红色,则将颜色还原为初始颜色
    if (m_bBtnRed)
    {
        m_btnRefresh.SetBackgroundColor(m_clrInitBtn);
        m_bBtnRed = false;
    }
    else // 否则将颜色设置为红色
    {
        m_btnRefresh.SetBackgroundColor(RGB(255, 0, 0));
        m_bBtnRed = true;
    }
}

8、在按钮资源中找到 "消息" 属性,选择 "BN_CLICKED" 消息,并设置消息的处理函数为上述处理函数。

9、保存并编译程序,测试按钮控件颜色变化功能。
注意:在使用 RGB() 函数设置颜色值时,第一个参数是红色分量,第二个参数是绿色分量,第三个参数是蓝色分量。由于 Windows 中使用的是 BGR 颜色模式,所以真实的颜色值应该是 (0, 0, 255) 表示红色,而非 (255, 0, 0)。

搜索MFC按钮文字颜色,参考 https://blog.csdn.net/dongzhe8/article/details/80909144

测试了大家的方案,还是不能解决问题,后来请教了重庆地区的哥们,成功已经解决问题,在此感谢大家和他的帮忙,这里给出解决方案。
1、使用DrawItem;
2、DrawItem函数中参考下列形式的代码进行添加(特别说明:不要相信AI或者GPT的答案,太复杂,测试下来也不能,有些操作,软件中是没有的)

img


3、测试效果

img