在编辑控件中更改文本的背景

时间:2010-02-14 20:25:16

标签: c++ api winapi

您可以更改编辑控件区域中保持静态的文本背景吗?

4 个答案:

答案 0 :(得分:11)

在编辑控件的父级中,处理WM_CTLCOLORSTATIC消息,此消息的wParam是Edit控件即将绘制的HDC, 对于大多数CTLCOLOR消息,如果将文本和背景颜色设置为此DC,控件将使用您设置的颜色。

你也可以返回一个HBRUSH,并且控制器会将它用于任何画笔绘画,但许多控件不会使用很多画笔,因此对某些画笔效果有限 CTLCOLOR消息。这里最好的选择是返回DC画笔,并设置DC画笔颜色以匹配DC的BkColor。

 LRESULT lRet = 0; // return value for our WindowProc.
 COLORREF crBk = RGB(255,0,0); // use RED for Background.

 ... 

 case WM_CTLCOLORSTATIC:
    {
    HDC hdc = (HDC)wParam;
    HWND hwnd = (HWND)lParam; 

    // if multiple edits and only one should be colored, use
    // the control id to tell them apart.
    //
    if (GetDlgCtrlId(hwnd) == IDC_EDIT_RECOLOR)
       {
       SetBkColor(hdc, crBk); // Set to red
       SetDCBrushColor(hdc, crBk);
       lRet = (LRESULT) GetStockObject(DC_BRUSH); // return a DC brush.
       }
    else
       {
       lRet = DefWindowProc(hwnd, uMsg, wParam, lParam);
       }
    }
    break;

答案 1 :(得分:6)

WM_CTLCOLORSTATIC用于静态文本控制。

简单来说,您可以在winproc中执行此操作:

...
case WM_CTLCOLOREDIT:
{
    HDC hdc = (HDC)wParam;
    SetTextColor(hdc, yourColor);  // yourColor is a WORD and it's format is 0x00BBGGRR
    return (LRESULT) GetStockObject(DC_BRUSH); // return a DC brush.
}
...

如果你有多个编辑控件,你可以使用item id和lParam来检查哪一个需要更改。

答案 2 :(得分:2)

WM_CTLCOLOREDIT允许你设置文字和背景颜色(+画笔),如果你想要更多的控制,你必须子类和自己画画

答案 3 :(得分:0)

你可以这样做:

CBrush bkBrush;
RECT ctrlRect;
COLORREF crBk = RGB(255,0,0); // Red color
bkBrush.CreateSolidBrush(crBk);

CWnd* pDlg = CWnd::GetDlgItem(IDC_EDIT);
pDlg->GetClientRect(&ctrlRect);
pDlg->GetWindowDC()->FillRect(&ctrlRec, &bkBrush);
pDlg->GetWindowDC()->SetBkColor(crBk);

这应该改变编辑控件的背景颜色