用VC6扩展CButton类制作风格独特的按钮_第1页
用VC6扩展CButton类制作风格独特的按钮_第2页
用VC6扩展CButton类制作风格独特的按钮_第3页
用VC6扩展CButton类制作风格独特的按钮_第4页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用 VC6 扩展 CButton 类制作风格独特的按钮一、 本文介绍一个CButton 的派生类CLinkButton ,用此派生类制作的按钮具有以下特点:、按钮的外观类似静态控件类CStatic 产生的对象。(参见图一)(图一)、当鼠标的光标移到按钮上,但并未按下时,光标改变形状,字体改变形状;按钮类似应用在工具条和菜单上的扁平钮效果。 (参见图二)(图二)、当按钮按下的情形:(参见图三)(图三)二、下面具体描述这种按钮的实现方法和步骤:1.在 VC6 的 IDE 环境中,生成一个基于对话框的PROJECT 。2. 将对话框资源中按钮的属性页打开,在“ Style”标签页中选取按钮的“ Ow

2、ner Draw ” (自绘)属性。3. 将光标引入到应用程序的资源中。4. 利用 CLASSWIZARD ,用 CButton 为基类,派生一个新类: CLinkButton 。5. 在派生类中重载基类 CButton 的虚函数:virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)之所以要重载这个函数是因为选择了按钮的“ OwnerDraw ”属性后,当按钮的可视行为发生变化时,应用程序的框架要调用这个函数来重新绘制按钮。6. 定制以下的消息处理:afx_msg void OnMouseMove(UINT nFlags, CPoin

3、t 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*

4、 pDC);7. 声明类成员变量定义:定义字体变量CFont fUnderline;定义光标变量HCURSOR hHand;决定按钮是否按下bool bLBtnDown;决定鼠标是否在按钮上bool bHighlight;二、 派生类 CLinkButton的具体实现:重载函数DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)。void CLinkButton:DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)/ 获取一个 CDC 指针CDC* pDC = CDC:FromHandle(lpDrawItemStruct-&

5、gt;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+

6、= 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+=

7、 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);elseif

8、(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.Get

9、SafeHandle() = 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_C

10、ENTER | 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 pPainte

11、d = false;POINT pt;GetCursorPos(&pt);CRect rect;GetWindowRect (rect);if (bLBtnDown)KillTimer (1);if (pPainted) InvalidateRect (NULL);pPainted = FALSE;return;if (!rect.PtInRect (pt)bHighlight = false;KillTimer (1);if (pPainted)InvalidateRect(NULL);pPainted = false;return;elsebHighlight = true;if

12、(!pPainted)pPainted = true;InvalidateRect(NULL);/CButton:OnTimer(nIDEvent);BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)/当鼠标光标移到按钮上时,改变光标的形象if (bHighlight):SetCursor(hHand);return true;/int OnCreate(LPCREATESTRUCT lpCreateStruct)CFont * pFont = GetFont();ASSERT(pFont);LOGFONT lf;pFont-&g

13、t;GetLogFont(&lf);lf.lfUnderline = TRUE;fUnderline.CreateFontIndirect(&lf);这个函数由框架在显示出按钮之前自动调用,我在这里初始化在按钮上显示的字体。void OnLButtonUp(UINT nFlags, CPoint point)bLBtnDown = false;if (bHighlight)bHighlight = false;InvalidateRect(NULL);当按下按钮又放开时调用这个函数。void OnLButtonDown(UINT nFlags, CPoint point)bLBtnDown = true;当按下按钮时调用这个函数。BOOL OnEraseBkgnd(CDC* pDC)COLORREF cr = GetSysColor(COLOR_3DFACE);int r = GetRValue(cr);int g = GetGValue(cr);int b = GetBValue(cr);if (r > 1) r -= 2;if (g > 1) g -= 2;if (r < 3 &&a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论