VC 对话框背景颜色
- 格式:docx
- 大小:17.99 KB
- 文档页数:3
VCMFC如何设置对话框背景颜色_paul的梦想天堂VC/MFC如何设置对话框背景颜色2007-06-19 19:571.重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColo r),即WM_CTLCOLOR消息。
---- ①在CExampleDlgDlg的头文件中,添加一CBrush的成员变量:class CExampleDlgDlg : public CDialog{...protected:CBrush m_brush;...};---- ②在OnInitDialog()函数中添加如下代码:BOOL CExampleDlgDlg::OnInitDialog(){...// TODO: Add extra initialization herem_brush.CreateSolidBrush(RGB(0, 255, 0)); // 生成一绿色刷子...}---- ③利用ClassWizard重载OnCtlColor(…),即WM_CTLCOLOR消息:HBRUSH CExampleDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){/*** 这里不必编写任何代码!**下行代码要注释掉** HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);*/return m_brush; //返加绿色刷子}2.修改对话框的OnPaint,在else中添加如下代码CPaintDC dc(this);CRect rect;GetClientRect(rect);dc.FillSolidRect(rect, RGB(0,0,0));CDialog::OnPaint();3.在对话框的应用类(App)的.cpp的Initinstance()中加入代码: //加在int nResponse=dlg.DoModal();前一个RGB设置背景色,第二个设置字体颜色SetDialogBkColor(RGB(0,0,255),RGB(0,255,0));4.1.在对话框类中添加成员变量:public:CBrush m_brushBlue;2.在对话框类的OnInitDialog()中添加代码:m_brushBlue.CreateSolidBrush(RGB(0,0,255));3.用ClassWizard在对话框类中添加成员函数OnCtlCollor(),并在其中添加代码:if(nCtlColor==CTLCOLOR_DLG) return m_brushBlue;。
VC++更改对话框背景色和字体颜色方法一:设置所有窗口的颜色MFC程序修改对话框的背景和文字颜色最简单的方法就是调用SetDialogBkColor函数,SetDialogBkColor是CWinApp类的成员函数,以下是该函数的原型:void CWinApp::SetDialogBkColor(COLORREF clrCtlBk, COLORREF clrCtlText);请注意,SetDialogBkColor函数并不是对Windows的某个API 的封装,他是MFC框架的一部分,所以不使用MFC的程序也就不能享受这种方便。
这个函数的使用很简单,在程序的CWinApp派生类的InitInstance函数中,添加一行代码就行了,写在domodal()的上一句:SetDialogBkColor(RGB(188,197,230),RGB(13,125,188));注:前一个为背景色,后一个为字体颜色。
方法二:设置当前窗口改变对话框的背景颜色的原理很简单,就是响应WM_ERASEBKGND消息,用自定义的颜色填充对话框的客户区背景,代替对话框窗口默认的背景填充动作。
改变控件和字体的颜色同理,是响应WM_CTLCOLOR这一消息。
具体操作,方法如下:首先://消息映射BEGIN_MESSAGE_MAP(CHelloDlg, CDialog)//{{AFX_MSG_MAP(CHelloDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_CTLCOLOR() //字体颜色ON_WM_ERASEBKGND() //背景色ON_WM_QUERYDRAGICON()//}}AFX_MSG_MAPEND_MESSAGE_MAP()其次:定义两个函数afx_msg BOOL OnEraseBkgnd(CDC* pDC);afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);第三:重载OnEraseBkgnd和OnCtlColor其中预先定义:protected:CBrush m_brBkgnd;//设置对话框背景色方法一:可以实现(但有点问题)BOOL CHelloDlg::OnEraseBkgnd(CDC* pDC){CRect rect;GetClientRect(&rect);m_brBkgnd.CreateSolidBrush(RGB(183,213,213)); //背景色pDC->FillRect(&rect,&m_brBkgnd);return TRUE;}方法二:可行BOOL CClientDlg::OnEraseBkgnd(CDC* pDC){CBrush back(RGB(220,215,254));CBrush* pold=pDC->SelectObject(&back);CRect rect;pDC->GetClipBox (&rect);pDC->PatBlt(rect.left,rect.top,rect.Width(),rect.Height(),PATCOPY);pDC->SelectObject(pold);return TRUE;方法三:也可行BOOL CHelloDlg::OnEraseBkgnd(CDC* pDC){CBrush MyBrush;MyBrush.CreateSolidBrush(RGB(0,255,0));CBrush *pOldBrush=pDC->SelectObject(&MyBrush);CRect Rect;GetClientRect(&Rect);pDC->Rectangle(&Rect);pDC->SelectObject(pOldBrush);return TRUE;}//设置对话框中控件的字体颜色HBRUSH CHelloDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);if(pWnd->GetDlgCtrlID() == IDC_EDIT_MULLINE) //多行edit 控件{pDC->SetT extColor(RGB(13,125,188)); //设置字体颜色return hbr;}else{pDC->SetBkMode(TRANSPARENT);pDC->SetT extColor(RGB(255,125,188));return (HBRUSH)m_brBkgnd; //因为CBrush类实现了HBRUSH 类型转换操作符}。
一、设置背景颜色的三种方法:1、我们知道程序在运行的时候会调用OnPain函数,那么我们可以在这里设置背景颜色。
void CFlipCardsDlg::OnPaint(){if (IsIconic()){//保持不变}else{CRect rc;GetClientRect( &rc );// 获取客户区CPaintDC dc(this);dc.FillSolidRect(&rc, RGB(0,160,0)); // 填充客户区颜色CDialog::OnPaint();}}2、第二种方法只要一条语句,但是这里要注意这里绘制的颜色是针对程序中所有的对话框(如果是单文档的话,好像不行)SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));// 前一个RGB是背景色,后一RGB是文本颜色该函数放在工程的APP文件的初始化函数中。
3、第三种方法,利用ClassWizard 重载OnCtlColor(),即WM_CTLCOLOR消息在要着色的对话框中申明一个变量,CBRUSH m_hbrush;然后在项目的Dlg类初始化函数中给m_hbrush赋值。
m_brush.CreateSolidBrush(RGB(0, 255, 0));然后在OnCtlColor(...)返回该画刷就可以了,如下。
HBRUSH CFlipCardsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: Change any attributes of the DC hereswitch (nCtlColor){case CTLCOLOR_DLG:HBRUSH aBrush;aBrush = CreateSolidBrush(RGB(0, 150, 0));hbr = aBrush;break;}// TODO: Return a different brush if the default is not desiredreturn hbr;}这样为对话框着色就可以实现了。
关于对话框子控件颜色更改的一些思考关于对话框子控件颜色更改的一些思考(yc)(yc)(yc)CWnd::OnCtlColor 函数在绘制任何一个子控件时,被框架自动调用,因此在其中可以利用GetDlgCtrlID进行逐个判断,看是否是需要改变颜色的子控件。
利用此函数返回的画刷来绘制控件背景,控件文字颜色在函数内部可以调用SetTextColor 函数。
注意调用此函数的窗口为控件的父窗口,一般是对话框。
然而,由于每个父窗口(对话框)必须处理通告消息并指定每个控件的绘画属性,所以,这种方法不是完全的面向对象的方法。
控件自己处理该消息并指定绘画属性更合情合理。
消息反射允许用户这样做。
通告消息首先发送给父窗口,如果父窗口没有处理则发送给控件(这是MFC 的消息映射机制)。
以下以ListBox 为例来说明如何让其背景和其中文本颜色更改。
1.从CListBox 类派生出一个类CMyListBox(增加三个成员变量:文本色,背景色,画刷),并在构造函数中进行初始化2.将对话框中的列表框控件关联一个成员变量(注意选择控制变量,让其派生自CMyListBox 类)3.让CMyListBox 类来响应WM_CTLCOLOR 消息(实际为=WM_CTLCOLOR 消息)得到函数CMyListBox::CtlColor(CDC* pDC, UINT nCtlColor),在其中利用CDC::SetTextColor,CDC::SetBkColor 来更改列表框控件的背景色和文本色,并返回自定义的画刷。
由此就完成了让控件自身绘制自身的功能,而不去打扰到它的父窗口对话框。
上述方法是利用了将控件与成员变量相关联,另一种方法与此类似,即在对话框创建时利用派生类的对象子分类此控件m_lbMyListBox.SubclassDlgItem(IDC_LIST1,this);这样传到控件中的消息都会由此派生类来处理了。
Posted by: BusyCai。
VC设置对话框背景少将2014-11-20VC对话框默认的灰度背景实在是不美观,填充背景图成了改善用户界面的一个很好的选择。
首先在资源视图中添加一个位图资源,如命名为IDB_BMPBK。
在对话框中添加OnEraseBkgnd()事件处理函数,用于擦除背景进行重绘。
其中添加的代码如下:BOOL DialogClass::OnEraseBkgnd(CDC* pDC){//创建内存DCCDC MemDC;//CBitmap对象CBitmap Bitmap,*pOldBitmap;//BITMAP句柄BITMAP bm;//加载位图Bitmap.LoadBitmap(IDB_BMPBK);//将位图资源与句柄绑定Bitmap.GetObject(sizeof(BITMAP),&bm);//创建与内存兼容的DCMemDC.CreateCompatibleDC(pDC);//替换原位图pOldBitmap=(CBitmap*)(MemDC.SelectObject(&Bitmap));//获取绘制的区域CRect rcClient;GetClientRect(&rcClient);//绘制到客户区pDC->BitBlt(0,0,rcClient.Width(),rcClient.Height(),&MemDC,0,0,SRCCOPY);MemDC.SelectObject(pOldBitmap);MemDC.DeleteDC();return TRUE;}默认生成的OnEraseBkgnd()处理函数会有调用基类的处理函数然后再返回结果,要注意把这一句直接删除,然后直接返TRUE。
VC 控制台颜色设置通常控制台都是白字黑底的,千篇一律不免单调。
适当的在控制台中加入一些彩色可以让人耳目一新,本文介绍如何使用系统API接口去修改控制台的文字和背景颜色。
主要用到如下二个函数:得到standard input, standard output, or standard error的设备句柄:HANDLE GetStdHandle(DWORD nStdHandle);参数有:STD_INPUT_HANDLE,STD_OUTPUT_HANDLE及STD_ERROR_HANDLE。
传入STD_OUTPUT_HANDLE就可以得到控制台输出设备的句柄。
设置控制台设备的属性BOOL SetConsoleTextAttribute( HANDLE hConsoleOutput,WORD wAttributes);第一个参数为控制台standard input, standard output, or standard error的设备句柄第二个参数用来设备设备的属性,这里详细介绍下表示颜色的参数。
先看下颜色的种类:在XP系统控制台一共有16种文字颜色,16种背景颜色,可以通过文字颜色+ 背景颜色* 0x10 来设置控制台的颜色。
已经定义好的颜色常量如下:文字颜色使用如下组合:FOREGROUND_BLUE 0x0001 // text color contains blue.FOREGROUND_GREEN 0x0002 // text color contains green.FOREGROUND_RED 0x0004 // text color contains red.FOREGROUND_INTENSITY 0x0008 // text color is intensified.高亮颜色背景颜色使用如下组合(其实就是上面值*0x10):BACKGROUND_BLUE 0x0010 // background color contains blue.BACKGROUND_GREEN 0x0020 // background color contains green.BACKGROUND_RED 0x0040 // background color contains red.BACKGROUND_INTENSITY 0x0080 // background color is intensified.上面的颜色可以任意组合,如知道黄色可以由红色和绿色组成,所以可以用FOREGROUND_GREEN | FOREGROUND_RED来表示黄色的文字。
vc 根据字体对话框和颜色对话框设置控件里的字体和颜色vc 根据字体对话框和颜色对话框设置控件里的字体和颜色2009-05-23 10:13:25| 分类:VC&MFC|字号订阅视频教程及其源码下载地址/source/780472 题目:编写一个基于对话框的应用程序,要求其能实现如下功能:(1)可以用来打开及显示文本文件。
(2)可以设置所显示的文本的字体颜色。
★打开Microsoft Visual C++ 6.0 文件->新建选择MFC AppWizard(exe) 输入工程文件名。
这里填写09 点击确定按钮,程序将自动出现MFC应用程序向导选择基本对话框点击完成按钮出现新建工程信息对话框。
点击确定按钮★★★★首先是定义颜色类★★★★★ ★点工具栏->插入->类name 任意填写这里填的是CStatic09 Base class选择CStatic 点击确定按钮。
★鼠标切换左边的类视图区出现09 classes 鼠标左键双击CStatic09 左边将出现N行代码找到class My09Static : public CStatic { // Construction public: My09Static(); 。
在下面输入:private: COLORREF m_ForeColor; //文本颜色COLORREF m_BackColor; //背景色CBrushm_BkBrush; //背景刷public: voidSetForeColor(COLORREF color);//设置文本颜色void SetBkColor(COLORREF color);//设置背景颜色找到protected: //{{AFX_MSG(My09Static) // NOTE - the ClassWizard will add and remove member functions here. /}}AFX_MSG DECLARE_MESSAGE_MAP() 在中间加入afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);//消息响应函数效果如下:protected://{{AFX_MSG(My09Static) // NOTE - the ClassWizard will add and remove member functions here. afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);//消息响应函数/}}AFX_MSG DECLARE_MESSAGE_MAP() ★点击CStatic09左边的+号按钮出现CStatic09() 右键双击CStatic09() 左边将出现N行代码找到CStatic09::CStatic09() { } 在大括号与小括号之间输入://文字颜色m_ForeColor =GetSysColor( COLOR_BTNTEXT ); //背景色m_BackColor = GetSysColor( COLOR_BTNFACE ); //背景刷m_BkBrush.CreateSolidBrush(m_BackColor); 找到BEGIN_MESSAGE_MAP(My09Static, CStatic)//{{AFX_MSG_MAP(My09Static) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_MSG_MAP END_MESSAGE_MAP() 在中间输入ON_WM_CTLCOLOR_REFLECT()//颜色宏定义效果如下BEGIN_MESSAGE_MAP(My09Static, CStatic)//{{AFX_MSG_MAP(My09Static) // NOTE - the ClassWizard will add and remove mapping macros here. ON_WM_CTLCOLOR_REFLECT()//颜色宏定义//}}AFX_MSG_MAP END_MESSAGE_MAP() 最后找到///////////////////////////////////////////////////////////////////////////// // CStatic09 message handlers 在下面输入HBRUSH CStatic09::CtlColor(CDC* pDC, UINT nCtlColor){ pDC->SetTextColor( m_ForeColor );pDC->SetBkColor( m_BackColor ); return (HBRUSH)m_BkBrush.GetSafeHandle(); } void CStatic09::SetForeColor(COLORREF color) //设置文本颜色{ m_ForeColor = color; } voidCStatic09::SetBkColor(COLORREF color) //设置背景颜色{ m_BackColor = color; m_BkBrush.Detach();m_BkBrush.CreateSolidBrush( m_BackColor ); } 设置对话框代码找到类视图中的CMu09Dlg,双击后显示代码。
vc++设置控件的背景色vc++设置控件的背景色重载OnCtlColor函数,这个是必须的。
设置控件的背景颜色:第一:afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);//在头文件中声明在主文件中第二:BEGIN_MESSAGE_MAP(COk1Dlg, CDialog)//{{AFX_MSG_MAP(COk1Dlg)。
ON_WM_CTLCOLOR() //要加这句。
//}}AFX_MSG_MAPEND_MESSAGE_MAP()第三:加这个函数HBRUSH CTesDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);switch (nCtlColor){case CTLCOLOR_STATIC: //静态文本{pDC->SetBkMode(TRANSPARENT);HBRUSH B = CreateSolidBrush(RGB(255, 0, 0)); //控件背景颜色pDC->SetT extColor(RGB(255,0,0)); //控件中的文字的颜色return (HBRUSH) B;}break;case CTLCOLOR_LISTBOX://列表框{pDC->SetBkMode(TRANSPARENT);HBRUSH B = CreateSolidBrush(RGB(0, 255, 0)); pDC->SetT extColor(RGB(255,0,0));return (HBRUSH) B;}break;case CTLCOLOR_DLG : //对话框{pDC->SetBkMode(TRANSPARENT);HBRUSH B = CreateSolidBrush(RGB(0, 0, 255)); pDC->SetT extColor(RGB(255,0,0));return (HBRUSH) B;}break;case CTLCOLOR_EDIT : //文本编辑框{pDC->SetBkMode(TRANSPARENT);HBRUSH B = CreateSolidBrush(RGB(60, 160, 60)); pDC->SetT extColor(RGB(255,0,0));return (HBRUSH) B;}break;default:break;return hbr;}}控件参考:#define CTLCOLOR_MSGBOX 0#define CTLCOLOR_EDIT 1#define CTLCOLOR_LISTBOX 2#define CTLCOLOR_BTN 3#define CTLCOLOR_DLG 4#define CTLCOLOR_SCROLLBAR 5 #define CTLCOLOR_STATIC 6#define CTLCOLOR_MAX 7#define COLOR_SCROLLBAR 0#define COLOR_BACKGROUND 1 #define COLOR_ACTIVECAPTION 2 #define COLOR_INACTIVECAPTION 3 #define COLOR_MENU 4#define COLOR_WINDOW 5#define COLOR_WINDOWFRAME 6 #define COLOR_MENUTEXT 7#define COLOR_WINDOWTEXT 8 #define COLOR_CAPTIONTEXT 9#define COLOR_ACTIVEBORDER 10 #define COLOR_INACTIVEBORDER 11 #define COLOR_APPWORKSPACE 12 #define COLOR_HIGHLIGHT 13#define COLOR_HIGHLIGHTTEXT 14 #define COLOR_BTNFACE 15#define COLOR_BTNSHADOW 16#define COLOR_GRAYTEXT 17#define COLOR_BTNTEXT 18#define COLOR_INACTIVECAPTIONTEXT 19#define COLOR_BTNHIGHLIGHT 20#if(WINVER >= 0x0400)#define COLOR_3DDKSHADOW 21#define COLOR_3DLIGHT 22#define COLOR_INFOTEXT 23#define COLOR_INFOBK 24#endif /* WINVER >= 0x0400 */#if(WINVER >= 0x0500)#define COLOR_HOTLIGHT 26#define COLOR_GRADIENTACTIVECAPTION 27#define COLOR_GRADIENTINACTIVECAPTION 28#if(WINVER >= 0x0501)#define COLOR_MENUHILIGHT 29#define COLOR_MENUBAR 30#endif /* WINVER >= 0x0501 */#endif /* WINVER >= 0x0500 */#if(WINVER >= 0x0400)#define COLOR_DESKTOP COLOR_BACKGROUND#define COLOR_3DFACE COLOR_BTNFACE#define COLOR_3DSHADOW COLOR_BTNSHADOW#define COLOR_3DHIGHLIGHT COLOR_BTNHIGHLIGHT #define COLOR_3DHILIGHT COLOR_BTNHIGHLIGHT#define COLOR_BTNHILIGHT COLOR_BTNHIGHLIGHT 另外,有的控件不在上面定义之中,这时要改变就需要获得控件的ID来改变,具体如下(上面的也可以用下面的这种方法来实现)首先还是要重载OnctlColor函数然后if(pWnd->GetDlgCtrlID()==YourID//你想改变的控件Id) {pDC->SetT extColor(RGB(……));SetBKMode(TRANSPARENT);hbr=m_brush;//这里把画刷改成你自己的}return hbr;。
VC++改变背景颜色的类___CMyEdit类在VC中,编辑框的颜色改变起来似乎很难,MFC的CEdit类后没有提供可改变颜色的函数。
在本文中,我将重载CEdit类,编写一个可以改变背景颜色的类CMyEdit类,将编辑框的变量定义为CMyEdit类型来实现改变编辑框的背景颜色。
一、构建应用程序新建一个基于对话框基础的程序ChangeEdit,然后在对话框的摸板上删除静态文本框,添加三个编辑框。
二、打造自己的CMyEdit类1.添加CMyEdit类生成好应用程序之后,我们可以利用类向导生成器添加一个新类。
将新类命名为CMyEdit,继承自CEdit类。
2.添加成员变量类生成好后,再添加成员变量,在此,我们需要添加三个私有类型的成员变量,COLORREF变量保存当前颜色,CBrush 变量保存改变后的刷子颜色,CString 变量保存当前编辑框的内容。
如下所示。
private:CBrush m_Brush;CString m_T ext;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->SetT extColor(RGB(0, 0, 0,));//输出文本pDC->TextOut(2, 2, m_Text.GetBuffer(m_Text.GetLength()));}2)重载虚拟函数OnChildNotify():将OnChildNotify()函数的定义为如下形式:BOOL CMyEdit::OnChildNotify(UINT message, WPARAMwParam, 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,主要是用来处理编辑框获得焦点和失去焦点的颜色改变效果。