📄 buttonst.cpp
字号:
// ButtonST.cpp : implementation file
//
#include "stdafx.h"
//#include "cnoseeyestation.h"
#include "ButtonST.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CButtonST
CButtonST::CButtonST()
{
m_MouseOnButton=FALSE;
m_hIconIn=NULL;
m_hIconOut=NULL;
m_cxIcon=0;
m_cyIcon=0;
m_bIsFlat=TRUE;
m_bDrawBorder=TRUE;
m_nAlign=4/*ST_ALIGN_VERT*/;
m_bShowText=TRUE;
m_bDrawFlatFocus=FALSE;
m_IsDefault=FALSE;
// bIsDisabled=FALSE;//注意其用法
m_ToolTip.m_hWnd=NULL;
m_bDrawTransparent=FALSE;
// m_pbmpOldBk=NULL;
m_bIsDefault=FALSE;
}
CButtonST::~CButtonST()
{
// if(m_dcBK.m_hDC!=NULL && m_pbmpOldBk!=NULL)
// m_dcBK.SelectObject(m_pbmpOldBk);
if(m_hIconIn!=NULL) ::DeleteObject(m_hIconIn);
if(m_hIconOut!=NULL) ::DeleteObject(m_hIconOut);
}
BEGIN_MESSAGE_MAP(CButtonST, CButton)
//{{AFX_MSG_MAP(CButtonST)
ON_WM_CAPTURECHANGED()
ON_WM_KILLFOCUS()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CButtonST message handlers
void CButtonST::ActivateTooltip(BOOL bEnable)
{
if(m_ToolTip.GetToolCount()==0)
return;
m_ToolTip.Activate(bEnable);
}
void CButtonST::SetIcon(UINT nIconInId,UINT nIconOutId )
{
//HINSTANCE hInstResourse=AfxFindResourceHandle(MAKEINTRESOURCE(nIconInId),RT_GROUP_ICON);
//m_hIconIn=(HICON)::LoadImage(hInstResourse,MAKEINTRESOURCE(nIconInId),IMAGE_ICON,0,0,0);
//m_hIconOut=(nIconOutId==NULL)?m_hIconIn:(HICON)::LoadImage(hInstResourse,MAKEINTRESOURCE(nIconOutId),IMAGE_ICON,0,0,0);
m_hIconIn=(HICON)::LoadImage(
AfxGetResourceHandle(),
MAKEINTRESOURCE(nIconInId),
IMAGE_ICON,
0,0,
LR_CREATEDIBSECTION|LR_LOADMAP3DCOLORS);
if(nIconOutId==NULL)
m_hIconOut=m_hIconIn;
else
m_hIconOut=(HICON)::LoadImage(
AfxGetResourceHandle(),
MAKEINTRESOURCE(nIconOutId),
IMAGE_ICON,
0,0,
LR_CREATEDIBSECTION|LR_LOADMAP3DCOLORS);
ICONINFO ii;
ZeroMemory(&ii,sizeof(ICONINFO));
::GetIconInfo(m_hIconOut,&ii);
m_cxIcon=(BYTE)(ii.xHotspot*2);
m_cyIcon=(BYTE)(ii.yHotspot*2);
}
void CButtonST::SetFlat( BOOL bState)
{
m_bIsFlat=bState;
Invalidate();
}
BOOL CButtonST::GetFlat()
{
return m_bIsFlat;
}
void CButtonST::SetAlign(int nAlign)
{
/* switch(nAlign)
{
case ST_ALIGN_HORIZ:
m_nAlign=ST_ALIGN_HORIZ;
case ST_ALIGN_VERT:
m_nAlign=ST_ALIGN_VERT;
break;
}*/
m_nAlign=nAlign;
Invalidate();
}
int CButtonST::GetAlign()
{
return m_nAlign;
}
void CButtonST::DrawBorder(BOOL bEnable)
{
m_bDrawBorder=bEnable;
}
void CButtonST::SetShowText(BOOL bShow)
{
m_bShowText=bShow;
Invalidate();
}
BOOL CButtonST::GetShowText()
{
return m_bShowText;
}
BOOL CButtonST::GetDefault()
{
return m_bIsDefault;
}
void CButtonST::SetInactiveBgColor(COLORREF crNew,BOOL bRepaint)
{
m_crInactiveBg=crNew;
if(bRepaint)
Invalidate();
}
void CButtonST::SetDefaultInactiveBgColor(BOOL bRepaint)
{
m_crInactiveBg=::GetSysColor(COLOR_BTNFACE);
if(bRepaint==TRUE) Invalidate();
}
const COLORREF CButtonST::GetInactiveBgColor()
{
return m_crInactiveBg;
}
void CButtonST::SetDefaultActiveBgColor(BOOL bRepaint)
{
m_crActiveBg=::GetSysColor(COLOR_BTNFACE);
if(bRepaint) Invalidate();
}
void CButtonST::SetActiveBgColor(COLORREF crNew,BOOL bRepaint)
{
m_crActiveBg=crNew;
if(bRepaint==TRUE)
Invalidate();
}
const COLORREF CButtonST::GetActiveBgColor()
{
return m_crActiveBg;
}
void CButtonST::DrawTheIcon(CDC *pDC,CString *title,RECT *rcItem,CRect *captionRect,BOOL IsPressed,BOOL IsDisabled)
{
CRect * iconRect=(CRect *)rcItem,textRect;
textRect=(CRect)captionRect;
switch(m_nAlign)
{
case ST_ALIGN_HORIZ:
if(title->IsEmpty())
{
iconRect->left+=((iconRect->Width()-m_cxIcon)/2);
}
else
{
iconRect->left+=3;
captionRect->left+=m_cxIcon+3;
//iconRect
}
iconRect->top+=((iconRect->Height()-m_cyIcon)/2);
break;
case ST_ALIGN_VERT:
iconRect->left+=((iconRect->Width()-m_cxIcon)/2);
textRect.left+=iconRect->left;
if(title->IsEmpty())
iconRect->top+=((iconRect->Height()-m_cyIcon)/2);
else
{
textRect.top+=m_cyIcon;
captionRect->top+=m_cyIcon;
}
break;
// ResizeRect((CRect)iconRect);
CString str;
GetWindowText(str);
if(IsPressed) iconRect->OffsetRect(1,1);
::DrawIconEx(HDC(*pDC),iconRect->left,iconRect->top,m_hIconIn,m_cxIcon,m_cyIcon,0,0,DI_NORMAL);
pDC->DrawText(str,&textRect,DT_SINGLELINE|DT_CALCRECT);
pDC->DrawState(iconRect->TopLeft(),iconRect->Size(),(m_MouseOnButton==TRUE || IsPressed) ? m_hIconIn:m_hIconOut,
(IsDisabled ? DSS_DISABLED: DSS_NORMAL),(CBrush *)NULL);
}
}
void CButtonST::SetDefaultActiveFgColor(BOOL bRepaint)
{
m_crActiveFg=::GetSysColor(COLOR_BTNTEXT);
if(bRepaint==TRUE) Invalidate();
}
void CButtonST::SetActiveFgColor(COLORREF crNEW,BOOL bRepaint)
{
m_crActiveFg=crNEW;
if(bRepaint==TRUE)
Invalidate();
}
const COLORREF CButtonST::GetActiveFgColor()
{
return m_crActiveFg;
}
void CButtonST::SetDefaultInactiveFgColor(BOOL bRepaint)
{
m_crInactiveFg=::GetSysColor(COLOR_BTNTEXT);
if(bRepaint==TRUE) Invalidate();
}
void CButtonST::SetInactiveFgColor(COLORREF crNew,BOOL bRepaint)
{
m_crInactiveFg=crNew;
if(bRepaint==TRUE) Invalidate();
}
const COLORREF CButtonST::GetInactiveFgColor()
{
return m_crInactiveFg;
}
void CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
CPen *pOldPen=NULL/*(PS_SOLID,0,GetSysColor(COLOR_BTNHILIGHT))*/;
//pOldPen->CreateStockObject(
BOOL bIsPressed=(lpDrawItemStruct->itemState & ODS_SELECTED);
BOOL bIsFocused=(lpDrawItemStruct->itemState & ODS_FOCUS);
BOOL bIsDisabled=(lpDrawItemStruct->itemState & ODS_DISABLED);
CRect itemRect=lpDrawItemStruct->rcItem;
if(m_bIsFlat==FALSE)
{
if(bIsFocused || (GetDefault()==TRUE))
{
CBrush br(RGB(0,0,0));
pDC->FrameRect(&itemRect,&br);
itemRect.DeflateRect(1,1);
}
}
COLORREF bgColor;
if((m_MouseOnButton==TRUE)||(bIsPressed))
{
bgColor=GetActiveBgColor();
}
else
bgColor=GetInactiveBgColor();
CBrush br(bgColor);
pDC->FillRect(&itemRect,&br);
if(bIsPressed)
{
if(m_bIsFlat)
{
if(m_bDrawBorder)
{//深灰色线,画按钮的左上部分
CPen penBtnHiLight(PS_SOLID,0,GetSysColor(COLOR_BTNHILIGHT));
CPen penBtnShadow(PS_SOLID,0,GetSysColor(COLOR_BTNSHADOW));
pDC->SelectObject(&penBtnShadow);
pDC->MoveTo(itemRect.left,itemRect.bottom-1);
pDC->LineTo(itemRect.left,itemRect.top);
pDC->LineTo(itemRect.right,itemRect.top);
//白色线,画按钮的右下部分
pDC->SelectObject(&penBtnHiLight);
pDC->MoveTo(itemRect.left,itemRect.bottom-1);
pDC->LineTo(itemRect.right-1,itemRect.bottom-1);
pDC->LineTo(itemRect.right-1,itemRect.top-1);
pOldPen=pDC->SelectObject(&penBtnHiLight);
pDC->SelectObject(pOldPen);
}
}
else
{
CBrush brBtnShadow(GetSysColor(COLOR_BTNSHADOW));
pDC->FrameRect(&itemRect,&brBtnShadow);
}
}
else //绘制未按下的按钮
{
CPen penBtnHiLight(PS_SOLID,0,GetSysColor(COLOR_BTNHILIGHT));//白色
CPen pen3DLight(PS_SOLID,0,GetSysColor(COLOR_3DLIGHT));//浅灰色
CPen penBtnShadow(PS_SOLID,0,GetSysColor(COLOR_BTNSHADOW));//深灰色
CPen pen3DDKShadow(PS_SOLID,0,GetSysColor(RGB(0,0,0)));//黑色
if(m_bIsFlat==TRUE)
{
if(m_MouseOnButton==TRUE && m_bDrawBorder==TRUE)
{
//白线,画按钮的左上部
pOldPen=pDC->SelectObject(&penBtnHiLight);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -