怎样改变按钮CButton按钮的颜色和字体啊?

ymdynhz 2008-06-13 12:24:19
谢谢大家啦
...全文
673 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
maomaoxiong 2008-06-13
  • 打赏
  • 举报
回复
重载CButtong类,响应DrawItem,转个XP风格的按钮类代码:
void CXPButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
//´ÓlpDrawItemStruct»ñÈ¡¿Ø¼þµÄÏà¹ØÐÅÏ¢
CRect rect = lpDrawItemStruct->rcItem;
CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
int nSaveDC=pDC->SaveDC();
UINT state = lpDrawItemStruct->itemState;
POINT pt ;
TCHAR strText[MAX_PATH + 1];
::GetWindowText(m_hWnd, strText, MAX_PATH);

//»­°´Å¥µÄÍâ±ß¿ò£¬ËüÊÇÒ»¸ö°ë¾¶Îª5µÄÔ²½Ç¾ØÐÎ
pt.x = 5;
pt.y = 5;
CPen* hOldPen = pDC->SelectObject(&m_BoundryPen);
pDC->RoundRect(&rect, pt);

//»ñÈ¡°´Å¥µÄ״̬
if (state & ODS_FOCUS)
{
m_bFocus = TRUE;
m_bSelected = TRUE;
}
else
{
m_bFocus = FALSE;
m_bSelected = FALSE;
}


if (state & ODS_SELECTED || state & ODS_DEFAULT)
{
m_bFocus = TRUE;
}


pDC->SelectObject(hOldPen);

rect.DeflateRect(CSize(GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE)));

//¸ù¾Ý°´Å¥µÄ״̬Ìî³ä°´Å¥µÄµ×É«
CBrush* pOldBrush;
if (m_bOver)
{
pOldBrush = pDC->SelectObject(&m_FillActive);
DoGradientFill(pDC, &rect);
}
else
{
pOldBrush = pDC->SelectObject(&m_FillInactive);
DoGradientFill(pDC, &rect);
}

//¸ù¾Ý°´Å¥µÄ״̬»æÖÆÄڱ߿ò
if (m_bOver || m_bSelected)
DrawInsideBorder(pDC, &rect);

pDC->SelectObject(pOldBrush);

//ÏÔʾ°´Å¥µÄÎı¾
if (strText!=NULL)
{
CFont* hFont = GetFont();
CFont* hOldFont = pDC->SelectObject(hFont);
CSize szExtent = pDC->GetTextExtent(strText, lstrlen(strText));
CPoint pt( rect.CenterPoint().x - szExtent.cx / 2, rect.CenterPoint().y - szExtent.cy / 2);
if (state & ODS_SELECTED)
pt.Offset(1, 1);
int nMode = pDC->SetBkMode(TRANSPARENT);
if (state & ODS_DISABLED)
pDC->DrawState(pt, szExtent, strText, DSS_DISABLED, TRUE, 0, (HBRUSH)NULL);
else
pDC->DrawState(pt, szExtent, strText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL);
pDC->SelectObject(hOldFont);
pDC->SetBkMode(nMode);
}


pDC->RestoreDC(nSaveDC);
}
fishion 2008-06-13
  • 打赏
  • 举报
回复
颜色 CButton *pTxt=(CButton*)GetDlgItem(IDOK);
CDC* pDC=pTxt->GetDC();
CRect rc;
pTxt->GetClientRect(&rc);

CBrush brush;
brush.CreateSolidBrush(RGB(0,250,250));
pDC->FillRect(&rc,&brush);

pDC->SetBkColor(RGB(120,120,250));
pDC->SetTextColor(RGB(0,120,250));

字体
CFont m_newbutton;
m_newbutton.CreateFont(30,10,0,10,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,_T ("Arial"));
CWnd *pWnd=GetDlgItem(IDC_BUTTON);
pWnd->SetFont(&m_newbutton);


CreateFont的定义:
CFont::CreateFont

BOOL CreateFont(
int nHeight,
int nWidth,
int nEscapenment,
intnOrientation,
int nWeight,
BYTE bItalic,
BYTE bUnderline,
BYTE cStrikeOut,
BYTE nCharset,
BYTE nOutPrecision,
BYTE nClipPrecision,
BYTE nQuality,
BYTE nPitchAndFamily,
LPCTSTR lpszFacename
);

返回值:如果成功,则返回非零值,否则为0。

参数: nHeight 以逻辑单位方式指定字体的高度,字体高度可为以下值之一: · 大于0,此时高度被转化为设备单位,与可用字体的网格高度相比较。
· 等于0,此时使用合理的缺省大小。
· 小于0,此时高度被转化为设备单位,而绝对值与可用字体的字符高度相比较。
nHeight绝对值在转化后不可超过16,384设备单位。在所有的高度对比中,如果字体超过所要求的值,则字体映像器中大字体不会超过所需大小,小字体也不会超过。
nWidth 指定字体中字符平均宽度(用逻辑单位)。如果为0,设备方向比率与可用字体的数字方向比率相比较,找一个最近的匹配,它由值的差的绝对值决定。
nEscapement 指定偏离垂线与x轴在显示面上的夹角(用0.1度单位)。偏离垂线时从一行中开始一个字符到最后一个字符的线,此角从x轴逆时针方向度量。
nOrientation 指定字符基线和x轴之间的夹角(用0.1度单位)。此度数在座标轴中由x轴逆时针方向度量时坐标系中y轴向下,顺时针方向从x轴旋转时,y轴向上。
nWeight 指定字体磅数(用每1000点中墨点像素数计)。尽管nWeight可为0到1000中的任意整数值,常用值和常数如下: 常数 值
FW_DONTCARE 0
FW_THIN 100
FW_EXTRALIGHT 200
FW_ULTRALIGHT 200
FW_LIGHT 300
FW_NORMAL 400
FW_REGULAR 400
FW_MEDIUM 500
FW_SEMIBOLD 600
FW_DEMIBOLD 600
FW_BOLD 700
FW_EXTRABOLD 800
FW_ULTRABOLD 800
FW_BLACK 900
FW_HEAVY 900
以上各值是大约数,实际外观依赖字体大小,有的字体仅有FW_NORMAL,FW_REGULAR,FW_BOLD磅数。如果FW_DONTCARE被指定,则使用缺省磅数。
bItalic 指定字体是否为斜体。
bUnderline 指定字体是否带下划线。
bStrikeOut 指定是否是字体字符突出。如果设置为非零,则突出。
nCharSet 指定字体的字符集,以下是预定义的常数和值: 常数 值
ANSI_CHARSET 0
DEFAULT_CHARSET 1
SYMBOL_CHARSET 2
SHIFTJIS_CHARSET 128
OEM_CHARSET 255
OEM字符集依赖于系统。
具有其它字符集的字体可能存在于系统之中。一个使用未知字符集字体的应用不能翻译或解释一个以此字符集着色的字符串,相反,应将字符串直接输入到设备驱动。
字体映射器不使用DEFAULT_CHARSET值,一个应用可以使用此值让字体名和大小完全描述逻辑字体。如果指定的名字不存在,为避免不可预料的结果,应用应谨慎地使用 DEFAULT_CHARSET。
nOutPrecision 指定所需的输出精度。输出精度定义输出与需要的字体高度、宽度,字符方向、走格、间距之间的接近程度,可以为以下值之一: OUT_CHARACTER_PRECIS OUT_STRING_PRECIS
OUT_DEFAULT_PRECIS OUT_STROKE_PRECIS
OUT_DEVICE_PRECIS OUT_TT_PRECIS
OUT_RASTER_PRECIS
应用在系统包含多个给定名字的字体时,可用OUT_DEVICE_PRECIS,OUT_RASTER_PRECIS和OUT_TT_PRECIS值控制一个字体映射器如何选择一种字体。例如,如果一个系统包含一个名叫Symbol的字体,以光栅和TrueType形式存在,指定OUT_TT_PRECIS使字体映射器选择TrueType类型(指定OUT_TT_PRECIS强制字体映射器选择TrueType字体(当指定字体名与一个设备或光栅字体相匹配),即使没有同名的TrueType字体。
nClipPrecision 指定所需的剪贴精度。剪贴精度定义了如何剪贴部分超过剪贴范围的字符,可为以下值之一: CLIP_CHARACTER_PRECIS CLIP_MASK
CLIP_DEFAULT_PRECIS CLIP_STROKE_PRECIS
CLIP_ENCAPSULATE CLIP_TT_ALWAYS
CLIP_LH_ANGLES
要使用插入的只读字体,应用必须指定CLIP_ENCAPSULATE。要建立设备旋转、TrueType和矢量字库,应用可以用OR操作符将CLIP_LH_ANGLES值与其它nClipPrecision值组合。如果CLIP_LH_ANGLES位被设置,所有字体的旋转都依赖于坐标系的定位是左手方向还是右手方向(要了解有关坐标轴定位的更多信息,请参阅nOrientation参数的描述)。如果CLIP_LH_ANGLES未被设置,设置字体常逆时针方向旋转,但其它字体的旋转依赖于坐标系的旋转定位。
nQuality 指示字体的输出质量,定义了GDI必须使逻辑字体特性和物理字体特性相匹配的程度。可为以下值之一: DEFAULT_QUALITY 字体的外观无关紧要。
DRAFT_QUALITY 当PROOF_QUALITY使用时,字体的外观不太重要。对GDI光栅字体来说,允许缩放。黑体、斜体、下划线、突出字体和综合处理在需要时可用。
PROOF_QUALITY 字体的字符质量比精确的逻辑字体特性的匹配更重要。对GDI光栅字体,缩放无效,大小最接近的字体被选用。黑体、斜体、下划线、突出和综合处理在需要时可用。

nPitchAndFamily 指定字体的间距和家族。两个低位指定字体的间距,可为以下值之一:
DEFAULT_PITCH、VARIABLE_PITCH、FIXED_PITCH
应用可以将T\MPF_TRUETYPE加到nPitchAndFamily参数中来选择一个TrueType字体。高四位指定字体家族,可为以下值之一: · FF_DECORATIVE 新奇字体,如以前英格兰的字体。
· FF_DONTCARE 不在意或不知道。
· FF_MODERN 笔型宽度不变的字体,有或无衬线。固定斜度的字体常是现代风格的,如Pica,Elite和Courier New。
· FF_ROMAN 笔划宽度可变(接比例调整空间)及有衬线字体。如Times New Roman和Century Schoolbook。
· FF_SCRIPT 与手写体相似的字体,如Script和Cursive。
· FF_SWISS 笔划宽度可变(接比例调整空间)及不带有衬线字体,如MS Sans Serif。
一个应用可用布尔操作OR指定一个nPithAndFamily值以组合一个斜体和一个家族常数。
字体家族用普通方式描述了字体的外观,它们在所需铅字体无效时用于定义指定的字体。
lpszFacenameCString 或指向一个以空终止字符串的指针,字符串指定字体字样的名字。此字符串的长度不能长于30个字符,WindowsEnumFontFamilies函数可用于枚举所有当前可用字体。如果为NULL,则GDI使用一个不依赖设备的字体。
Torch009 2008-06-13
  • 打赏
  • 举报
回复
重载DrawItem,或用别人写好的类。stbutton
菜牛 2008-06-13
  • 打赏
  • 举报
回复
重载CButtong类,响应DrawItem。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧