当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>Visual C++教程

制作风格独特的按钮—用VC6扩展CButton类

    一、 本文介绍一个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 * 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页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接