如何改变mfc对话框程序,mfc获取edit控件内容的背景颜色

MFC窗口颜色的设置 - 推酷
MFC窗口颜色的设置
本文主要介绍对话框背景色以及控件颜色的设置(SetDialogBkColor()不再被支持)。
对话框背景色的设置
消息,代码如下所示:
void CtestDlg::OnPaint()
if (IsIconic())
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast&WPARAM&(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
//CDialogEx::OnPaint();
//设置为绿色背景
GetClientRect(rect);
dc.FillSolidRect(rect,RGB(0,255,0));
OnCtlColor
(CDC* pDC, CWnd* pWnd, UINT nCtlColor),即
WM_CTLCOLOR
a)在对话框的.h文件中添加CBrush类的成员m_brush
b)在对话框的.cpp文件中的OnInitDialog()中添加以下代码(背景红色):
m_brush.CreateSolidBrush(RGB(255,0,0));
c)重载OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor),代码如下:
HBRUSH CtestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
在此更改 DC 的任何特性
if(nCtlColor == CTLCOLOR_DLG)
//返加红色刷子
如果默认的不是所需画笔,则返回另一个画笔
控件颜色的设置
OnCtlColor
(CDC* pDC, CWnd* pWnd, UINT nCtlColor),即
WM_CTLCOLOR
HBRUSH CtestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
在此更改 DC 的任何特性
// 设置显示字体
CFont * font=new CF
font-&CreateFont(16,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
DEFAULT_PITCH&FF_SWISS,_T(&Arial&));
switch(nCtlColor)
case CTLCOLOR_STATIC: //对所有静态文本框的设置
pDC-&SetBkMode(TRANSPARENT);
//设置背景为透明
pDC-&SetTextColor(RGB(255,255,0)); //设置字体颜色
pWnd-&SetFont(font); //设置字体
HBRUSH B = CreateSolidBrush(RGB(125,125,255));
//创建画刷
return (HBRUSH) B; //返回画刷句柄
case CTLCOLOR_EDIT: //对所有编辑框的设置
if(IDC_EDIT2 == pWnd-&GetDlgCtrlID())
pDC-&SetBkMode(TRANSPARENT);
pDC-&SetTextColor(RGB(255,255,0));
pWnd-&SetFont(font);
HBRUSH B = CreateSolidBrush(RGB(125,125,125));
return (HBRUSH) B;
if(IDC_EDIT3 == pWnd-&GetDlgCtrlID())
pDC-&SetBkMode(TRANSPARENT);
pDC-&SetTextColor(RGB(255,0, 0));
pWnd-&SetFont(font);
HBRUSH B = CreateSolidBrush(RGB(125,125,0));
return (HBRUSH) B;
return CDialog::OnCtlColor(pDC,pWnd, nCtlColor);
如果默认的不是所需画笔,则返回另一个画笔
nCtlColor的类别有以下几种:
CTLCOLOR_BTN& 按钮控件
CTLCOLOR_DLG& 对话框
CTLCOLOR_EDIT& 编辑框
CTLCOLOR_LISTBOX& 列表框
CTLCOLOR_MSGBOX&& 消息框
CTLCOLOR_SCROLLBAR& 滚动条
CTLCOLOR_STATIC& 静态文本
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
如何改变对话框中Edit Box控件的背景色和显示内容的颜色和字体.doc
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口阅读(1050)
【VS开发】VS2010 MFC中控件、对话框等背景颜色动态修改的方法
标签(空格分隔):【VS开发】
声明:引用请注明出处
说明:最近突发奇想想完成两件新的人机交互工程,一个是基于眼动仪的眼动控制,另一个是基于camera的手动控制,最直观的方法就是使用slider滑块,眼睛或手左右动,slider也左右动,眼睛或手上下动,slider也上下动,并配合着对话框的背景颜色的改变,来增强互动的效果,本文所记录的就是其中关于动态修改控件颜色的方法。
首先说基于眼动仪的眼动控制,由于提供的matlab接口开发起来比较方便,所以采用了matlab gui设计,而在matlab中关于dialog或者某个控件的颜色的修改简直太方便了,如下一行代码就可以搞定:
set(handles.axes1,'color',[0.5,0.5,0.5])
所以matlab gui设置各种事情是比较方便的。毕竟是解释性开发语言。
由于好久没有在VS2010下开发对话框的应用,以前都是在VC下开发dialog程序,在VS2010上开发的多是具有office风格的文档应用,但是曾经积累的经验是非常有帮助的。就不多说如何按照经验一步一步的尝试了,直接给出最终的较为简单的解决方案:
通过类向导,或者手动添加消息:WM_CTLCOLOR,其消息响应函数为:
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
在每个控件开始绘制之前,都会向其父窗口发送WM_CTLCOLOR通告消息,在该消息的处理函数中,可以设置控件显示文本的前景色、背景色以及字体。该消息处理函数还要求返回一个画刷的句柄,用于在控件具体的绘制之前擦除其客户区。当窗口重绘时,也会重新绘制每个控件,从而分别调用该函数,这就给了动态修改控件相关颜色特性的机会。
比如在对应的控件下的OnCtrColor函数中写入:
pDC-&SetTextColor(RGB(255, 0, 0));
//设置文本前景色
pDC-&SetBkColor(RGB(255, 255, 255));
//设置文本背景色
pDC-&SetBkMode(TRANSPARENT);
//TRANSPARENT或OPAQUE
pDC-&SelectObject(...)
就可以实现修改某个控件的绘制属性。具体的实现可以参考下面的一段代码:
//m_font1与m_font2为CTestDlg的成员,类型为CFont
BOOL CTestDlg::OnInitDialog()
// TODO: Add extra initialization here
m_font1.CreatePointFont(120,
TEXT("Impact"));
m_font2.CreatePointFont(120,
TEXT("Arial"));
HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
Change any attributes of the DC here
if (nCtlColor == CTLCOLOR_STATIC)
switch (pWnd-&GetDlgCtrlID())
case IDC_STATIC_1:
pDC-&SetTextColor(RGB(255, 0, 0));
pDC-&SetBkColor(RGB(255, 255, 255));
pDC-&SetBkMode(TRANSPARENT);
pDC-&SelectObject(&m_font1);
return (HBRUSH)::GetStockObject(BLACK_BRUSH);
case IDC_STATIC_2:
pDC-&SetTextColor(RGB(255, 255, 0));
pDC-&SetBkColor(RGB(255, 255, 255));
pDC-&SelectObject(&m_font2);
return (HBRUSH)::GetStockObject(BLACK_BRUSH);
Return a different brush if the default is not desired
当然如果是修改dialog的属性,可以直接在最后的return上返回一个画刷,填充dialog的背景颜色。
上面这种方法只是一种静态的修改,因为所有的属性都是一次性设定好了,似乎没有根据情况进行改变的可能。这个是时候就要用到上面所提到的一种方法:强迫窗口重绘,可用的函数有Invalidate()和UpdateWindow(),两者的区别如下:
Invalidate在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区。而UpdateWindow直接发送一个WM_PAINT消息,其无效区范围就是消息队列中WM_PAINT消息(最多只有一条)的无效区。效果很明显,调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,而调用UpdateWindow会使WM_PAINT消息马上执行的,绕过了消息队列。如果你调用Invalidate之后想马上更新屏幕,那就加上UpdateWindow()这条语句。
那么剩下的事情就比较简单了,可以通过设置一个COLORREF m_BrushC的成员变量,在调用窗口重绘的函数之前,修改m_BrushColor,然后在OnCtlColor函数中将画刷的颜色创建为该m_BrushColor:
m_bkBrush.DeleteObject();
m_bkBrush.CreateSolidBrush(m_BrushColor); //创建一把黄色的背景刷子
下面是我所修改的函数:
HBRUSH ChandControllerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
在此更改 DC 的任何特性
if((CTLCOLOR_SCROLLBAR)&&(pWnd-&GetDlgCtrlID()==IDC_SLIDER1 || pWnd-&GetDlgCtrlID()==IDC_SLIDER2))
//此处设置背景的颜色
m_bkBrush.DeleteObject();
m_bkBrush.CreateSolidBrush(RGB(0,255,0)); //创建一把黄色的背景刷子
return m_bkB
if((CTLCOLOR_BTN)&&(pWnd-&GetDlgCtrlID()==IDOK))
m_bkBrush.DeleteObject();
m_bkBrush.CreateSolidBrush(RGB(0,255,0)); //创建一把黄色的背景刷子
return m_bkB
m_bkBrush.DeleteObject();
m_bkBrush.CreateSolidBrush(m_BrushColor); //创建一把黄色的背景刷子
如果默认的不是所需画笔,则返回另一个画笔
return m_bkB
通过上面的函数,可以实现对对话框中的控件或者对话框的背景颜色进行动态修改。
调试记录 张朋艺
版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/lg/。
阅读排行榜以静态文本控件(Static Text)为例:
//以上为初始化
①用ClassWizard添加新类,基类选为CStatic,新类名称设为CMyStatic。②在CStatic类中,用ClassWizard重载消息&=WM_CTLCOLOR&的函数CtlColor(),注意:不要错误地重载名为&WM_CTLCOLOR&的消息,若重载了它会得不到想要的效果。③在CtlColor()函数中修改控件的背景色和文本颜色。④加入设置颜色和字体的接口函数。&
以下为CStatic类的相关部分:
在 MyStatic.h&中加入变量和接口函数的定义:
private:&&&&COLORREF&&&&m_ForeC&&&&&&&&//文本颜色&&&&COLORREF&&&&m_BackC&&&&&&&&//背景色&&&&CBrush&&&&&&m_BkB&&&&&&&&&&//背景刷&&&&CFont*&&&&&&p_F&&&&&&&&&&&&&//字体//&接口函数public:&&&&void&SetForeColor(COLORREF&color);&&&&&&//设置文本颜色&&&&void&SetBkColor(COLORREF&color);&&&&&&&&//设置背景颜色&&&&void&SetTextFont(int&FontHight,LPCTSTR&FontName);&&&//设置字体&
在 MyStatic.cpp&中加入以下内容:
在构造函数中,设置变量的初值
CStaticEx::CStaticEx(){&&&&m_ForeColor&=&RGB(0,0,0);&&&&&&&&&&&&//文字颜色(黑色)&&&&m_BackColor = RGB(255,255,255);&&&&&&//背景色(白色)&&&&m_BkBrush.CreateSolidBrush(m_BackColor);&&&&//背景刷&&&&p_Font&=&NULL;&&&&&&&&&&&&&&&&&&&&&&&//字体指针}&
用ClassWizard重载消息&=WM_CTLCOLOR&(注:不是WM_CTLCOLOR),在其中修改控件的前景色和背景色:
HBRUSH CStaticEx::CtlColor(CDC* pDC, UINT nCtlColor){&&&&pDC-&SetTextColor( m_ForeColor );&&&&&&&&&//设置文字颜色&&&&pDC-&SetBkColor( m_BackColor );&&&&&&&&&&&//设置背景色&&&&return (HBRUSH)m_BkBrush.GetSafeHandle();&//返回背景刷}&
另外,为方便调用,再定义三个接口函数:
//设置控件文字颜色
void CStaticEx::SetForeColor(COLORREF color){&&&&m_ForeColor =&&&&&&&&&//设置文字颜色}&
//设置控件背景颜色
void CStaticEx::SetBkColor(COLORREF color){&&&&m_BackColor =&&&&m_BkBrush.Detach();&&&&&&&&&&&//分离原背景刷&&&&m_BkBrush.CreateSolidBrush( m_BackColor );&//建立背景刷}&
//设置控件字体
void CStaticEx::SetTextFont(int FontHight,LPCTSTR FontName){&&&&if ( p_Font )&&&delete p_F&&&&//删除旧字体&&&&p_Font = new CF&&&&&&&&&&&&&&&//生成字体对象&&&&p_Font-&CreatePointFont( FontHight, FontName );&//创建字体&&&&SetFont( p_Font );&&&&&&&&&&&&&&&&//设置控件字体}&
其中FontHight为字体高度,FontName为字体名。
由于新字体由new生成,必须显式回收,这项工作可以在CMyButton类的析构函数中进行:
CStaticEx::~CStaticEx(){&&&&if&(&p_Font&)&&&&delete&p_F&&&&&&&&//删除字体}&
//动态改变
void CTestColorDlg::OnBnClickedChangebkg(){&// TODO: 在此添加控件通知处理程序代码&CColorD &if(dlg.DoModal()==IDOK)&{&  textclor=dlg.GetColor();&&  m_static1.SetBkColor(textclor);&  m_static1.SetRedraw(TRUE);&// invalidate the entire control, force painting&  m_static1.Invalidate();&  m_static1.UpdateWindow();&}}&
&& Invalidate:
  该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw来完成。参数bErase为TRUE时,重绘区域内的背景 将被擦除,否则,背景将保持不变。
InvalidateRect():&&& 该函数的功能与Invalidate基本一样,不同的是,它是使指定的某个区域无效,需要输入一个区域。
UpdateWindow():&&&& UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。
阅读(...) 评论()VC&&MFC&为对话框添加背景图片、为控件设置背景颜色
为对话框添加背景图片
1.将要添加的图片经PS或画图工具,另存为位图(bmp),并在MFC中引入该BITMAP资源,ID为IDB_BITMAP1;
2.在该Dialog的OnPaint()函数中,添加如下代码:
& CPaintDC dc(this);
&&GetClientRect(&rect);
&&dcMem.CreateCompatibleDC(&dc);
&&CBitmap bmpB
&&bmpBackground.LoadBitmap(IDB_BITMAP1);
&&bmpBackground.GetBitmap(&bitmap);
*pbmpOld=dcMem.SelectObject(&bmpBackground);
&&dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
//若该对话框为主框,则在OnPaint()函数中if...else...语句中的else中添加以上代码;
为控件设置背景颜色
1.为控件所在对话框的类添加CBrush类型的变量,例如m_Brush;
在该对话框的构造函数中,创建一个画刷,例如:
CDeleteFace::CDeleteFace(CWnd*
&: CDialog(CDeleteFace::IDD, pParent)
&//{{AFX_DATA_INIT(CDeleteFace)
&m_edit1 = _T("");
&//}}AFX_DATA_INIT
&m_brush.CreateSolidBrush(RGB(200,230,190));
为该对话框添加OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
在OnCtlColor中添加如下代码:
(pWnd-&GetDlgCtrlID()==IDC_EDIT1||pWnd-&GetDlgCtrlID()==IDC_STATIC)
&&pDC-&SetBkMode(TRANSPARENT);
&&return m_
即可完成对控件的颜色设置!
2.上述方法对Button控件不适用;可用以下方法为Button控件设置背景:
为工程添加类CSXBtn,基类为CButton,为CSXBtn添加虚函数DrawItem(),完成对Button控件背景、字体颜色的设置;
代码如下:
CSXBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
&UINT uStyle = BS_DEFPUSHBUTTON
;//DFCS_BUTTONPUSH;
&// This code only works with buttons.
&ASSERT(lpDrawItemStruct-&CtlType
== ODT_BUTTON);
&// If drawing selected, add the pushed style to
DrawFrameControl.
&if (lpDrawItemStruct-&itemState
& ODS_SELECTED)
&&uStyle |= DFCS_PUSHED;
&// Draw the button frame.
&::DrawFrameControl(lpDrawItemStruct-&hDC,
&lpDrawItemStruct-&rcItem,
&&DFC_BUTTON, uStyle);
&CDC* pDC =
CDC::FromHandle(lpDrawItemStruct-&hDC);
&// Get the button's text.
&CString strT
&GetWindowText(strText);
&// Draw the button text using the text color
&CBrush B;
&CRect focusR
&focusRect.CopyRect(&lpDrawItemStruct-&rcItem);
&DrawFocusRect(lpDrawItemStruct-&hDC,
(LPRECT)&focusRect);
&focusRect.left += 4;
&focusRect.right -= 4;
&focusRect.top += 4;
&focusRect.bottom -= 4;
&rect.CopyRect(&lpDrawItemStruct-&rcItem);
&pDC-&Draw3dRect(rect,
::GetSysColor(COLOR_BTNSHADOW),
::GetSysColor(COLOR_BTNHILIGHT));
&B.CreateSolidBrush(RGB(200,230,190));
&::FillRect(lpDrawItemStruct-&hDC,&rect,
(HBRUSH)B.m_hObject);
&::SetBkMode(lpDrawItemStruct-&hDC,TRANSPARENT);
&COLORREF crOldColor =
::SetTextColor(lpDrawItemStruct-&hDC,
RGB(0,0,0));
&::DrawText(lpDrawItemStruct-&hDC,
strText, strText.GetLength(),
&&&lpDrawItemStruct-&rcItem,
DT_SINGLELINE|DT_VCENTER|DT_CENTER);
&::SetTextColor(lpDrawItemStruct-&hDC,
crOldColor);
将Button控件属性中“所有者绘制”选中,并为控件添加变量,变量类型为CSXBtn;即可!
&孙鑫C++视频第十讲中也有介绍!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 mfc中edit控件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信