📄 btnst.h
字号:
///////////////////////////////////////////////////////////////////////////////
//类CButtonST:自定义扩展按纽类
//类CMemDC :执行一个内存设备上下文
// CBtnST.h : 头文件
///////////////////////////////////////////////////////////////////////////////////////
/*使用方法:
1.在要使用的类的头文件中定义CButtonST类成员变量#include "BtnSt.h"
private:
CButtonST m_btnZip256;
2.在父类的DoDataExchange消息函数中增加定义
(仅在按纽中使用两种图标时用这一步,其它类型不必要)
void 父类名::DoDataExchange(CDataExchange* pDX)
{ CDialog::DoDataExchange(pDX); //假若父类为CDialog类型
DDX_Control(pDX, IDC_ZIP256, m_btnZip256);
//参数:pDX,对话框上的按纽ID号,映射的CBtnST类的按纽(在非对话框中建立接纽不必要,要用Create)
}
3.在父类的成员初始化函数中,如对话框类的OnInitDialog函数
对非对话框如可在OnCreate()函数中用Create函数来动态建立
BOOL 父类名::OnInitDialog()
{ CDialog::OnInitDialog();
// 为对话框设置图标. 这在框架中是自动的不必设置(当应用程序主窗口不是对话框时)
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); //设置小图标
// 创建这个256色图标按纽,不要子类两次,因为已经被DoDataExchange作了
// m_btnZip256.SubclassDlgItem(IDC_ZIP256, this);
m_btnZip256.SetIcon(IDI_ZIPSMALL256, IDI_ZIP256); // 32x32 图标
参数:鼠标在按纽上时图标ID号,鼠标离开按纽上时图标ID号,图标X向大小,图标Y向大小
..........
}
*/
#ifndef _BTNST_H
#define _BTNST_H
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
//删除下面一行#define定义假若你不想CButtonST类高亮显示它自已
//当窗口是非活动时 (象Internet Explorer中的按纽一样)
#define ST_LIKEIE
//删除下面这一行假若你不想使用CMemDC类
#define ST_USE_MEMDC
/////////////////////////////////////////////////////////////////////////////
// CButtonST类
class CButtonST : public CButton
{
// 构造/析构函数
public:
CButtonST();
~CButtonST();
enum {ST_ALIGN_HORIZ, ST_ALIGN_VERT};
//按纽上文本位置:水平, 竖直
//属性
public:
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CButtonST)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
protected:
virtual void PreSubclassWindow();
//}}AFX_VIRTUAL
//执行
public:
BOOL SetBtnCursor(int nCursorId = -1);
void SetFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint = FALSE);
BOOL GetFlatFocus();
void SetDefaultActiveFgColor(BOOL bRepaint = FALSE);
void SetActiveFgColor(COLORREF crNew, BOOL bRepaint = FALSE);
const COLORREF GetActiveFgColor();
void SetDefaultActiveBgColor(BOOL bRepaint = FALSE);
void SetActiveBgColor(COLORREF crNew, BOOL bRepaint = FALSE);
const COLORREF GetActiveBgColor();
void SetDefaultInactiveFgColor(BOOL bRepaint = FALSE);
void SetInactiveFgColor(COLORREF crNew, BOOL bRepaint = FALSE);
const COLORREF GetInactiveFgColor();
void SetDefaultInactiveBgColor(BOOL bRepaint = FALSE);
void SetInactiveBgColor(COLORREF crNew, BOOL bRepaint = FALSE);
const COLORREF GetInactiveBgColor();
void SetShowText(BOOL bShow = TRUE);
BOOL GetShowText();
void SetAlign(int nAlign);
int GetAlign();
void SetFlat(BOOL bState = TRUE);
BOOL GetFlat();
void DrawBorder(BOOL bEnable = TRUE);
void SetIcon(int nIconInId, int nIconOutId = NULL, BYTE cx = 32, BYTE cy = 32);
static const short GetVersionI();
static const char* GetVersionC();
protected:
//{{AFX_MSG(CButtonST)
afx_msg void OnCaptureChanged(CWnd *pWnd);
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
void DrawTheIcon(CDC* pDC, CString* title, RECT* rcItem, CRect* captionRect, BOOL IsPressed, BOOL IsDisabled);
int m_nAlign;
BOOL m_bShowText;
BOOL m_bDrawBorder;
BOOL m_bIsFlat;
BOOL m_MouseOnButton;
BOOL m_bDrawFlatFocus;
HCURSOR m_hCursor;
HICON m_hIconIn;
HICON m_hIconOut;
BYTE m_cyIcon;
BYTE m_cxIcon;
COLORREF m_crInactiveBg;
COLORREF m_crInactiveFg;
COLORREF m_crActiveBg;
COLORREF m_crActiveFg;
};
#ifdef ST_USE_MEMDC
///////////////////////////////////////////////////////////////////////
// CMemDC 类- 内存DC
//这个类执行一个内存设备上下文
////////////////////////////////////////////////////////// ////////////////
class CMemDC : public CDC
{
public:
//构造内存 DC
CMemDC(CDC* pDC) : CDC()
{
ASSERT(pDC != NULL);
m_pDC = pDC;
m_pOldBitmap = NULL;
m_bMemDC = !pDC->IsPrinting();
if (m_bMemDC) // 创建一个内存DC
{
pDC->GetClipBox(&m_rect);
CreateCompatibleDC(pDC);
m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
m_pOldBitmap = SelectObject(&m_bitmap);
SetWindowOrg(m_rect.left, m_rect.top);
}
else //为打印制造一个拷贝当前DC的适当部份
{
m_bPrinting = pDC->m_bPrinting;
m_hDC = pDC->m_hDC;
m_hAttribDC = pDC->m_hAttribDC;
}
}
//析构这个拷贝并回原当前内存DC到拷贝前的原始DC
~CMemDC()
{
if (m_bMemDC)
{
// 拷贝画面以外的位图到屏幕上
m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
this, m_rect.left, m_rect.top, SRCCOPY);
//交换后面的原始位图.
SelectObject(m_pOldBitmap);
} else {
// 我们需要作的是使用一个不合规定的值代替这个DC,
// 它保持我们从意外事件删除这个句柄使用CDC被关联
// 通过的构造that was passed to the constructor.
m_hDC = m_hAttribDC = NULL;
}
}
// 允许象指针一样使用
CMemDC* operator->() {return this;}
//允许象指针一样使用
operator CMemDC*() {return this;}
private:
CBitmap m_bitmap; // 画面位图对象
CBitmap* m_pOldBitmap; // 最初在CMemDC中建立的位图对象
CDC* m_pDC; // 在构造函数中保存CDC
CRect m_rect; // 画的矩形区域.
BOOL m_bMemDC; //CDC 是否是一个内存DC.
};
#endif
/////////////////////////////////////////////////////////////////////////////
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -