网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
制作风格独特的按钮—用VC6扩展CButton类
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式

一、 本文介绍一个CButton的派生类CLinkButton,用此派生类制作的按钮具有以下特点:


1、按钮的外观类似静态控件类CStatic 产生的对象。

2、当鼠标的光标移到按钮上,但并未按下时,光标改变形状,字体改变形状;按钮类似应用在工具条和菜单上的扁平钮效果

二、下面具体描述这种按钮的实现方法和步骤:


1. 在VC6的IDE环境中,生成一个基于对话框的PROJECT。


2. 将对话框资源中按钮的属性页打开,在“Style”标签页中选取按钮的“Owner Draw”(自绘)属性。


3. 将光标引入到应用程序的资源中。


4. 利用CLASSWIZARD,用CButton为基类,派生一个新类:CLinkButton。


5. 在派生类中重载基类CButton的虚函数:


virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)


之所以要重载这个函数是因为选择了按钮的 “Owner Draw”属性后,当按钮的可视行为发生变化时,应用程序的框架要调用这个函数来重新绘制按钮。


6. 定制以下的消息处理:


afx_msg void OnMouseMove(UINT nFlags, CPoint point);


afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);


afx_msg void OnTimer(UINT nIDEvent);


afx_msg void OnLButtonUp(UINT nFlags, CPoint point);


afx_msg void OnLButtonDown(UINT nFlags, CPoint point);


afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);


afx_msg BOOL OnEraseBkgnd(CDC* pDC);


7. 声明类成员变量定义:


//定义字体变量


CFont fUnderline;


//定义光标变量


HCURSOR hHand;


//决定按钮是否按下


bool bLBtnDown;


//决定鼠标是否在按钮上


bool bHighlight;


二、 派生类CLinkButton 的具体实现:


1.重载函数  DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)。


void CLinkButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)


{


// 获取一个CDC指针


CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);


//定义按钮区域并初始化


CRect rect(lpDrawItemStruct->rcItem);


//设置背景模式


COLORREF oc = pDC->GetTextColor();


int iObk = pDC->SetBkMode(TRANSPARENT);


//初始化按钮状态


UINT state = lpDrawItemStruct->itemState;


CFont * pOldFont = NULL;


int iYOffset = 0, iXOffset = 0;


CString strText;


GetWindowText(strText);


rect.top += iYOffset;


rect.left += iXOffset;


if (state & ODS_DISABLED)


{


//按钮置灰状态(DISABLED)


CBrush grayBrush;


grayBrush.CreateSolidBrush (GetSysColor (COLOR_GRAYTEXT));


CSize sz = pDC->GetTextExtent(strText);


int x = rect.left + (rect.Width() - sz.cx)/2;


int y = rect.top + (rect.Height() - sz.cy)/2;


rect.top += 2;


rect.left += 2;


pDC->SetTextColor(GetSysColor(COLOR_3DHIGHLIGHT));


pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);


rect.top -= 2;


rect.left -= 2;


pDC->SetTextColor(GetSysColor(COLOR_GRAYTEXT));


pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);


}


else


{


if (bHighlight)//光标在按钮上


{


if (state & ODS_SELECTED)


{


//按下按钮


pDC->Draw3dRect(rect,GetSysColor(COLOR_3DSHADOW),


                GetSysColor(COLOR_3DHILIGHT));


}


else


{//未按下按钮


           pDC->Draw3dRect(rect,GetSysColor(COLOR_3DHILIGHT),


                GetSysColor(COLOR_3DSHADOW));


}


//字体颜色


pDC->SetTextColor(RGB(0,0,255));




//加下画线(也可以用其他字体)


if (fUnderline.GetSafeHandle() == NULL)


{


CFont

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号