65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.22/5 (35投票s)

2005年1月19日

3分钟阅读

viewsIcon

174458

downloadIcon

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_wndReadOnlyCReadOnlyEdit 控件。

注意:我的控件不设置 read-only 标志,您必须在 CReadOnlyEdit::Create 函数或对话框控件属性中自己完成此操作。此外,这可以使用 CEdit::SetReadOnly(BOOL) 函数完成。

历史

  • 2005 年 1 月 21 日 - 更新
    • 修复了错误
    • 添加了 SetBackColorSetTextColor 函数
  • 2005 年 1 月 18 日 - 发布
    • 基本控件,将背景颜色更改为白色

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.