设置vc中MFC的Button颜色和字体,CButton继承类的三色和字体设置
2013-09-12 01:48
696 查看
// ButtonColor.cpp : implementation file
//
#include "stdafx.h"
#include "MyButtonFont.h"
#include "ButtonColor.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CButtonColor
CButtonColor::CButtonColor()
{
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;
}
CButtonColor::~CButtonColor()
{
if ( p_Font ) delete p_Font; //删除字体
}
BEGIN_MESSAGE_MAP(CButtonColor, CButton)
//{{AFX_MSG_MAP(CButtonColor)
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CButtonColor message handlers
void CButtonColor::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
ModifyStyle(0,BS_OWNERDRAW);
CButton::PreSubclassWindow();
}
void CButtonColor::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
UINT uStyle = 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);
// Get the button's text.
CString strText;
GetWindowText(strText);
// Draw the button text using the text color red.
COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, m_ForeColor);
::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),
&lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
::SetTextColor(lpDrawItemStruct->hDC, crOldColor);
//===========
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC );
m_ButRect = lpDrawItemStruct->rcItem; //获取按钮尺寸
ASSERT_VALID(pDC);
if( m_strText.IsEmpty())
{
GetWindowText( m_strText ); //获取按钮文本
}
int nSavedDC = pDC->SaveDC();
VERIFY( pDC );
DrawButtonColor(pDC);
pDC->RestoreDC(nSavedDC);
}
//设置文本颜色
void CButtonColor::SetFontColor(COLORREF color)
{
m_ForeColor = color;
Invalidate();
}
//设置按钮文本
void CButtonColor::SetText(CString str)
{
m_strText = _T("");
SetWindowText(str);
}
//设置背景颜色
void CButtonColor::SetBackColor(COLORREF color)
{
m_BackColor = color;
Invalidate();
}
//设置字体(字体高度、字体名)
void CButtonColor::SetTextFont(int FontHight,LPCTSTR FontName)
{
if ( p_Font )
delete p_Font; //删除旧字体
p_Font = new CFont;
int m_FontSize=0;
m_FontSize= FontHight*8;
p_Font->CreatePointFont(m_FontSize, FontName ); //创建新字体
CFont nFont;
LOGFONT gridTitleFont;
SetFont(p_Font,TRUE); //设置字体
}
void CButtonColor::DrawButtonColor(CDC *pDC)
{
//调整状态
if( m_Style==3 )
{
m_Style = 0;
}
if( GetStyle() & WS_DISABLED )
{
m_Style = 3;
}
//禁止状态
//根据状态调整边框颜色和文字颜色
COLORREF bColor;
COLORREF fColor; //bColor为边框颜色,fColor为文字颜色
switch(m_Style)
{
case 0:
bColor = RGB(192,192,192);
fColor = m_ForeColor;
break; //正常按钮
case 1:
bColor = RGB(255,255,255);
fColor = m_ForeColor;
break; //鼠标进入时按钮
case 2:
bColor = RGB(192,192,192);
fColor = m_ForeColor;
break; //按下的按钮
case 3:
{
CRect itemRect = m_ButRect;
bColor = m_BackColor;
//底色为白色
fColor = GetSysColor(COLOR_3DSHADOW); //在后面会执行一次。
//第二颜色为黑色
pDC->SetTextColor( GetSysColor(COLOR_3DHILIGHT) );
itemRect.top =m_ButRect.top +20;
itemRect.left =m_ButRect.left +2;
pDC->DrawText(m_strText,m_strText.GetLength(),itemRect, DT_WORDBREAK | DT_CENTER);
break; //锁定的按钮
}
//绘制按钮背景
CBrush Brush;
Brush.CreateSolidBrush( m_BackColor ); //背景刷
//pDC->SelectObject( &Brush );
bColor = this->m_ForeColor;
if (m_Style==3)
{
bColor=RGB(192,192,192);
}
CPen Pen;
Pen.CreatePen(PS_SOLID, 1, bColor );
pDC->SelectObject( &Pen );
pDC->RoundRect(&m_ButRect,CPoint(0,0)); //画圆角矩形
//绘制按钮按下时的边框
if( m_Style!=2 )
{
CRect Rect;
Rect.SetRect( m_ButRect.left, m_ButRect.top, m_ButRect.right, m_ButRect.bottom );
//pDC->DrawEdge(&Rect, BDR_RAISEDINNER, BF_RECT ); //画边框
}
//绘制按钮文字
pDC->SetTextColor( fColor ); //画文字
pDC->SetBkMode( TRANSPARENT );
pDC->DrawText( m_strText, &m_ButRect, DT_SINGLELINE | DT_CENTER
| DT_VCENTER | DT_END_ELLIPSIS);
//绘制拥有焦点按钮的虚线框
int bian=3.5;
if(GetFocus()==this )
{
CRect Rect;
Rect.SetRect(m_ButRect.left+bian, m_ButRect.top+bian, m_ButRect.right-bian, m_ButRect.bottom-bian );
pDC->DrawFocusRect(&Rect); //画拥有焦点的虚线框
}
}
#if !defined(AFX_BUTTONCOLOR_H__6B15BD45_1EB9_4D3E_8274_0587D1AB2892__INCLUDED_)
#define AFX_BUTTONCOLOR_H__6B15BD45_1EB9_4D3E_8274_0587D1AB2892__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ButtonColor.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CButtonColor window
class CButtonColor : public CButton
{
// Construction
public:
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; //字体
CButtonColor();
// Attributes
public:
void SetText(CString str);
void SetFontColor(COLORREF color); //设置文本颜色
void SetBackColor(COLORREF color); //设置背景颜色
void SetTextFont(int FontHight,LPCTSTR FontName); //设置字体
void DrawButtonColor(CDC *pDC);
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CButtonColor)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
protected:
virtual void PreSubclassWindow();
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CButtonColor();
// Generated message map functions
protected:
//{{AFX_MSG(CButtonColor)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_BUTTONCOLOR_H__6B15BD45_1EB9_4D3E_8274_0587D1AB2892__INCLUDED_)
调用 方法。在Afx.h里面include文件
this->btFontSet.SetText("Hell,this is Supper Button");
this->btFontSet.SetTextFont(12,"Arial Black");
this->btFontSet.SetFontColor(RGB(0,0,0));
m_BTHand = AfxGetApp()->LoadCursor(IDC_Hand);
BOOL CMyButtonFontDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg-> message==WM_MOUSEMOVE)
{//鼠标移动消息
//获得当前鼠标位置
POINT pt=pMsg-> pt;
//转换为客户坐标系
ScreenToClient(&pt);
//获得当前位置的控件窗口指针
CWnd* pWnd=ChildWindowFromPoint(pt);
//获得该窗口的ID
UINT nCtrlID=pWnd-> GetDlgCtrlID();
switch(nCtrlID)
{//判断窗口
case BT_FontSet:
//显示帮助光标
SetCursor(m_BTHand);
break;
default:
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
//
#include "stdafx.h"
#include "MyButtonFont.h"
#include "ButtonColor.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CButtonColor
CButtonColor::CButtonColor()
{
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;
}
CButtonColor::~CButtonColor()
{
if ( p_Font ) delete p_Font; //删除字体
}
BEGIN_MESSAGE_MAP(CButtonColor, CButton)
//{{AFX_MSG_MAP(CButtonColor)
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CButtonColor message handlers
void CButtonColor::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
ModifyStyle(0,BS_OWNERDRAW);
CButton::PreSubclassWindow();
}
void CButtonColor::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
UINT uStyle = 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);
// Get the button's text.
CString strText;
GetWindowText(strText);
// Draw the button text using the text color red.
COLORREF crOldColor = ::SetTextColor(lpDrawItemStruct->hDC, m_ForeColor);
::DrawText(lpDrawItemStruct->hDC, strText, strText.GetLength(),
&lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
::SetTextColor(lpDrawItemStruct->hDC, crOldColor);
//===========
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC );
m_ButRect = lpDrawItemStruct->rcItem; //获取按钮尺寸
ASSERT_VALID(pDC);
if( m_strText.IsEmpty())
{
GetWindowText( m_strText ); //获取按钮文本
}
int nSavedDC = pDC->SaveDC();
VERIFY( pDC );
DrawButtonColor(pDC);
pDC->RestoreDC(nSavedDC);
}
//设置文本颜色
void CButtonColor::SetFontColor(COLORREF color)
{
m_ForeColor = color;
Invalidate();
}
//设置按钮文本
void CButtonColor::SetText(CString str)
{
m_strText = _T("");
SetWindowText(str);
}
//设置背景颜色
void CButtonColor::SetBackColor(COLORREF color)
{
m_BackColor = color;
Invalidate();
}
//设置字体(字体高度、字体名)
void CButtonColor::SetTextFont(int FontHight,LPCTSTR FontName)
{
if ( p_Font )
delete p_Font; //删除旧字体
p_Font = new CFont;
int m_FontSize=0;
m_FontSize= FontHight*8;
p_Font->CreatePointFont(m_FontSize, FontName ); //创建新字体
CFont nFont;
LOGFONT gridTitleFont;
SetFont(p_Font,TRUE); //设置字体
}
void CButtonColor::DrawButtonColor(CDC *pDC)
{
//调整状态
if( m_Style==3 )
{
m_Style = 0;
}
if( GetStyle() & WS_DISABLED )
{
m_Style = 3;
}
//禁止状态
//根据状态调整边框颜色和文字颜色
COLORREF bColor;
COLORREF fColor; //bColor为边框颜色,fColor为文字颜色
switch(m_Style)
{
case 0:
bColor = RGB(192,192,192);
fColor = m_ForeColor;
break; //正常按钮
case 1:
bColor = RGB(255,255,255);
fColor = m_ForeColor;
break; //鼠标进入时按钮
case 2:
bColor = RGB(192,192,192);
fColor = m_ForeColor;
break; //按下的按钮
case 3:
{
CRect itemRect = m_ButRect;
bColor = m_BackColor;
//底色为白色
fColor = GetSysColor(COLOR_3DSHADOW); //在后面会执行一次。
//第二颜色为黑色
pDC->SetTextColor( GetSysColor(COLOR_3DHILIGHT) );
itemRect.top =m_ButRect.top +20;
itemRect.left =m_ButRect.left +2;
pDC->DrawText(m_strText,m_strText.GetLength(),itemRect, DT_WORDBREAK | DT_CENTER);
break; //锁定的按钮
}
//绘制按钮背景
CBrush Brush;
Brush.CreateSolidBrush( m_BackColor ); //背景刷
//pDC->SelectObject( &Brush );
bColor = this->m_ForeColor;
if (m_Style==3)
{
bColor=RGB(192,192,192);
}
CPen Pen;
Pen.CreatePen(PS_SOLID, 1, bColor );
pDC->SelectObject( &Pen );
pDC->RoundRect(&m_ButRect,CPoint(0,0)); //画圆角矩形
//绘制按钮按下时的边框
if( m_Style!=2 )
{
CRect Rect;
Rect.SetRect( m_ButRect.left, m_ButRect.top, m_ButRect.right, m_ButRect.bottom );
//pDC->DrawEdge(&Rect, BDR_RAISEDINNER, BF_RECT ); //画边框
}
//绘制按钮文字
pDC->SetTextColor( fColor ); //画文字
pDC->SetBkMode( TRANSPARENT );
pDC->DrawText( m_strText, &m_ButRect, DT_SINGLELINE | DT_CENTER
| DT_VCENTER | DT_END_ELLIPSIS);
//绘制拥有焦点按钮的虚线框
int bian=3.5;
if(GetFocus()==this )
{
CRect Rect;
Rect.SetRect(m_ButRect.left+bian, m_ButRect.top+bian, m_ButRect.right-bian, m_ButRect.bottom-bian );
pDC->DrawFocusRect(&Rect); //画拥有焦点的虚线框
}
}
#if !defined(AFX_BUTTONCOLOR_H__6B15BD45_1EB9_4D3E_8274_0587D1AB2892__INCLUDED_)
#define AFX_BUTTONCOLOR_H__6B15BD45_1EB9_4D3E_8274_0587D1AB2892__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ButtonColor.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CButtonColor window
class CButtonColor : public CButton
{
// Construction
public:
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; //字体
CButtonColor();
// Attributes
public:
void SetText(CString str);
void SetFontColor(COLORREF color); //设置文本颜色
void SetBackColor(COLORREF color); //设置背景颜色
void SetTextFont(int FontHight,LPCTSTR FontName); //设置字体
void DrawButtonColor(CDC *pDC);
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CButtonColor)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
protected:
virtual void PreSubclassWindow();
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CButtonColor();
// Generated message map functions
protected:
//{{AFX_MSG(CButtonColor)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_BUTTONCOLOR_H__6B15BD45_1EB9_4D3E_8274_0587D1AB2892__INCLUDED_)
调用 方法。在Afx.h里面include文件
this->btFontSet.SetText("Hell,this is Supper Button");
this->btFontSet.SetTextFont(12,"Arial Black");
this->btFontSet.SetFontColor(RGB(0,0,0));
m_BTHand = AfxGetApp()->LoadCursor(IDC_Hand);
BOOL CMyButtonFontDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg-> message==WM_MOUSEMOVE)
{//鼠标移动消息
//获得当前鼠标位置
POINT pt=pMsg-> pt;
//转换为客户坐标系
ScreenToClient(&pt);
//获得当前位置的控件窗口指针
CWnd* pWnd=ChildWindowFromPoint(pt);
//获得该窗口的ID
UINT nCtrlID=pWnd-> GetDlgCtrlID();
switch(nCtrlID)
{//判断窗口
case BT_FontSet:
//显示帮助光标
SetCursor(m_BTHand);
break;
default:
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
相关文章推荐
- VC、MFC中设置控件的背景色、标题、字体颜色、字体要注意的地方[转]
- VC、MFC中设置控件的背景色、标题、字体颜色、字体要注意的地方
- MFC窗口各控件的颜色和字体的设置(转)
- MFC操作——设置静态文本 大小 字体格式 颜色
- MFC设置对话框、字体对话框、颜色对话框
- 设置Button的字体颜色状态选择器
- OnCtlColor函数:MFC设置静态文本框,编辑框等控件背景和字体颜色
- 通过选择器selector给TextView,Button设置字体颜色和背景颜色
- VC中CStatic设置文字、字体、颜色和OnCtlColor的使用
- MFC--设置静态文本框的文字的字体、大小和颜色
- MFC Static文字的字体、大小、颜色设置
- VC/MFC如何设置对话框背景颜色
- VC中控件字体与文本颜色的设置
- OnCtlColor函数:MFC设置静态文本框,编辑框等控件背景和字体颜色
- 安卓TextView,Button动态设置字体颜色选择器
- 设置button按钮背景色,及字体的颜色
- MFC修改Button背景颜色和字体颜色
- MFC窗口的颜色和字体的设置
- MFC窗口的颜色和字体的设置
- MFC Cbutton、Cstatic、Edit/控件修改字体及颜色