改变EDIT控件的背景颜色 请问用什么函数能动态地改变它的背景颜色呢,我用过SETBKCOLOR+SETBKMODE不行,而FILLRECT就不能改变光标所在的地方 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor );参见msdn,csdn上有很多,可以找一下。 //利用WM_CTLCOLOR消息实现Edit Control的文本与背景色的改变首先要明白:WM_CTLCOLOR是一个由控制(Control)发送给它父窗口的通知消息(Notification message)。实现步骤:生成一个标准的单文档应用程序框架,假设应用程序的名称为Color。我将利用它的About对话框做示范。在About dialog中添加两个Edit control,设定其ID为IDC_EDIT1与IDC_EDIT2。第一种方法(对应于IDC_EDIT1): 按照标准的Windows编程,由其父窗口的消息处理函数负责处理WM_CTLCOLOR消息。1. 在CAboutDlg中添加一个数据成员:HBRUSH m_brMine;2. 利用向导映射AboutDlg的WM_CTLCOLOR消息,产生函数:HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);pDC是AboutDlg的设备上下文,pWnd是AboutDlg中发送该消息的control指针,nCtlColor市Control的类型编码。对其进行如下修改:HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { if ((pWnd->GetDlgCtrlID() == IDC_EDIT1) && (nCtlColor == CTLCOLOR_EDIT)) { COLORREF clr = RGB(255,0,0); pDC->SetTextColor(clr); //设置红色的文本 clr = RGB(0,0,0); pDC->SetBkColor(clr); //设置黑色的背景 m_brMine = ::CreateSolidBrush(clr); return m_brMine; //作为约定,返回背景色对应的刷子句柄 } else { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); return hbr; }}第二种方法(对应于IDC_EDIT2): 利用MFC 4.0的新特性: Message reflection。1.利用向导添加一个新的类:CColorEdit,基类为CEdit;2.在CColorEdit中添加一个数据成员: HBRUSH m_bkBrush;3.利用向导映射CColorEdit的"=WM_CTLCOLOR"消息,产生函数:HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor); 对其进行如下修改:HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor) { COLORREF clr = RGB(0,0,0); pDC->SetTextColor(clr); //设置黑色的文本 clr = RGB(255,0,0); pDC->SetBkColor(clr); //设置红色的背景 m_bkBrush = ::CreateSolidBrush(clr); return m_bkBrush; //作为约定,返回背景色对应的刷子句柄}4.利用向导为IDC_EDIT2生成一个数据成员CColorEdit m_coloredit;5.在定义CAboutDlg的color.cpp文件中加入:#include "coloredit.h" 响应WM_CTLCOLOR消息SetBkColor 如果用API写的话又是怎样写呢,我是这样的: Color=Rgb(100,0,0) SetBkColor hdc,Color但不能成功,总返回-1 哦返回成功了,但为何也改变不了它的颜色呢,请各位高手详细地写一写API的方法,因为我也要把它应用到VB里面,谢谢 你可以参考例子ctlcolorexplorer.zip(http://www.china-askpro.com/download/ctlcolorexplorer.zip),这个例子是关于这方面的最详细的演示,包括各种控件的颜色和字体的设置。 纯API的方法还是没有研究出来啊,请大家把MFC的方法改成API给我看看,其实上面的第一种方法里面,我最不明白的是这一句:return m_bkBrush;当返回一个正确的画刷的句柄的时候,HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)这个消息影射函数又是对这个返回值做了些什么的处理呢,我觉得关键是这里 我再顶,我就不信整个CSDN都没有人会 有个WM_ERASEBKGND消息用语处理背景. 自己写一个控件类继承CEDIT类,然后自定义一个方法,用化刷重新绘制背景。然后,你就可以这个类生成的对象调用该方法,动态来改变颜色了。我这里有这个类的一个示例代码:// ColorStatic.h : header fileclass CColorStatic : public CStatic{……//省略了无关代码public: void SetTextColor(COLORREF TextColor); COLORREF m_TextColor; void SetBackColor(COLORREF BackColor); void SetCaption(CString strCaption); void Create(CString strCaption,COLORREF BackColor); COLORREF m_BackColor; CString m_strCaption;protected: //{{AFX_MSG(CColorStatic) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnPaint(); //}}AFX_MSG DECLARE_MESSAGE_MAP()}// ColorStatic.cppBEGIN_MESSAGE_MAP(CColorStatic, CStatic) //{{AFX_MSG_MAP(CColorStatic) ON_WM_CREATE() ON_WM_PAINT() //}}AFX_MSG_MAPEND_MESSAGE_MAP()void CColorStatic::OnPaint() //重画Static{ CPaintDC dc(this); // device context for painting CRect rect; GetClientRect(&rect); dc.SetBkColor(m_BackColor); dc.SetBkMode(TRANSPARENT); CFont *pFont=GetParent()->GetFont();//得到父窗体的字体 CFont *pOldFont; pOldFont=dc.SelectObject(pFont);//选用父窗体的字体 dc.SetTextColor(m_TextColor);//设置文本颜色 dc.DrawText(m_strCaption,&rect,DT_CENTER);//将文本画在Static的中央 dc.SelectObject(pOldFont); // Do not call CStatic::OnPaint() for painting messages}void CColorStatic::SetCaption(CString strCaption){ m_strCaption=strCaption;//设置Static文本}void CColorStatic::SetBackColor(COLORREF BackColor){ m_BackColor=BackColor;//设置背景颜色}void CColorStatic::SetTextColor(COLORREF TextColor){ m_TextColor=TextColor;//设置文字颜色}使用代码:m_ColorEdit.SubclassDlgItem(IDC_EDIT1,this);// IDC_EDIT1是其中一个EDIT的IDm_ColorEdit.SetBackColor(RGB(222,223,222));// RGB(222,223,222)就是要改变的背景颜色通过改变RGB的值,就可以动态改变EDIT控件的背景颜色了。 HBRUSH CSetupDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { COLORREF clr; switch(nCtlColor) { case CTLCOLOR_EDIT: clr = RGB(160,0,0); pDC->SetTextColor(clr); //设置黑色的文本 clr = RGB(166,210,210); pDC->SetBkColor(clr); //设置淡蓝色的背景 m_brMine = ::CreateSolidBrush(clr); return m_brMine; //返回对应的刷子句柄 default: HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); return hbr; }} 纯API的方法就没有人会吗,我再顶 vb里面设置背景色用的着API吗?直接就可以附值 试了一下,响应WM_CTLCOLOR好像是不行的重载CButton类才能改变,在他的DrawItem里修改 to :crystal521(水晶泪) m_brMine = ::CreateSolidBrush(clr);这句最好不放在CTLCOLOR内部,GDI泄露,因为没有释放。不信可以用管理器看一下,放到外边就可以了,句柄的返回放到这里就可以。在CTLCOLOR中好象可以改变啊,主要是由于RGB的原因,你可以用CColorDlg返回值而不用RGB,那样就可以改变颜色。可能 RGB需要做个转换 http://community.csdn.net/Expert/topic/3370/3370672.xml?temp=.679516 vb里面设置背景色用的着API吗?直接就可以赋值这个标准答案!! 简单界面解释一下 VC++开发数据库的优势有那些? execl怎样用? 对话框中菜单、工具栏的消息怎么响应呀 本人以前学VB的,现在狠下心来学VC了,希望大家帮忙,指导! 有谁有可以设置代理,及HTTP头的Http得Socket类??[急] 如何强行关闭被别的程序打开的串口? 请各位大侠 介绍几本 关于详细讲解 制作Activex组件和COM基础的书 如何让组合框无法输入文字,只能选择内容? 请问如何实现类似fpe的在某个进程的地址空间里快速查找某个数据位置的功能 [求助]一个IP编辑控件 求数据库的用户登陆和密码修改的用户管理的源代码!!!!!
参见msdn,csdn上有很多,可以找一下。
首先要明白:WM_CTLCOLOR是一个由控制(Control)发送给它父窗口的通知消息(Notification message)。实现步骤:
生成一个标准的单文档应用程序框架,假设应用程序的名称为Color。我将利用它的About对话框做示范。在About dialog中添加两个Edit control,设定其ID为IDC_EDIT1与IDC_EDIT2。第一种方法(对应于IDC_EDIT1): 按照标准的Windows编程,由其父窗口的消息处理函数负责处理WM_CTLCOLOR消息。1. 在CAboutDlg中添加一个数据成员:HBRUSH m_brMine;
2. 利用向导映射AboutDlg的WM_CTLCOLOR消息,产生函数:HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
pDC是AboutDlg的设备上下文,pWnd是AboutDlg中发送该消息的control指针,nCtlColor市Control的类型编码。对其进行如下修改:HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if ((pWnd->GetDlgCtrlID() == IDC_EDIT1) && (nCtlColor == CTLCOLOR_EDIT))
{
COLORREF clr = RGB(255,0,0);
pDC->SetTextColor(clr); //设置红色的文本
clr = RGB(0,0,0);
pDC->SetBkColor(clr); //设置黑色的背景
m_brMine = ::CreateSolidBrush(clr);
return m_brMine; //作为约定,返回背景色对应的刷子句柄
}
else
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
}第二种方法(对应于IDC_EDIT2):
利用MFC 4.0的新特性: Message reflection。1.利用向导添加一个新的类:CColorEdit,基类为CEdit;
2.在CColorEdit中添加一个数据成员: HBRUSH m_bkBrush;
3.利用向导映射CColorEdit的"=WM_CTLCOLOR"消息,产生函数:HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor); 对其进行如下修改:HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
COLORREF clr = RGB(0,0,0);
pDC->SetTextColor(clr); //设置黑色的文本
clr = RGB(255,0,0);
pDC->SetBkColor(clr); //设置红色的背景
m_bkBrush = ::CreateSolidBrush(clr);
return m_bkBrush; //作为约定,返回背景色对应的刷子句柄
}4.利用向导为IDC_EDIT2生成一个数据成员CColorEdit m_coloredit;
5.在定义CAboutDlg的color.cpp文件中加入:#include "coloredit.h"
SetBkColor
Color=Rgb(100,0,0)
SetBkColor hdc,Color
但不能成功,总返回-1
当返回一个正确的画刷的句柄的时候,HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)这个消息影射函数又是对这个返回值做了些什么的处理呢,我觉得关键是这里
class CColorStatic : public CStatic
{
……//省略了无关代码
public:
void SetTextColor(COLORREF TextColor);
COLORREF m_TextColor;
void SetBackColor(COLORREF BackColor);
void SetCaption(CString strCaption);
void Create(CString strCaption,COLORREF BackColor);
COLORREF m_BackColor;
CString m_strCaption;
protected:
//{{AFX_MSG(CColorStatic)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnPaint();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}
// ColorStatic.cpp
BEGIN_MESSAGE_MAP(CColorStatic, CStatic)
//{{AFX_MSG_MAP(CColorStatic)
ON_WM_CREATE()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()void CColorStatic::OnPaint() //重画Static
{
CPaintDC dc(this); // device context for painting
CRect rect;
GetClientRect(&rect);
dc.SetBkColor(m_BackColor);
dc.SetBkMode(TRANSPARENT);
CFont *pFont=GetParent()->GetFont();//得到父窗体的字体
CFont *pOldFont;
pOldFont=dc.SelectObject(pFont);//选用父窗体的字体
dc.SetTextColor(m_TextColor);//设置文本颜色
dc.DrawText(m_strCaption,&rect,DT_CENTER);//将文本画在Static的中央
dc.SelectObject(pOldFont); // Do not call CStatic::OnPaint() for painting messages
}void CColorStatic::SetCaption(CString strCaption)
{
m_strCaption=strCaption;//设置Static文本
}void CColorStatic::SetBackColor(COLORREF BackColor)
{
m_BackColor=BackColor;//设置背景颜色
}void CColorStatic::SetTextColor(COLORREF TextColor)
{
m_TextColor=TextColor;//设置文字颜色
}
使用代码:m_ColorEdit.SubclassDlgItem(IDC_EDIT1,this);// IDC_EDIT1是其中一个EDIT的ID
m_ColorEdit.SetBackColor(RGB(222,223,222));// RGB(222,223,222)就是要改变的背景颜色
通过改变RGB的值,就可以动态改变EDIT控件的背景颜色了。
{
COLORREF clr;
switch(nCtlColor)
{
case CTLCOLOR_EDIT:
clr = RGB(160,0,0);
pDC->SetTextColor(clr); //设置黑色的文本 clr = RGB(166,210,210);
pDC->SetBkColor(clr); //设置淡蓝色的背景
m_brMine = ::CreateSolidBrush(clr);
return m_brMine; //返回对应的刷子句柄 default:
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
}
重载CButton类才能改变,在他的DrawItem里修改
m_brMine = ::CreateSolidBrush(clr);
这句最好不放在CTLCOLOR内部,GDI泄露,因为没有释放。不信可以用管理器看一下,放到外边就可以了,句柄的返回放到这里就可以。
在CTLCOLOR中好象可以改变啊,主要是由于RGB的原因,你可以用CColorDlg返回值而不用RGB,那样就可以改变颜色。可能 RGB需要做个转换