【问题标题】:Change text color on button push WIN32更改按钮按下 WIN32 上的文本颜色
【发布时间】:2014-03-24 09:12:36
【问题描述】:

如何在按钮按下时从编辑框中更改文本颜色? (Win32/C++)。 我知道如何更改文本字体(即在WM_COMMANDSendMessage() 中使用 WM_SETFONT)。
在更改文本颜色时,我认为我需要WM_COMMANDWM_CTLCOLOREDITSendMessage() 之间的交互,但不知道使用哪种参数。 谢谢你。

我已经想出了如何在单个按钮上执行此操作。 请再问一个问题。如果我将上面的代码用于 3 个不同的按钮,它的行为将不符合预期。有一个sn-p :

case IDC_BUTTON3:
{
    textFlagRed = textFlagRed;
    textFlagBlue = !textFlagBlue;
    textFlagGreen = !textFlagGreen;
    InvalidateRect(textArea2, NULL, TRUE);
    break;
}

case IDC_BUTTON4:
{
    textFlagGreen = textFlagGreen;
    textFlagBlue = !textFlagBlue;
    textFlagRed = !textFlagRed;
    InvalidateRect(textArea2, NULL, TRUE);
    break;
}

case IDC_BUTTON5:
{
    textFlagBlue = textFlagBlue;
    textFlagRed = !textFlagRed;
    textFlagGreen = !textFlagGreen;
    InvalidateRect(textArea2, NULL, TRUE);
    break;
}

WM_CTLCOLORSTATIC

if (textFlagRed && (HWND)lParam == textArea2)
{   
    HBRUSH hbr = (HBRUSH) DefWindowProc(hwnd, message, wParam, lParam);
    SetTextColor((HDC) wParam, RGB(255, 0, 0));
    return (BOOL) hbr;
}
else if (textFlagBlue && (HWND)lParam == textArea2)
{   
    HBRUSH hbr = (HBRUSH) DefWindowProc(hwnd, message, wParam, lParam);
    SetTextColor((HDC) wParam, RGB(0, 0, 255));
    return (BOOL) hbr;
}
else if (textFlagGreen && (HWND)lParam == textArea2)
{   
    HBRUSH hbr = (HBRUSH) DefWindowProc(hwnd, message, wParam, lParam);
    SetTextColor((HDC) wParam, RGB(0, 255, 0));
    return (BOOL) hbr;
} 
break;

总是蓝色。

【问题讨论】:

  • 我真的看不出任何明显的逻辑错误 - 尝试放入调试语句和/或断点以查看变量的值以及为什么它总是显示为蓝色?
  • 那是我的烂摊子,变量没有声明为静态的。感谢您的回复。

标签: c++ winapi


【解决方案1】:

你需要

a) 一个全局布尔值,用于指示是否需要更改颜色(例如 bEditRed

b) 按下按钮:设置/切换bEditRed 并使编辑框InvalidateRect(hWndEdit, NULL, TRUE) 无效

c) 在对话过程中处理“WM_CTLCOLOREDIT”消息:

case WM_CTLCOLOREDIT:
{   if (bEditRed && (HWND)lParam == hWndEdit)
    {   HBRUSH hbr = (HBRUSH) DefWindowProc(hDlg, iMessage, wParam, lParam);
        SetTextColor((HDC) wParam, RGB(255, 0, 0));
        return (BOOL) hbr;
    }
    return FALSE;
}

【讨论】:

  • 其实一开始文字就是红色的。
  • @rhauder_ - 确实如此。只需创建一个用作布尔标志的变量。如果标志设置 and if ((HWND)lParam == hWndEdit) 然后你运行代码。只需在按钮处理程序中设置/切换/清除标志,然后使编辑控件无效。
【解决方案2】:

爱德华的答案的替代方法是使用

RedrawWindow(windowHandle, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);

而不是

InvalidateRect(windowHandle, NULL, TRUE)

前者会立即重绘你的窗口,而后者在主窗口再次可用之前不会重绘它。

【讨论】:

    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多