如何动态改变MFC中静态文本控件的颜色

问题描述 投票:0回答:1

我有一个简单的基于 MFC 对话框的应用程序,其中包含静态文本控件以及其他基本控件,例如复选框控件和按钮以及编辑框控件(参见照片)。我希望能够在用户单击 GO 按钮时动态更改静态文本控件的颜色。我从其他 SO 帖子中借用了下面的大部分代码。

我已经实现了以下 WM_CTLCOLOR 消息处理程序,如下所示:

HBRUSH CFileRenamerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    CWnd* pWndT = pWnd->GetDlgItem(IDC_STATIC);

    // TODO:  Change any attributes of the DC here
    switch (nCtlColor)
    {
    case CTLCOLOR_STATIC:

        if (pWnd->GetDlgCtrlID() == IDC_STATIC)
        {
            pDC->SetTextColor(RGB(255, 0, 0));
            //MessageBoxW(L"TEST", L"TESTING", 0);
            return (HBRUSH)GetStockObject(NULL_BRUSH);
        }
    }
    return hbr;
}

void CFileRenamerDlg::OnBnClickedGo()
{
    CWnd* pWnd = this->GetDlgItem(IDC_STATIC);
    CDC* dc = pWnd->GetDC();
    dc->SetTextColor(RGB(128, 128, 128));
    //COLORREF ref = dc->GetTextColor();

    pWnd->Invalidate(0);
    pWnd->UpdateWindow();
}

FileRenamer Application

上面的代码确实有效,因为静态文本控件的颜色确实更改为上面指定的颜色,但是当我尝试在

OnBnClickedGo()
处理程序中编写的代码时,它不起作用。没有任何错误或调试断言失败。如何将静态文本的颜色更改为其他颜色?

谢谢

c++ visual-studio mfc
1个回答
0
投票

[已解决]只是为了阐明问题所在。我在这里读到一篇关于 SO 的文章,建议资源编辑器中的默认控件 ID 应从 ID_STATIC 的默认控件 ID 更改为其他内容,例如 ID_STATIC_TEXT 现在一切正常。我希望这可以帮助其他有类似问题的人。我已经发布了切换静态文本控件颜色的工作代码。

HBRUSH CFileRenamerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    CWnd* pWndT = pWnd->GetDlgItem(IDC_STATIC);

    static int nColor = 0x0;
    int rgbRedC = 0x000000FF;
    int rgbGreenC = 0x0000FF00;
    int rgbBlueC = 0x00FF0000;
    int regbBlackC = 0x00000000;

    // TODO:  Change any attributes of the DC here
    switch (nCtlColor)
    {
    case CTLCOLOR_STATIC:

        if (nColor == regbBlackC)
        {
            pDC->SetTextColor(RGB(0, 0, 255));
            nColor = rgbBlueC;
        }
        else if (nColor == rgbBlueC)
        {
            pDC->SetTextColor(RGB(255, 0, 0));
            nColor = rgbRedC;
        }
    }
    return hbr;
}

void CFileRenamerDlg::OnBnClickedGo()
{
    CWnd* pWnd = this->GetDlgItem(IDC_STATIC_TEXT);
    pWnd->Invalidate(0);
}
© www.soinside.com 2019 - 2024. All rights reserved.