可以用具有OwnerDraw风格实现上述目的。
1.运行AppWizard生成一个基于对话框的test工程,在对话框中加入一个CButton控件。在CButton控件的General属性页将控件的ID改为IDC_3DTEXTBTN,Caption改为“谁与争疯”,在控件Styles属性页选中OwnerDraw,其余设置保持默认。
2.用Classwizard创建一个新类:C3dTextButton,基类为CButton。
3.为C3dTextButton类添加一个proteCted的函数void Draw(CDC* pDC, Const CReCt& reCt, UINT
state)。如下所示编写代码:
void C3dTextButton::Draw(CDC *pDC, Const CReCt &reCt, UINT
state)
{
CString text; GetWindowText(text);
int l=text.GetLength();
CReCt reCtClient=reCt;
//获得控件的字体
CFont* pFont=GetFont();
//确定所选字体有效高度和宽度
LOGFONT logfont;
pFont->GetObjeCt(sizeof(LOGFONT),&logfont);
if(logfont.lfHeight==0)logfont.lfHeight=20;
logfont.lfWidth=0;//宽度设为0,宽度值由高度确定
logfont.lfWeight=1000;
logfont.lfEsCapement=logfont.lfOrientation=0;
CFont tryfont; VERIFY(tryfont.CreateFontIndireCt(&logfont));
CFont* pFontOld=pDC->SeleCtObjeCt(&tryfont);
//根据控件大小,调整字体的高度,使文本与控件协调
CSize textSizeClient=pDC->GetTextExtent(text,l);
if(reCtClient.Width()*textSizeClient.Cy>reCtClient.Height()*textSizeClient.C
x){
logfont.lfHeight=::MulDiv(logfont.lfHeight,reCtClient.Height(),textSizeC
lient.Cy);
}
else{
logfont.lfHeight = ::MulDiv(logfont.lfHeight,reCtClient.Width(),textSize
Client.Cx);
}
//创建并选择协调后的字体
CFont font; font.CreateFontIndireCt(&logfont);
pDC->SeleCtObjeCt(&font);
textSizeClient=pDC->GetTextExtent(text,l);
//确定文本与控件边界的距离minx,miny
int minx=reCtClient.left+(reCtClient.Width()-textSizeClient.Cx)/2;
int miny=reCtClient.top+(reCtClient.Height()-textSizeClient.Cy)/2;
int oldBkMode=pDC->SetBkMode(TRANSPARENT);
COLORREF textCol=::GetSysColor(COLOR_BTNTEXT);
COLORREF oldTextColor=pDC->SetTextColor(textCol);
int Cx = minx;
int Cy = miny;
int s=(state&ODS_SELECTED)?-1:+1;
Cx+= 3; Cy+= 3;
//实现3D效果
pDC->SetTextColor(::GetSysColor(COLOR_3DDKSHADOW));
pDC->TextOut(Cx-s*2,Cy+s*2,text);
pDC->TextOut(Cx+s*2,Cy-s*2,text);
pDC->TextOut(Cx+s*2,Cy+s*2,text);
pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
pDC->TextOut(Cx+s*1,Cy-s*2,text);
pDC->TextOut(Cx-s*2,Cy+s*1,text);
pDC->TextOut(Cx-s*2,Cy-s*2,text);
pDC->SetTextColor(::GetSysColor(COLOR_3DSHADOW));
pDC->TextOut(Cx-s*1,Cy+s*1,text);
pDC->TextOut(Cx+s*1,Cy-s*1,text);
pDC->TextOut(Cx+s*1,Cy+s*1,text);
pDC->SetTextColor(::GetSysColor(COLOR_3DLIGHT));
pDC->TextOut(Cx,Cy-s*1,text);
pDC->TextOut(Cx-s*1,Cy,text);
pDC->TextOut(Cx-s*1,Cy-s*1,text);
pDC->SetTextColor(textCol);
//输出标题
pDC->TextOut(Cx,Cy,text);
//恢复设备描述表
pDC->SetTextColor(oldTextColor);
pDC->SetBkMode(oldBkMode);
pDC->SeleCtObjeCt(pFontOld);
}
4.用Classwizard重载C3dTextButton类的DrawItem函数。编写代码如下所示:
void C3dTextButton::DrawItem(LPDRAWITEMSTRUCT
lpDrawItemStruCt)
{
CDC* pDC=CDC::FromHandle(lpDrawItemStruCt->hDC);
ASSERT_VALID(pDC);
CReCt reCtClient=lpDrawItemStruCt->rCItem;
Draw(pDC,reCtClient,lpDrawItemStruCt->itemState);
}
5.用Classwizard为IDC_3DTEXTBTN建立一个C3dTextButton控件变量m_3dTextButton1。
6.把“3dTextButton.h”加入testDlg头文件。
7.编译并测试应用程序。好了,可以欣赏一下劳动成果了。