更改只读编辑控件的背景颜色






4.22/5 (35投票s)
2005年1月19日
3分钟阅读

174458

5610
关于非常容易地更改只读编辑控件颜色的文章
引言
这是我的第一篇文章。所以请多多包涵。我知道这是一个简单的控件,但我花了很多时间才弄清楚。我希望有人能读懂这篇文章并更快地理解它。
问题
我需要一个只读文本框。我使用 CEdit
控件创建了一个。问题是它有一个灰色背景。没有直接更改它的选项或函数。
解决方案
我从 CEdit
派生了一个名为 CReadOnlyEdit
的类。我拦截了背景 ON_WM_CTLCOLOR_REFLECT()
消息。此消息的函数如下所示
HBRUSH CReadOnlyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Return a non-NULL brush if the parent's
//handler should not be called
return NULL;
}
要更改 EditBox
的背景颜色,而不是为上面的函数返回 NULL
,我返回了一个带有我想要的背景颜色的画笔。此外,如果您注意到函数中,上面其中一个参数是指向控件的设备上下文 (pDC
) 的指针。我使用 pDC->SetTextColor(COLORREF rgb)
函数来更改文本颜色。然后我遇到了一个小问题。背景变成了正确的颜色,文本也是如此,但文本的背景仍然是白色。这是一个简单的修复。我只是使用 pDC->SetBkColor(COLORREF rgb)
函数设置了文本的背景颜色。这是我修改后的函数
HBRUSH CReadOnlyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Return a non-NULL brush if the parent's
//handler should not be called
//set text color
pDC->SetTextColor(m_crText);
//set the text's background color
pDC->SetBkColor(m_crBackGnd);
//return the brush used for background this sets control background
return m_brBackGnd;
}
如您所见,我的控件有三个变量:COLORREF m_crText
, COLORREF m_crBackGnd
, 和 CBrush m_brBackGnd
。我在我的控件中添加了两个函数,一个用于更改背景颜色(并更新画笔),一个用于更改文本颜色。这两个函数如下所示
void CReadOnlyEdit::SetBackColor(COLORREF rgb)
{
//set background color ref (used for text's background)
m_crBackGnd = rgb;
//free brush
if (m_brBackGnd.GetSafeHandle())
m_brBackGnd.DeleteObject();
//set brush to new color
m_brBackGnd.CreateSolidBrush(rgb);
//redraw
Invalidate(TRUE);
}
void CReadOnlyEdit::SetTextColor(COLORREF rgb)
{
//set text color ref
m_crText = rgb;
//redraw
Invalidate(TRUE);
}
我有一个 COLORREF
背景变量的原因是,要更改设备上下文的背景颜色,我需要一个 COLORREF
。我遇到的一个问题是,整个编辑控件没有立即被着色,这就是为什么我添加了 Invalidate(TRUE)
调用来重绘控件。
就这样。顺便说一句,我的控件默认不设置背景或文本颜色。这可以在构造函数中轻松完成。
Using the Code
基于对话框
创建一个 CEdit
控件。双击控件。出现添加成员变量对话框。选择控件作为类别,CEdit
作为变量类型。将变量名称设置为类似 m_wndEdit
的名称。修改控件时,请记住 m_wndEdit
是控件,而不是包含窗口文本的 string
。要访问文本,您将必须使用该控件的适当函数(即 CEdit::SetWindowText()
)。
以编程方式
我认为使用此功能的最简单方法是,将您希望只读的所有 CEdit
控件更改为 CReadOnlyEdit
。
更改颜色
使用 SetBackColor(COLORREF rgb)
和 SetTextColor(COLORREF rgb)
函数更改控件的背景和文本颜色。在演示中,我使用 CColorDialog
来获取颜色。以下是我的演示中的代码。它位于“更改背景颜色”按钮的单击函数中
void CReadOnlyDlg::OnBack()
{
// call color dialog and change background color
CColorDialog dlg;
if (dlg.DoModal() == IDOK)
m_wndReadOnly.SetBackColor(dlg.GetColor());
}
其中 m_wndReadOnly
是 CReadOnlyEdit
控件。
注意:我的控件不设置 read-only
标志,您必须在 CReadOnlyEdit::Create
函数或对话框控件属性中自己完成此操作。此外,这可以使用 CEdit::SetReadOnly(BOOL)
函数完成。
历史
- 2005 年 1 月 21 日 - 更新
- 修复了错误
- 添加了
SetBackColor
和SetTextColor
函数
- 2005 年 1 月 18 日 - 发布
- 基本控件,将背景颜色更改为白色
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。