时隔1年半后,因工作需要重新写起了客户端。这么久没接触了,确实很生疏,一考虑到要自绘个tab控件需要有个关闭按钮,刚开始我的逻辑就是用公司现成的按钮类但发现现成的按钮类,用起来很费劲,因为分装好的按钮类提供了比较完整的各种功能和接口,要是想在原来的基础上修改,就需要搞清楚各个成员及接口的用法,这加大了很大的难度,比起从零开始写,或许还更耗时,相信很多人都会有类似的感受,于是我网上搜索和参考了别人的文章封装了本按钮。本按钮提供的功能非常简单,但是易用且可扩展性强,完全可以根据自己的需求做修改.
//使用例子
RECT rc = {0, 0, 20, 20};
m_btnClose.LoadBtnImg(_T("PNG"),IDB_PNG_TAB_CLOSE_NOR, IDB_PNG_TAB_CLOSE_HOT,IDB_PNG_TAB_CLOSE_HOT);
m_btnClose.Create(this, rc, L"",ID_BTN_MYTAB_CLOSE);
m_btnClose.SetToolTipText(_T("关闭"));
//头文件
#pragma once
// CLhsButton
#define MYWM_BTN_CLICK WM_USER+3001 //关闭按钮单击响应
//tab按钮的状态
enum ButtonState
{
BTN_STATE_NOR = 0,
BTN_STATE_DOWN = 1,
};
class CLhsButton : public CWnd
{
DECLARE_DYNAMIC(CLhsButton)
public:
CLhsButton();
virtual ~CLhsButton();
bool Create(CWnd* pParent,CRect rc,CString text,DWORD id = 0,DWORD style = WS_VISIBLE|WS_CHILD);
DECLARE_MESSAGE_MAP()
public:
protected:
CString szClassName;
bool m_isMouseHover; //鼠标是否悬浮
bool m_isMouseClicked; //鼠标是否单击
CString m_strShowText; //要显示的文字
Image* m_pImgNor; //正常时的图片
Image* m_pImgHot; //鼠标悬浮时的图片
Image* m_pImgDown; //单击按下时的图片
void PostClickEvent();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnMouseHover(UINT nFlags, CPoint point);
afx_msg void OnMouseLeave();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnPaint();
afx_msg void OnSize(UINT nType, int cx, int cy);
virtual BOOL PreTranslateMessage(MSG* pMsg);
public:
void SetTabState(ButtonState state){m_btnState = state; Invalidate();} //设置tab状态
ButtonState GetTabState(){return m_btnState;}
void SetToolTipText(CString spText, BOOL bActivate = TRUE);
void LoadBtnImg(LPCTSTR tTy