如何改变编辑框(CEdit)的背景颜色?在线等待... 如何改变编辑框(CEdit)的背景颜色? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 思路:在控件显示之前,每一个控件会向父对话框发送一个WM_CTLCOLOR消息,这个消息缺省处理函数CWnd::OnCtlColor返回一个HBRUSH类型的句柄,这样,就可以设置前景和背景文本颜色,并为控件或者对话框的非文本区域选定一个刷子。 点击Class Wizard,给testDlg加入WM_CTLCOLOR事件,单击Edit Code按钮,然后把改函数的内容替换为如下代码: if(nCtlColor== CTLCOLOR_LISTBOX){ pDC->SetBkMode(TRANSPARENT); //此处设置字体的颜色 pDC->SetTextColor(RGB(255,255,255)); return m_hbrush;}else return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); BRUSH CTest6Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); switch(nCtlColor) { case CTLCOLOR_EDIT: if(pWnd->GetDlgCtrlID() == IDC_EDIT2) { static HBRUSH hbrEdit = ::CreateSolidBrush( RGB(0, 255, 0) ); pDC->SetBkColor( RGB(255, 0, 0) ); pDC->SetTextColor( RGB(0, 255, 0) ); return hbrEdit; } } // TODO: Return a different brush if the default is not desired return hbr;} 噢,我现在同时要实现这样的功能,就是当光标在编辑框里面的时候改变该编辑框的背景颜色,当时光标不在里面的时候恢复默认颜色!请问应该如何实现呢?重载OnFocus(),OnKillFocus()函数就行了背景色的设置,楼上几个都说的对 大家伙试一下,希望有帮助用VC如何改变编辑框的背景颜色在VC中,编辑框的颜色改变起来似乎很难,MFC的CEdit类后没有提供可改变颜色的函数。在本文中,我们将重载CEdit类,编写一个可以改变背景颜色的类CMyEdit类,将编辑框的变量定义为CMyEdit类型来实现改变编辑框的背景颜色。一、构建应用程序 新建一个基于对话框基础的程序ChangeEdit,然后在对话框的摸板上删除静态文本框,添加三个编辑框。二、打造自己的CMyEdit类 1.添加CMyEdit类 生成好应用程序之后,我们可以利用类向导生成器添加一个新类。将新类命名为CMyEdit,继承自CEdit类。 2.添加成员变量 类生成好后,再添加成员变量,在此,我们需要添加三个私有类型的成员变量,COLORREF变量保存当前颜色,CBrush 变量保存改变后的刷子颜色,CString 变量保存当前编辑框的内容。如下所示。private:CBrush m_Brush;CString m_Text;COLORREF m_BackColor; 3.添加成员函数 1)添加两个公有类型的成员函数:public:void SetControlFocus();void SetBkGrndColor();其定义如下:void CMyEdit::SetControlFocus(){ //将变量m_BackColor的值设为黄色 m_BackColor = RGB(255,255,0); }void CMyEdit::SetBkGrndColor(){// 删除旧的刷子 m_Brush.DeleteObject();//创建一个m_BackColor颜色的刷子 m_Brush.CreateSolidBrush(m_BackColor); CDC* pDC = GetDC();//设置文字显示模式,OPAQUE为独占模式 pDC->SetBkMode(OPAQUE);//设置文字的背景颜色 pDC->SetBkColor(m_BackColor);//选择刷子 pDC->SelectObject(&m_Brush); CRect rc;GetClientRect(&rc);ScreenToClient(&rc);//绘制一个矩形 pDC->Rectangle(0, 0, rc.Width(), rc.Height());//设置文本颜色 pDC->SetTextColor(RGB(0, 0, 0,));//输出文本 pDC->TextOut(2, 2, m_Text.GetBuffer(m_Text.GetLength()));} 2)重载虚拟函数OnChildNotify(): 将OnChildNotify()函数的定义为如下形式:BOOL CMyEdit::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult){// We only want to handle WM_CTLCOLOREDIT messages - 32 bit only //如果消息为WM_CTLCOLOREDIT,则返回基类的OnChildNotify函数if (message != WM_CTLCOLOREDIT) {return CEdit::OnChildNotify(message, wParam, lParam, pLResult);}HDC hdcChild = (HDC)wParam;//设置文字颜色为黑色,也可以修改为其他颜色SetTextColor(hdcChild, RGB(0,0,0));//设置背景颜色为m_BackColor颜色SetBkColor(hdcChild, m_BackColor); return TRUE;} 3)添加三个windows消息处理函数:ON_WM_SETFOCUS、ON_WM_KILLFOCUS、ON_WM_PAINT,主要是用来处理编辑框获得焦点和失去焦点的颜色改变效果。 将这三个函数定义为如下形式://当编辑框获得焦点时改变背景颜色为黄色void CMyEdit::OnSetFocus(CWnd* pOldWnd) {CEdit::OnSetFocus(pOldWnd);m_BackColor = RGB(255,255,0);Invalidate(FALSE);}//当编辑框失去焦点时改变背景颜色为白色void CMyEdit::OnKillFocus(CWnd* pNewWnd) {CEdit::OnKillFocus(pNewWnd);//设置背景颜色为白色,也可以设为其他颜色m_BackColor = RGB(255,255,255);Invalidate(FALSE); }//重画编辑框 void CMyEdit::OnPaint() {CPaintDC dc(this);// TODO: Add your message handler code hereGetWindowText(m_Text);SetBkGrndColor();//不调用CEdit::OnPaint()}4.完善构造和析构函数 通过以上的工作,我们作好了CMyEdit类的主体工作,当然,还需要在类的构造函数中设置编辑框的初始颜色信息和刷子信息。在析构函数中删除已经创建的刷子。如下所示:CMyEdit::CMyEdit(){m_BackColor = RGB(255,255,255);m_Brush.CreateSolidBrush(m_BackColor);}CMyEdit::~CMyEdit(){m_Brush.DeleteObject();} 这样,我们便打造完了自己的CMyEdit类,然后直接在前面生成的应用程序中调用即可。三、继承CMyEdit类 现在,我们又回到最开始生成的应用程序中,前面已经添加了三个编辑框,这里我们利用ClassWizard来为三个编辑框添加成员变量,分别为这三个编辑框添加一个控制(control)类型的成员变量,特别注意的是继承的基类选择刚才做好的CMyEdit类。 上面的工作全部做完之后编译运行,你会发现在主程序中不用写一句代码便可改变编辑框的颜色,当编辑框获得输入焦点时,编辑框变为黄色,失去输入焦点时变为白色。 这里介绍的方法还有更多可以改进的地方,我们主要是给大家提供一种思路,希望能起到抛砖引玉的作用。有兴趣的话不妨试试。 添加个控制(control)类型的成员变量,特别注意的是继承的基类选择刚才做好的CMyEdit类我是初学者,不知道怎么使用,这个成员变量,那位大侠,续一续 请大家推荐一两网络编程方面的经典书籍(C++) 如何获取本机的网络连接方式 把运行库改为MT之后,出现N多无法解析的外部符号怎么办? CVS 非常 慢慢是什么原因呢? 如何判断"中国人"里面包含"中国"?解决立马送分!| [求助]用CSocket编写的C/S程序,server端出现内存泄露(Detected memory leaks!),却查不出错误~~~~~ 如何强制结束一个进程?急! 怪问题。 谢谢,来看一下,help~~~ OnDropFiles不响应,求讨论。 指南针的神经网络学说 如何向窗口发送消息模拟鼠标操作? 如何将一个多文档程序改成单文档程序
{
pDC->SetBkMode(TRANSPARENT);
//此处设置字体的颜色
pDC->SetTextColor(RGB(255,255,255)); return m_hbrush;
}
else
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
{ HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); switch(nCtlColor)
{
case CTLCOLOR_EDIT:
if(pWnd->GetDlgCtrlID() == IDC_EDIT2)
{
static HBRUSH hbrEdit = ::CreateSolidBrush( RGB(0, 255, 0) );
pDC->SetBkColor( RGB(255, 0, 0) );
pDC->SetTextColor( RGB(0, 255, 0) );
return hbrEdit;
}
} // TODO: Return a different brush if the default is not desired
return hbr;
}
重载OnFocus(),OnKillFocus()函数就行了
背景色的设置,楼上几个都说的对
用VC如何改变编辑框的背景颜色
在VC中,编辑框的颜色改变起来似乎很难,MFC的CEdit类后没有提供可改变颜色的函数。在本文中,我们将重载CEdit类,编写一个可以改变背景颜色的类CMyEdit类,将编辑框的变量定义为CMyEdit类型来实现改变编辑框的背景颜色。一、构建应用程序
新建一个基于对话框基础的程序ChangeEdit,然后在对话框的摸板上删除静态文本框,添加三个编辑框。
二、打造自己的CMyEdit类
1.添加CMyEdit类
生成好应用程序之后,我们可以利用类向导生成器添加一个新类。
将新类命名为CMyEdit,继承自CEdit类。
2.添加成员变量
类生成好后,再添加成员变量,在此,我们需要添加三个私有类型的成员变量,COLORREF变量保存当前颜色,CBrush 变量保存改变后的刷子颜色,CString 变量保存当前编辑框的内容。如下所示。
private:
CBrush m_Brush;
CString m_Text;
COLORREF m_BackColor;
3.添加成员函数
1)添加两个公有类型的成员函数:
public:
void SetControlFocus();
void SetBkGrndColor();
其定义如下:
void CMyEdit::SetControlFocus()
{
//将变量m_BackColor的值设为黄色
m_BackColor = RGB(255,255,0);
}
void CMyEdit::SetBkGrndColor()
{
// 删除旧的刷子
m_Brush.DeleteObject();
//创建一个m_BackColor颜色的刷子
m_Brush.CreateSolidBrush(m_BackColor);
CDC* pDC = GetDC();
//设置文字显示模式,OPAQUE为独占模式
pDC->SetBkMode(OPAQUE);
//设置文字的背景颜色
pDC->SetBkColor(m_BackColor);
//选择刷子
pDC->SelectObject(&m_Brush);
CRect rc;
GetClientRect(&rc);
ScreenToClient(&rc);
//绘制一个矩形
pDC->Rectangle(0, 0, rc.Width(), rc.Height());
//设置文本颜色
pDC->SetTextColor(RGB(0, 0, 0,));
//输出文本
pDC->TextOut(2, 2, m_Text.GetBuffer(m_Text.GetLength()));}
2)重载虚拟函数OnChildNotify():
将OnChildNotify()函数的定义为如下形式:
BOOL CMyEdit::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult)
{
// We only want to handle WM_CTLCOLOREDIT messages - 32 bit only
//如果消息为WM_CTLCOLOREDIT,则返回基类的OnChildNotify函数
if (message != WM_CTLCOLOREDIT)
{
return CEdit::OnChildNotify(message, wParam, lParam, pLResult);
}
HDC hdcChild = (HDC)wParam;
//设置文字颜色为黑色,也可以修改为其他颜色
SetTextColor(hdcChild, RGB(0,0,0));
//设置背景颜色为m_BackColor颜色
SetBkColor(hdcChild, m_BackColor);
return TRUE;
}
3)添加三个windows消息处理函数:ON_WM_SETFOCUS、ON_WM_KILLFOCUS、ON_WM_PAINT,主要是用来处理编辑框获得焦点和失去焦点的颜色改变效果。
将这三个函数定义为如下形式:
//当编辑框获得焦点时改变背景颜色为黄色
void CMyEdit::OnSetFocus(CWnd* pOldWnd)
{
CEdit::OnSetFocus(pOldWnd);
m_BackColor = RGB(255,255,0);
Invalidate(FALSE);
}
//当编辑框失去焦点时改变背景颜色为白色
void CMyEdit::OnKillFocus(CWnd* pNewWnd)
{
CEdit::OnKillFocus(pNewWnd);
//设置背景颜色为白色,也可以设为其他颜色
m_BackColor = RGB(255,255,255);
Invalidate(FALSE);
}
//重画编辑框
void CMyEdit::OnPaint()
{
CPaintDC dc(this);
// TODO: Add your message handler code here
GetWindowText(m_Text);
SetBkGrndColor();
//不调用CEdit::OnPaint()
}
4.完善构造和析构函数
通过以上的工作,我们作好了CMyEdit类的主体工作,当然,还需要在类的构造函数中设置编辑框的初始颜色信息和刷子信息。在析构函数中删除已经创建的刷子。如下所示:
CMyEdit::CMyEdit()
{
m_BackColor = RGB(255,255,255);
m_Brush.CreateSolidBrush(m_BackColor);
}
CMyEdit::~CMyEdit()
{
m_Brush.DeleteObject();
}
这样,我们便打造完了自己的CMyEdit类,然后直接在前面生成的应用程序中调用即可。
三、继承CMyEdit类
现在,我们又回到最开始生成的应用程序中,前面已经添加了三个编辑框,这里我们利用ClassWizard来为三个编辑框添加成员变量,分别为这三个编辑框添加一个控制(control)类型的成员变量,特别注意的是继承的基类选择刚才做好的CMyEdit类。
上面的工作全部做完之后编译运行,你会发现在主程序中不用写一句代码便可改变编辑框的颜色,当编辑框获得输入焦点时,编辑框变为黄色,失去输入焦点时变为白色。 这里介绍的方法还有更多可以改进的地方,我们主要是给大家提供一种思路,希望能起到抛砖引玉的作用。有兴趣的话不妨试试。
我是初学者,不知道怎么使用,这个成员变量,
那位大侠,续一续