【问题标题】:Change Static Text Color in MFC在 MFC 中更改静态文本颜色
【发布时间】:2021-02-18 22:50:06
【问题描述】:

我正在尝试在我的 MFC 应用程序的对话框窗口中更改静态文本(以及复选框项)的颜色。

按照这个 (MFC - change text color of a cstatic text control) 和类似的建议,我在 ON_WM_CTLCOLOR() 消息上做了以下操作:

HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd *pWnd, UINT nCtlColor)
{
      pDC->SetTextColor(RGB(255, 0, 0));
      return (HBRUSH)GetStockObject(NULL_BRUSH);
}

问题是这只影响编辑文本框,而不影响静态文本或复选框。那些仍然有黑色文本。

我还尝试寻找类似于 winapi 的 WM_CTLCOLORSTATIC 消息的东西,因为它在 win32 应用程序中运行良好,但在 MFC 中没有找到任何等效项。知道如何更改静态文本和复选框文本的颜色吗?

【问题讨论】:

    标签: c++ mfc gdi


    【解决方案1】:

    这对我有用:

    把这个放到消息映射中:

    ON_WM_CTLCOLOR()
    

    并实现这样的东西:

    HBRUSH CSomeDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
      HBRUSH hbr = __super::OnCtlColor(pDC, pWnd, nCtlColor);
    
      if (pWnd->GetDlgCtrlID() == IDC_SOMESTATIC)
      {
        // display the static control IDC_SOMESTATIC in red
        pDC->SetTextColor(RGB(255, 0, 0));
      }
    
      return hbr;
    }
    

    【讨论】:

    • 谢谢,它仍然没有改变我的静态文本颜色或复选框。我正在 BCGSoft 属性页面上尝试此操作。我做了一个快速测试并打印出所有的 ID 到控制台。似乎对于静态文本绘图,它甚至没有通过 OnCtlColor(...),因为我没有看到任何静态 id 打印到控制台...对于复选框,即使它通过 OnCtlColor,它仍然没有效果.我尝试如下禁用复选框的 Windows 主题,但复选框仍然没有成功: ::SetWindowTheme(GetDlgItem(IDC_PAGE0_CHECK1)->GetSafeHwnd(), L"wstr", L"wstr");
    • 我在该对话框窗口上禁用了 BCG 视觉主题,现在我可以看到颜色变化对静态文本的影响。在这个阶段,现在似乎唯一的方法是覆盖可视化管理器并指示它使用某种颜色来绘制静态文本。
    【解决方案2】:

    当您从工具箱添加静态文本控件时,它将获得 ID IDC_STATIC。 您需要将此 ID 重命名为其他名称,然后使用 OnCtlColor。假设您将其命名为 IDC_STATIC_1,在 OnCtlColor 中,使用:

    case IDC_STATIC_1:
        pDC->SetBkMode(TRANSPARENT);
        pDC->SetTextColor(RGB(100,110,120);
    

    【讨论】:

    • 我之前绑定了重命名静态文本的 id 以使它们独一无二。我仍然无法改变它们的颜色。问题与我使用的 BCGSoft 有关,有时纯 MFC 不起作用。
    • 我的回答适用于 MFC。您是否尝试过 BCGSoft 文档?
    • 我问过他们,他们说他们不支持这些类型的定制。如果我没记错的话,BCGSoft 中的每个应用程序外观都应该有一个可视化管理器类。应该可以覆盖那里的颜色,然后将其连接到应用程序 bu,这在没有任何示例/支持的情况下工作太多。
    猜你喜欢
    • 2015-07-29
    • 2019-04-06
    • 2010-12-10
    • 2012-10-07
    • 2022-08-17
    • 2010-12-19
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多