使用OnCtlColor函数来改变控件颜色
MFC设置文本框颜色及字体
在MFC类库提供了CWnd::OnCtlColor函数,在工作框架的子窗口被重画时将调用该成员函数.因此可以重载WM_CTLCOLOR消息的响应函数.此函数的原型:afx_msg HBRUSH OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColo r);参数nCtlColor用于指定控件的类型,可以是:.CTLCOLOR_BTN按钮控件.CTLCOLOR_DLG对话框.CTLCOLOR_EDIT编辑框.CTLCOLOR_LISTBOX列表控件.CTLCOLOR_MSGBOX消息控件.CTLCOLOR_SCROLLBAR滚动条控件.CTLCOLOR_STATIC静态控件[程序实现]假设已有了名为My的对话框工程.你有了一个STATIC的控件,ID为IDC_STATIC1.HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: Change any attributes of the DC hereif (nCtlColor==CTLCOLOR_STATIC){pDC-> SetTextColor(RGB(255,0,0)); //字体颜色pDC-> SetBkColor(RGB(0, 0, 255)); //字体背景色}// TODO: Return a different brush if the default is not desiredreturn hbr;}如果要指定某个特定控件可以这样写:ID为IDC_STATIC1if (pWnd-> GetDlgCtrlID()==IDC_STATIC1){pDC-> SetTextColor(RGB(255,0,0)); //设置字体颜色pDC-> SetBkMode(TRANSPARENT); //设置字体背景为透明// TODO: Return a different brush if the default is not desiredreturn (HBRUSH)::GetStockObject(BLACK_BRUSH); // 设置背景色}elsereturn hbr;【注】BLACK_BRUSH:黑色WHITE_BRUSH:白色GRAY_BRUSH:灰色NULL_BRUSH:透明HOLLOW_BRUSH:透明BOOL CreatePointFont(int nPointSize,LPCTSTR lpszFaceName,CDC*pDC=NULL);参数:nPointSize请求的的大小,取其1/10为其字体大小。
vc++设置控件的背景色
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的朋友也和我一样想知道如何把控件设置得更漂亮些,但由于所学有限,在这篇文章中,我们只来探讨如何改变ListBox控件及其文本的颜色。
这是我从别人那学过来的,演练了一遍并稍加整理,现贴出来,献给和我一样在学习的道路上苦苦求索的各位友友们。
第一步:
创建一个基于对话框的工程(这里我们将其命名为“控件练习”),然后在对话框中加入一个ListBox控件。
如图所示:
第二步:
在“控件练习Dlg.h”中加入一个成员变量:CBrush m_brush;
第三步:
在OnInitDialog 中加入如图所示代码:
其中RGB(144,101,210)是设置ListBox 的背景色。
接下来我们利用类向导给LisBox 控件添加一个Control 类型的成员变量m_ctrlListBox
,如图:
再在OnInitDialog()中添加如图所示代码:
其中括号内中文字符为控件中显示的内容,可以随意改动。
第四步:
利用类向导给对话框“控件练习Dlg”添加WM_CTLCOLOR 事件,如图:
然后进入OnCtlColor(),添加如图所示代码:
最后编译运行,结果如下:。
OnEraseBkgnd、 OnPaint、 OnCtlColor的作用
OnEraseBkgnd、OnPaint、OnCtlColor的作用CWnd::OnEraseBkgnd( CDC* pDC );The framework calls this member function when the CWnd object background needs erasing (for example, when resized).(翻译:当CWnd对象的背景需要擦除时候框架会调用此成员函数)Remark:It is called to prepare an invalidated region for painting.The default implementation erases the background using the window class background brush specified by the hbrBackground member of the window class structure. (默认是用window类背景刷来擦除背景)If the hbrBackground member is NULL, your overridden version of OnEraseBkgnd should erase the background color. Your version should also align the origin of the intended brush with the CWnd coordinates by first calling UnrealizeObject for the brush, and then selecting the brush.An overridden OnEraseBkgnd should return nonzero in response to WM_ERASEBKGND if it processes the message and erases the background; this indicates that no further erasing is required. If it returns 0, the window will remain marked as needing to be erased. (Typically, this means that the fErase member of the PAINTSTRUCT structure willbe TRUE.)Windows assumes the background is computed with the MM_TEXT mapping mode. If the device context is using any other mapping mode, the area erased may not be within the visible part of the client area.Note:This member function is called by the framework to allow your application to handle a Windows message. The parameters passed to your function reflect the parameters received by the framework when the message was received. If you call the base-class implementation of this function, that implementation will use the parameters originally passed with the message and not the parameters you supply to thefunction.(注意:为了使你的应用程序能够处理windows消息(WM_ERASEBKGND),框架自动调用此函数。
onctlcolor详解
如何在VC中改变控件的背景色转载自《电脑报》(文/欧阳沐)提要:在VC编程中要改变控件(诸如CView, CFrameWnd, or CWnd等)的背景色可通过处理特定的消息来实现。
但如果想改变按钮的颜色,就只能使用自绘制的按钮(也可以用位图按钮,此处未做说明)而不能通过OnCtlColor()改变。
正文:一、在一个MFC应用程序中,要改变控件的背景色可通过重载OnCtlColor()函数来实现。
方法是在该函数中设置所需颜色后再返回一个画刷句柄便可重绘控件背景色。
OnCtlColor()函数对于控件背景色的处理是通过捕捉相应的控件消息来实现的。
常用的此类消息有:CTLCOLOR_DLG 对话框CTLCOLOR_EDIT 编辑框CTLCOLOR_LISTBOX 列表框CTLCOLOR_MSGBOX 消息框CTLCOLOR_SCROLLBAR 滑动条CTLCOLOR_STATIC 静态文本框、矩形等。
以下示例代码说明如何更改以上控件的背景色://CmyDialog.h定义class CMyDialog : public Cdialog //派生自己的对话框类{……..// Implementationprotected:// Generated message map functions//{{AFX_MSG(CMyDialog)afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);…….//}}AFX_MSGDECLARE_MESSAGE_MAP()};//CmyDialog.cpp 定义……HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){switch (nCtlColor) {case CTLCOLOR_EDIT:case CTLCOLOR_MSGBOX:case CTLCOLOR_DLG :case CTLCOLOR_EDIT : //在此加入你想要改变背景色的控件消息pDC->SetBkMode(TRANSPARENT);HBRUSH B = CreateSolidBrush(COLOR); //COLOR是你想设置的颜色return (HBRUSH) B;default: //其他控件设置自己默认的颜色和背景刷.return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);}}说明:1、可分别处理以上消息以实现不同控件不同背景色。
VC改变对话框按钮字体颜色和背景的解决方案[整理]
VC改变对话框按钮字体颜色和背景的解决方案要想修改CButton类按钮背景颜色和文字颜色,必须利用自绘方法对按钮进行重新绘制。
这可以通过定义一个以CButton为基类的新按钮类来实现。
以下为具体的实现方法:方法一:加入一个新类,类名:CButtonEx,基类:CButton。
在头文件 CButtonEx.h 中加入以下变量和函数定义:private:int m_Style; //按钮形状(0-正常,1-当前,2-按下,3-锁定)BOOL b_InRect; //鼠标进入标志CString m_strText; //按钮文字COLORREF m_ForeColor; //文本颜色COLORREF m_BackColor; //背景色COLORREF m_LockForeColor; //锁定按钮的文字颜色CRect m_ButRect; //按钮尺寸CFont* p_Font; //字体void DrawButton(CDC *pDC); //画正常的按钮// 接口函数public:void SetText(CString str);void SetForeColor(COLORREF color); //设置文本颜色void SetBkColor(COLORREF color); //设置背景颜色void SetTextFont(int FontHight,LPCTSTR FontName); //设置字体在 CButtonEx.cpp 的构造函数中初始化变量:CButtonEx::CButtonEx(){m_Style = 0; //按钮形状风格b_InRect = false; //鼠标进入标志m_strText = _T(""); //按钮文字(使用默认文字) m_ForeColor = RGB(0,0,0); //文字颜色(黑色) m_BackColor = RGB(243,243,243); //背景色(灰白色)m_LockForeColor = GetSysColor(COLOR_GRAYTEXT); //锁定按钮的文字颜色p_Font = NULL; //字体指针}用ClassWizard添加下列消息函数:PreSubclassWindow();DrawItem();onMouseMove();OnLButtonDown();OnLButtonUp();在各函数内加入代码:void CButtonEx::PreSubclassWindow(){ModifyStyle( 0, BS_OWNERDRAW ); //设置按钮属性为自画式CButton::PreSubclassWindow();}PreSubclassWindow()在按钮创建前自动执行,所以我们可以在其中做一些初始工作。
C#更改tabControl选项卡颜色的方法
C#更改tabControl选项卡颜⾊的⽅法本⽂实例讲述了C#更改tabControl选项卡颜⾊的⽅法。
分享给⼤家供⼤家参考,具体如下:private void Form1_Load(object sender, EventArgs e){this.tabControl1.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;this.tabControl1.DrawItem += new DrawItemEventHandler(this.tabControl1_DrawItem);}private void tabControl1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e){StringFormat sf = new StringFormat();sf.LineAlignment = StringAlignment.Center;sf.Alignment = StringAlignment.Center;if (e.Index == tabControl1.SelectedIndex)e.Graphics.FillRectangle(Brushes.Red, e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height);elsee.Graphics.FillRectangle(Brushes.White, e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height);e.Graphics.DrawString(((TabControl)sender).TabPages[e.Index].Text,System.Windows.Forms.SystemInformation.MenuFont, new SolidBrush(Color.Black), e.Bounds, sf);}1.在Form类的构造函数中添加下列语句:this.tabControl1.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;this.tabControl1.DrawItem += new DrawItemEventHandler(this.tabControl1_DrawItem);2.实现下列函数:private void tabControl1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e){Font fntTab;Brush bshBack;Brush bshFore;if ( e.Index == this.tabControl1.SelectedIndex){fntTab = new Font(e.Font, FontStyle.Bold);bshBack = new System.Drawing.Drawing2D.LinearGradientBrush(e.Bounds, SystemColors.Control, SystemColors.Control, System.Drawing.Drawing2D.LinearGradientMode.BackwardDiagonal); bshFore = Brushes.Black;}else{fntTab = e.Font;bshBack = new SolidBrush(Color.Blue );bshFore = new SolidBrush(Color.Black);}string tabName = this.tabControl1.TabPages[e.Index].Text;StringFormat sftTab = new StringFormat();e.Graphics.FillRectangle(bshBack, e.Bounds);Rectangle recTab = e.Bounds;recTab = new Rectangle( recTab.X, recTab.Y + 4, recTab.Width, recTab.Height - 4);e.Graphics.DrawString(tabName, fntTab, bshFore, recTab, sftTab);}更多关于C#相关内容感兴趣的读者可查看本站专题:《》、《》、《》及《》希望本⽂所述对⼤家C#程序设计有所帮助。
VC++ 改变控件字体大小颜色的方法
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
//change the color of dialog
if(nCtlColor==CTLCOLOR_DLG)
很多人都觉得自己的程序的界面不那么美观,往往VC默认产生的对话框比较单调,因此很多人往往找到很多其它的控件对对话框进行美化修饰,例如给静态控件设置字体,设置背景颜色等等,其实这些完全可以由VC自己的WM_CTLCOLOR消息来完成!
WM_CTLCOLOR消息,使你可以告诉Windows在画各种控件的背景时用什么刷子。在Windows要画控件的时候,它发送WM_CTLCOLOR给控件的父窗口。这是你改变控件背景的好机会。
CFont font;
font.CreatePointFont(100, _T("宋体"));//改变大小
m_wndEditBox.SetFont(&font);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////改变字体颜色////////////////////////////////////////////////////////////////
首先在自己需要设置界面的对话框上点击右键-->在右侧属性栏中加入WM_CTLCOLOR消息-->自动生成OnCtlColor
MFCButton控件的背景颜色
MFCButton控件的背景颜色MFC Button控件的背景颜色一个继承于CButton的按钮控件类,实现Button背景色与文字的共存与改变,可以自行设计背景色。
头文件:CMyButton.h 如下:#pragma once#include "afxwin.h"class CMyButton : public CButton{//DECLARE_DYNAMIC(CMyButton)public:CMyButton();virtual ~CMyButton();//设置Button Down的背景颜色void SetDownColor(COLORREF color);//设置Button Up的背景颜色void SetUpColor(COLORREF color);BOOL Attach(const UINT nID, CWnd* pParent);protected://必需重载的函数virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);public://三种颜色分别为文字,Button Down的背景颜色,Button Up 的背景颜色COLORREF m_TextColor, m_DownColor, m_UpColor;};源文件:CMyButton.cpp#include "StdAfx.h"#include "CMyButton.h"CMyButton::CMyButton(void){m_DownColor = m_UpColor = RGB(0,0,0);}CMyButton::~CMyButton(void){}//CMyButton是CButton派生类,具有CButton的全部成员函数,//但在创建时需要使用BS_OWNERDRAW风格。
//如果按钮不是动态生成,使用Attach函数使CMyButton代替原来按钮的窗口过程。
WM_CTLCOLOR和OnCtlColor消息的用法
WM_CTLCOLOR和OnCtlColor消息的用法很多人都觉得自己的程序的界面不那么美观,往往VC默认产生的对话框比较单调,因此很多人往往找到很多其它的控件对对话框进行美化修饰,例如给静态控件设置字体,设置背景颜色等等,其实这些完全可以由VC自己的WM_CTLCOLOR消息来完成!WM_CTLCOLOR消息用来完成对EDIT、STATIC、BUTTON等控件设置背景和字体颜色,其用法如下:1.首先在自己需要设置界面的对话框上点击右键-->建立类向导-->加入WM_CTLCOLOR消息-->自动生成OnCtlColor()函数,此函数可以对本对话框的控件的界面外观做修饰,用法如下:将类向导产生的函数做如下修改:HBRUSH CDialogColor::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC,pWnd, nCtlColor);// TODO: Change any attributes of theDC here//设置显示字体CFont * cFont=new CFont;cFont->CreateFont(16,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,"Arial");//对特定的控件做修改switch(nCtlColor){case CTLCOLOR_STATIC: //对所有静态文本控件的设置{pDC->SetBkMode(TRANSPARENT);//设置背景为透明pDC->SetTextColor(RGB(255,255,0)); //设置字体颜色pWnd->SetFont(cFont); //设置字体HBRUSH B = CreateSolidBrush(RGB(125,125,255));//创建画刷return (HBRUSH) B; //返回画刷句柄}case CTLCOLOR_EDIT: //对所有编辑框的设置{pDC->SetBkMode(TRANSPARENT);pDC->SetTextColor(RGB(255,255,0));pWnd->SetFont(cFont);HBRUSH B = CreateSolidBrush(RGB(125,125,255));return (HBRUSH) B;}default:return CDialog::OnCtlColor(pDC,pWnd, nCtlColor);}}注:case的类别有以下几种:CTLCOLOR_BTN 按钮控件CTLCOLOR_DLG 对话框CTLCOLOR_EDIT 编辑框CTLCOLOR_LISTBOX 列表框CTLCOLOR_MSGBOX 消息框CTLCOLOR_SCROLLBAR 滚动条CTLCOLOR_STATIC 静态文本2.你可能觉得对所有的控件使用统一的界面设置觉得不自由,其实VC同样可以对特定的ID 的控件进行设置,方法如下:switch (pWnd->GetDlgCtrlID()){//针对ID为IDC_CTL1、IDC_CTL2和IDC_CTL3的控件进行同样的设置case IDC_CTL1:case IDC_CTL2:case IDC_CTL3:{pDC->SetBkMode(TRANSPARENT);pDC->SetTextColor(RGB(255,255, 0));pWnd->SetFont(cFont);HBRUSH B = CreateSolidBrush(RGB(125,125,255));return (HBRUSH) B;}default:return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);}通过消息WM_CTLCOLOR我们可以改变对话框或一些特殊控件的背景颜色1、添加WM_CTLCOLOR消息映射。
OnCtrlColor,OnDrawItem,DrawItem,OnPaint之间关系
最近考虑写控件库,我想不外忽两种方法,一种是重载DrawItem(),一种是重载OnPaint();前面写了Button的,感觉如果重载DrawItem(), 可能要处理的消息,事件要多一些而重载OnPaint的话,可能相应,要考虑的事件,消息要少一些。
具体也是不清楚了,到底是重载那一个好呢。
如果是重载OnPaint(),可能刷新的时候,会出现闪烁。
至于事件,只要调用基类的就可以了。
因为重载OnPaint()没有改变控件本来的属性,只是重画他的外观。
而如果重载DrawItem(),则必须要设置OWNERDRAW属性,这回去掉许多控件本来具备的属性。
比如CheckBox,设置了OWNERDRAW后,GetCheck, SetCheck都会失效。
我再网上看了大量的资料,好像大不分都是重载DrawItem,它们之间到底那一个会好一些呢,总的来说。
重载DrawItem()的话,要设置OWENERDRAW属性,这可能会改变某些控件的默认响应方式吧,哦,或许这取决于我怎么样去响应它,或者说有些响应我要自己去加,比如CheckButton 的GetState (),SetCheck()等等(而这会导致潜在的同系统不一致)。
至于重载OnPaint(),因为没有改变它的属性,所以我只需要简单的载重载的响应(消息、虚函数)中,再调用基类的版本就可以了。
这样我就可以吧焦点放在画上。
不知道我的理解对不对呢!人好少啊!谢谢你的指教xianglitian(向立天) 。
我个人比较喜欢重载OnPaint()函数,这样就可以向你说得把注意力都集中在画上。
但是我觉得重绘控件最为关键的不只是画,而是实现效果。
你可以试一下,大多数自绘按钮,当你连续点击时,感觉反应有些慢。
其实消息响应是没问题的,只是视觉效果没有体现出来。
因此,我认为当自绘控件时,不单单要把控件画好看,还要注意其整体的视觉效果。
恩,好坚定了我重载OnPaint的信心,我想也是重载OnPaint可能会方便些。
如何改变控件的字体和字体颜色
如何改变控件的字体和字体颜色如何改变控件的字体和字体颜色问题详述很多时候,对话框上各种子控件需要不同的的字体以达到某种效果,该如何实现呢?专家解答由于控件也是窗口,用户可以调用CWnd::SetFont指定新字体。
该函数用了一个CFont指针,要保证在控件撤销之前不能撤销该字体对象。
下面介绍一下该函数:CWnd::SetFontThis method sets the current font of the window to the specified font.void SetFont(CFont* pFont,BOOL bRedraw = TRUE );ParameterspFontSpecifies the new font.bRedrawIf TRUE, redraw the CWnd object.RequirementsWindows CE versions: 1.0 and laterHeader file: Declared in Afxwin.hPlatform: H/PC Pro, Palm-size PC, Pocket PC与此函数对应的还有CFont::GetFontCWnd::GetFontThis method retrieves the current font for this window.CFont* GetFont( )const;Return ValueReturns a pointer to a CFont that contains the current font.The pointer may be temporary and should not be stored for later use.RequirementsWindows CE versions: 1.0 and laterHeader file: Declared in Afxwin.hPlatform: H/PC Pro, Palm-size PC, Pocket PC本问题的对应工程为CtrlFont,相关代码如下://在对话框头文件中声明两个字体变量,分别对应两个按钮的字体Protected:CFont m_fntOk;//ok按钮对应的字体CFont m_fntCancel;//cancel按钮对应的字体//设置字体BOOL CCtrlFontDlg::OnInitDialog(){CDialog::OnInitDialog();//创建字体m_fntOk.CreateFont(MulDiv(8,GetDC()->GetDeviceCaps(LO GPIXELSY),72),0,0,0,FW_NORMAL,0,0,0,ANSI_CHARSET,OUT_STR OKE_PRECIS,CLIP_STROKE_PRECIS,DRAFT_QUALITY,VARIABLE_PI TCH|FF_SWISS,_T(“Arial”));//设置ok按钮的字体CWnd *pWnd=GetDlgItem(IDOK);pWnd-.SetFont(&m_fntOk);//创建字体m_fntCancel.CreateFont(12,10,10,10,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRE CIS,DEFAULT_QUALITY,DEFAULT_PITCH|SWISS,””);//设置cancel按钮的字体pWnd=GetDlgItem(IDCANCEL);pWnd->SetFont(&m_fntCancel);//IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX<0xF000);CMenu* pSysMenu=GetSystemMenu(FALSE);If(pSysMenu!=NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if(!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_AEPARATOR);pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,str AboutMenu);}}//Set the icon for this dialog. The framework does this automatically//when the application’s main window is not a dialogSetIcon(m_hIcon,TRUE);SetIcon(m_hIcon,FALSE);Return TRUE;}//设置字体颜色在MFC类库中提供了CWnd::OnCtlColor函数在工作框架的窗口被重画时将调用该成员函数,因此可以重载WM_CTLCOLOR消息的响应函数,此函数的原型:CWnd::OnCtlColorThis method is called by the framework when a child control is about to be drawn. Most controls send this message to their parent, usually a dialog box, to prepare the pDC for drawing the control using the correct colors.afx_msg HBRUSH OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor);ParameterspDCContains a pointer to the display context for the child window. May be temporary.pWndContains a pointer to the control asking for the color. May be temporary.nCtlColorContains one of the following values, specifying the type of control: (指定控件的类型)· CTLCOLOR_BTN Button control (按钮控件)· CTLCOLOR_DLG Dialog box (对话框)· CTLCOLOR_EDIT Edit control (编辑控件)· CTLCOLOR_LISTBOX List-box control (列表控件)· CTLCOLOR_MSGBOX Message box (消息框)· CTLCOLOR_SCROLLBAR Scroll-bar control (滚动条控件)· CTLCOLOR_STATIC Static control (静态控件)Return ValueOnCtlColor must return a handle to the brush that is to be used for painting the control background.RemarksTo change the text color, call the SetTextColor method with the desired red, green, and blue (RGB) values.To change the background color of a single-line edit control, set the brush handle in both the CTLCOLOR_EDIT and CTLCOLOR_MSGBOX message codes, and call the CDC::SetBkColor method in response to the CTLCOLOR_EDIT code.OnCtlColor will not be called for the list box of a drop-down combo box because the drop-down list box is actually a child of the combo box and not a child of the window. To change the color of the drop-down list box, create a CComboBox with an override of OnCtlColor that checks for CTLCOLOR_LISTBOX in the nCtlColor parameter. In this handler, the SetBkColor method must be used to set the background color for the text.This method is called by the framework to allow your application to handle a Windows CE message. The parameters passed to your method reflect the parameters received by the framework when the message was received. If you call the base-class implementation of this method, that implementation will use the parameters originally passed with the message and not the parameters you supply to the method.Example// This OnCtlColor handler will change the color of a static control// with the ID of IDC_MYSTATIC. The code assumes that the CMyDialog// class has an initialized and created CBrush member named m_brush.// The control will be painted with red text and a background // color of m_brush.HBRUSH CZilchDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){// Call the base class implementation first! Otherwise, it may // undo what we are trying to accomplish here.HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// Are we painting the IDC_MYSTATIC control? We can use // CWnd::GetDlgCtrlID() to perform the most efficient test.if (pWnd->GetDlgCtrlID() == IDC_MYSTATIC){// Set the text color to red.pDC->SetT extColor(RGB(255, 0, 0));// Set the background mode for text to transparent// so background will show thru.pDC->SetBkMode(TRANSPARENT);// Return handle to our CBrush object.hbr = m_brush;}return hbr;}假设你已有了名为My的对话框工程,你有了一个STATIC的控件,IDC_STATIC1HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: Change any attributes of the DC hereif(nCtlColor==CTLCOLOR_STATIC){pDC->SetT extColor(RGB(255,0,0));//字体颜色pDC->SetBkColor(RGB(0,0,255));//字体背景颜色}// TODO: Return a different brush if the default is not desired return hbr;}如果要指定某个特定控件可以这样写:ID为IDC_STATIC1if(pWnd->GetDlgCtlID()==IDC_STATIC1){pDC->SetT extColor(RGB(255,0,0));//pDC->SetBkMode(TRANSPARENT);//设置字体背景为透明return (HBRUSH)::GetStockObject(BLACK_BRUSH);//设置背景色}Return hbr;。
MFC中改变对话框背景的几个消息函数OnEraseBkgnd、 OnPaint、 OnCtlColor的调用顺序
MFC中改变对话框背景的几个消息函数OnEraseBkgnd、OnPaint、OnCtlColor的调用顺序设置对话框背景颜色及背景图片可在OnCtlColor(),OnEraseBkgnd(),OnPaint()里设置,对话框初始化完毕,显示时调用OnSize()->OnEraseBkgnd(),->OnPaint()->OnCtlColor(), 若想改变对话框大小,比如全屏显示ShowWindow(SW_SHOWMAXIMIZED);UpdateWindow();其中ShowWindow会调用OnSize()->OnEraseBkgnd(),UpdateWindow();调用OnPaint()->OnCtlColor(),若对话框中没有设置消息响应OnEraseBkgnd(),,则系统默认消息响应OnEraseBkgnd()会调用OnCtlColor()设置对话框背景(即替代OnEraseBkgnd())对话框的背景设置可在OnCtlColor()中进行,因为OnCtlColor()一般会被多次调用,所以要想设置的CFont,CBrush等应在OnInitDialog中初始化,若要在OnCtlColor()中设置,在设置前先调用Detach就可以了,如下示例HBRUSH CDb3Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){if(pWnd->GetDlgCtrlID()==IDC_STATIC5){m_font.CreatePointFont(300,"宋体");pDC->SelectObject(&m_font);m_font.Detach();pDC->SetBkMode(TRANSPARENT);return (HBRUSH)::GetStockObject(NULL_BRUSH);}}但是如果在OnCtlColor()在设置背景图片,则图片不会随对话框大小按比例缩放所以可调用StretchBlt()函数设置,如下示例:void CDb3Dlg::OnPaint(){CClientDC cdc(this); CDC comdc;comdc.CreateCompatibleDC(&cdc);CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP2);comdc.SelectObject(&bitmap);CRect rect;GetClientRect(rect);BITMAP bit;bitmap.GetBitmap(&bit);cdc.StretchBlt(0,0,rect.Width(),rect.Height(),&comdc,0,0,bit.bmWidth,bit.bmHeight,SRCCOPY);}//全屏显示对话框背景图片(限bmp格式)用了两年的VC,其实对OnPaint的工作原理一直都是一知半解。
Ex_color改变对话框的颜色面向对象VC++程序设计论文
面向对象VC++程序设计论文Ex_color改变对话框的颜色专业班级:10级软件工程(日语强化)1班*名:***选课序号:20学号:**********信息科学技术学院第1章绪论熟练掌握vc运行环境,以及对MFC的应用。
熟悉V isual C++ 6.0的开发环境(工具栏及各种窗口)VC++控件及其属性简介(1)CStatic(静态控件):显示一些几乎固定不变的文字或图形描述。
(2)CButton(按钮控件):产生某些命令或改变某些选项设置。
(3)CEdit(编辑框控件):完成文字的输入输出双向操作,查看并编辑文字。
(4)CListBox(列表框控件):显示一个列表,让用户从中选取一个或多个项。
(5)CComboBox(组合框):将列表框和编辑框有机地组合在一起,可选择列表中已有的项,还可以编辑出新的项。
开发平台用vc++6.0运行环境和一台PC机2.设计流程1.添加并设计对话框(1) 用MFC AppWizard(exe)创建一个默认的单文档应用程序Ex_Ctrl5SDI。
(2) 向应用程序中添加一个对话框资源IDD_COLOR,标题定为“调整对话框背景颜色”,字体设为“宋体,9号”,创建此对话框类为CBkColorDlg。
(3) 删除原来的[Cancel]按钮,将[OK]按钮的标题改为“退出”。
2. 完善CBkColorDlg类代码(1) 打开ClassWizard的Member V ariables页面,看看Class name是否是CBkColorDlg,选中所需的控件ID号,双击鼠标。
依次为下列控件增加成员变量。
(2)为CBkColorDlg类添加两个成员变量,一个是intm_nRedV alue,用来设置颜色RGB中的红色分量,一个是画刷CBrush类对象m_Brush,用来设置对话框背景所需要画刷。
(3) 用MFC ClassWizard为CBkColorDlg类添加WM_INITDIALOG消息映射,并添加下列初始化代码:BOOL CBkColorDlg::OnInitDialog(){CDialog::OnInitDialog();m_scrollRed.SetScrollRange(0, 255);m_sliderBlue.SetRange(0, 255);m_sliderGreen.SetRange(0, 255);m_nBlue = m_nGreen = m_nRedV alue = 192;UpdateData( FALSE );m_scrollRed.SetScrollPos(m_nRedV alue);return TRUE; // return TRUE unless you set the focus to a control}(4) 用MFC ClassWizard为CBkColorDlg类添加WM_HSCROLL消息映射,并添加代码。
QPalette改变控件颜色
QPalette
在实际应用中,常常需要改变某个控件的颜色 外观,如背景、文字颜色等,QT提供的调色 板QPalette专门用于管理对话框的外观显示 QPalette有两个基本概念:ColorGroup 和 ColorRole
ColorGroup
ColorGroup包括三种不同的状态: 1、 QPalette::Active:获得焦点的状态 2、 QPalette::Inactive:未获得焦点的状态 3、 QPalette::Disable:不可用状态
编写一个文本编辑框
编写一个文本编辑界面,要求可以修改文本框 的背景色,字体,文字颜色,界面背景颜色
ColorRole
ColorRole指的是颜色主题,即对窗体中不同 部位颜色的分类。常用的有以下几种: QPalette::Window:背景色 QPalette::WindowText:前景色 QPalette::Button:按钮背景色 QPalette::ButtonText:按钮前景色 QPalette::ToolTipBase:提示符背景色 QPalette::ToolTipText:提示符前景色
例子ቤተ መጻሕፍቲ ባይዱ
设置背景颜色 QFrame frame; frame->setAutoFillBackground( true ); QPalette p = frame-> palette(); p.setColor(QPalette::Window, color ); frame->setPalette( p );
setColor
QPalette类使用最多的函数是setColor()函数, 其原型是: QPalette:: setColor( ColorRole r, const QColor &c ) QPalette:: setColor( ColorGroup gr, ColorRole r, const QColor &c )
MFC 修改各种控件的背景颜色、字颜色和字体
MFC 修改各种控件的背景颜色、字颜色和字体今天主要总结一下有关MFC 中静态编辑框(StaticEdit)、编辑框(Edit)和按钮(Button)的背景颜色、字颜色和字体。
我的程序运行结果如下:由上图我们知道修改的地方有:1、把StaticEdit的背景颜色变成黄色,字体颜色变成蓝色;2、Edit的背景颜色变成黄色,字体变成红色,字体为华文楷体3、Button的背景颜色为绿色,字体为红色。
1、对StaticEdit控件修改在0106ChangeColorDlg.h中添加一个变量CBrush m_brush,用来保存控件的背景颜色;对0106ChangeColorDlg添加一个响应WM_CTLCOLOR消息,在OnCtlColor函数中添加如下代码:else if(pWnd->GetDlgCtrlID()==IDC_STA)//如果是静态编辑框{pDC->SetTextColor(RGB(0,0,255));//修改字体的颜色pDC->SetBkMode(TRANSPARENT);//把字体的背景变成透明的return m_brush;//返回背景色}2、对Edit控件修改在OnCtlColor函数中添加如下代码:if(pWnd->GetDlgCtrlID()==IDC_EDIT1)//如果是编辑框{pDC->SetTextColor(RGB(255,0,0));//设置编辑框字体的颜色pDC->SetBkColor(RGB(255,255,0));//设置字体背景颜色CFont font;font.CreatePointFont(100,"华文楷体");pDC->SelectObject(&font);//设置字体return m_brush;}3、对Button控件修改对Button按钮修改需要通过重写DrawItem方法,所以写一个类CSXBtn,继承于CButton类。
mfc color button control 用法
在MFC(Microsoft Foundation Classes)中,可以使用CButton 类来创建一个按钮,然后通过设置按钮的属性来实现彩色按钮的效果。
以下是一个简单的示例:cpp#include<afxwin.h>class CMyDlg:public CDialog{public:CMyDlg(*=NULL):CDialog(::,){// 创建一个按钮,并设置其文本和颜色.Create("Color Button",||, CRect(100,100,200,100),this,);// 设置按钮的颜色.SetColor();}protected:virtual void DoDataExchange(*){CDialog::DoDataExchange();DDX_Control(,,);}private:;};DlgProc(,,, ){*=reinterpret_cast<CMyDlg*>(GetWindowLongPtr(, ));if(!=NULL){->DispatchMessage(,,);}return0;}int WinMain(,, ,int){// 创建一个 MFC 应用程序对象;// 初始化 MFC 应用程序对象if(!.InitInstance()){return;}// 创建主对话框;.DoModal();// 运行 MFC 应用程序的消息循环.Run();return0;}在上述代码中,创建了一个基于对话框的MFC 应用程序。
在对话框中添加了一个彩色按钮,并通过SetColor方法设置了按钮的颜色。
请注意,上述示例仅演示了如何创建一个彩色按钮,你可以根据需要进一步扩展该示例,例如添加按钮点击事件处理等。
如何改变文本颜色
如何改变文本颜色?
改变文本颜色,需要一个很重要的函数,就是OnCtlColor,而这个是在定义的消息有介绍的。
在上图中,将需要进行的消息映射WM_CTLCOLOR,产生对应的函数(就是上面那个),然后就需要填充函数体了。
默认的函数体是:
上面重点标记的部分是自己编写的。
注意这里出错过!
很简单,要设置画笔的颜色,所以是SetTextColor函数,而这个color是自定义的一个COLORREF类型的变量来表示颜色的!关键是if语句,里面的参数到底是什么呢?
我开始选择的是CTLCOLOR_BTN,也就是按钮来改变颜色,可是现在实际上是CTLCOLOR_EDIT 来改变颜色的,所以出错在这里。
看MSDN原文:
if(nCtlColor == CTLCOLOR_EDIT){
pDC->SetTextColor(color);
}
if(nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetTextColor(color);
}
上面的效果就是在点击的时候Static控件颜色也变化了,只是需要激活区域才发生变化而已,我们只需要调用Setforcus函数就可以实现了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return hbr; }
如果要指定某个特定控件可以这样写:ID 为 IDC_STATIC1
if (pWnd->GetDlgCtrlID()==IDC_STATIC1) {
pDC->SetTextColor(RGB(255,0,0)); //设置字体颜色 pDC->SetBkMode(TRANSPARENT); //设置字体背景为透明 // TODO: Return a different brush if the default is not desired return (HBRUSH)::GetStockObject(BLACK_BRUSH); // 设置背景色
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here if (nCtlColor==CTLCOLOR_STATIC)
{ pDC->SetTextColor(RGB(255,0,0)); //字体颜色 pDC->SetBkColor(RGB(0, 0, 255)); //字体背景色
afx_msg HBRUSH OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColor); 参数 nCtlColor 用于指定控件的类型,可以是:
.CTLCOLOR_BTN
按钮控件
.CTLCOLOR_DLG .CTLCOLOR_EDIT
对话框 编辑框
.CTLCOLOR_LISTBO
消息控件
.CTLCOLOR_SCROLLBAR 滚动条控件
.CTLCOLOR_STATIC
静态控件
[程序实现] 假设你已有了名为 My 的对话框工程.你有了一个 STATIC 的控件,ID 为 IDC_STATIC1.
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
} else return hbr;
【注】
BLACK_BRUSH:黑色 WHITE_BRUSH:白色 GRAY_BRUSH:灰色 NULL_BRUSH:透明 HOLLOW_BRUSH :透明
VC 使用 OnCtlColor 函数来改变控件颜色
编程 2009-01-15 09:22:34 阅读 223 评论 1 字号:大中小 订阅
在 MFC 类库提供了 CWnd::OnCtlColor 函数,在工作框架的子窗口被重画时将调用该成员函数.因此可以重
载 WM_CTLCOLOR 消息的响应函数.此函数的原型: