| 一、 本文介绍一个CButton的派生类CLinkButton,用此派生类制作的按钮具备以下特点: 1、按钮的外观类似静态控件类CStatic 产生的对象。(参见图一) (图一) 2、当鼠标的光标移到按钮上,但并未按下时,光标改变形状,字体改变形状;按钮类似应用在工具条和菜单上的扁平钮效果。(参见图二) (图二) 3、当按钮按下的情形:(参见图三) (图三) 二、下面具体描述这种按钮的实现方法和步骤: 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 * pFont = GetFont(); ASSERT(pFont); LOGFONT lf; pFont->GetLogFont(&lf); lf.lfUnderline = TRUE; fUnderline.CreateFontIndirect(&lf); } pOldFont = pDC->SelectObject(&fUnderline); } else pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT)); pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); if (pOldFont) pDC->SelectObject(pOldFont); } } 2.定制的消息处理函数 void OnMouseMove(UINT nFlags, CPoint point) { //配置一个定时器 SetTimer(1,10,NULL); // ... } 当鼠标光标移到按钮上时,执行此函数,定时器将发送一个 WM_TIMER消息到消息队列。 由OnTimer(UINT nIDEvent)函数处理这个消息。 void OnTimer(UINT nIDEvent) { //处理WM_TIMER消息 static bool pPainted = false; POINT pt; GetCursorPos(&pt); CRect rect; GetWindowRect (rect);
文章整理:西部数码--专业提供域名注册、虚拟主机服务 相关文章
热点关注
IDC资讯
虚拟主机
域名注册
托管租用
vps主机
智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源 网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧 行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒 网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它 服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护 软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer 网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash 程序设计 Java技术 C/C++ VB delphi 网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术 操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD |
制作风格独特的按钮—用VC6扩展CButton类
来源:互联网
作者:west263.com
时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

(图一)
(图二)
(图三) 

