#include "stdafx.h"
#include "MyButton.h"
CMyButton::CMyButton()
{
m_pBtnUpBmp = m_pBtnDownBmp = m_pBtnHotBmp = m_pBtnDisableBmp = m_pBtnOnDisableBmp = NULL;
m_MyBtnTxtAlign = MYBTNTXTALIGN_NONE;
m_bHasLine = FALSE;
m_ImageIndex = 0;
m_bHot = m_bCheck = FALSE;
m_BtnType = 0;
m_ImageWidth = m_ImageHeight = 0;
m_bPress = FALSE;
m_sWindowText = "";
m_nSpaceBetween = 3;
m_bIsLatin = FALSE;
m_dwBKColor = RGB(194,194,194);
m_bTextColorChange = TRUE;
m_bUserForceTextColor=FALSE;
m_iForceTextColor=TRUE;
m_bSideLine = true;
m_nFontSize = 14;
m_strFont = "宋体";
m_colLineColor = RGB(10,10,10);
m_nLineWidth = 1;
}
CMyButton::~CMyButton()
{
}
BEGIN_MESSAGE_MAP(CMyButton, CButton)
//{{AFX_MSG_MAP(CMyButton)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDOWN()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
ON_WM_MOVE()
END_MESSAGE_MAP()
CBitmap* CMyButton::SetBtnUpBmp(CBitmap* pBtnUpBmp)
{
CBitmap *pRetBmp = m_pBtnUpBmp;
m_pBtnUpBmp = pBtnUpBmp;
return pRetBmp;
}
CBitmap* CMyButton::SetBtnDownBmp(CBitmap* pBtnDownBmp)
{
CBitmap *pRetBmp = m_pBtnDownBmp;
m_pBtnDownBmp = pBtnDownBmp;
return pRetBmp;
}
CBitmap* CMyButton::SetBtnHotBmp(CBitmap* pBtnHotBmp)
{
CBitmap *pRetBmp = m_pBtnHotBmp;
m_pBtnHotBmp = pBtnHotBmp;
return pRetBmp;
}
CBitmap* CMyButton::SetBtnDisableBmp(CBitmap* pBtnDisableBmp)
{
CBitmap *pRetBmp = m_pBtnDisableBmp;
m_pBtnDisableBmp = pBtnDisableBmp;
return pRetBmp;
}
CBitmap* CMyButton::SetBtnOnDisableBmp(CBitmap* pBtnOnDisableBmp)
{
CBitmap *pRetBmp = m_pBtnOnDisableBmp;
m_pBtnOnDisableBmp = pBtnOnDisableBmp;
return pRetBmp;
}
MYBTNTEXTALIGN CMyButton::SetBtnTextAlign(MYBTNTEXTALIGN MyBtnTextAlign)
{
MYBTNTEXTALIGN ret = m_MyBtnTxtAlign;
m_MyBtnTxtAlign = MyBtnTextAlign;
return ret;
}
void CMyButton::SetLineInf(COLORREF colLineColor, int nLineWidth)
{
m_colLineColor = colLineColor;
m_nLineWidth = nLineWidth;
}
void CMyButton::SetBtnSideLine(bool EnableSide)
{
m_bSideLine = EnableSide;
}
void CMyButton::SetForceTextColor(int iTextColor,BOOL Enable)
{
m_iForceTextColor = iTextColor;
m_bUserForceTextColor = Enable;
}
void CMyButton::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rect = lpDrawItemStruct->rcItem;
double ratio = 1;
int X = (rect.left + rect.right)/2 - m_ImageWidth/2;
int Y = rect.top;
CDC memdc;
memdc.CreateCompatibleDC(pDC);
CString str;
GetWindowText(str);
if(str!=m_sWindowText)
{
pDC->FillSolidRect(rect,m_dwBKColor);
m_sWindowText = str;
m_bIsLatin = TextIsLatin(str);
}
if(lpDrawItemStruct->itemState & ODS_DISABLED)//1
{
if(m_BtnType == 0 || !m_bCheck)
{
if(m_pBtnDisableBmp != NULL)
memdc.SelectObject(m_pBtnDisableBmp);
else
memdc.SelectObject(m_pBtnUpBmp);
}
else
{
if(m_pBtnOnDisableBmp != NULL)
memdc.SelectObject(m_pBtnOnDisableBmp);
else
memdc.SelectObject(m_pBtnUpBmp);
}
}
else if(lpDrawItemStruct->itemState & ODS_SELECTED//2
||(m_bHot && m_bPress) || m_bCheck)
{
if(m_pBtnDownBmp != NULL)
memdc.SelectObject(m_pBtnDownBmp);
else
memdc.SelectObject(m_pBtnUpBmp);
}
else if(m_bHot)
{
if(m_pBtnHotBmp != NULL)
memdc.SelectObject(m_pBtnHotBmp);
else
memdc.SelectObject(m_pBtnUpBmp);
}
else
memdc.SelectObject(m_pBtnUpBmp);
if(m_MyBtnTxtAlign!=MYBTNTXTALIGN_NONE && m_MyBtnTxtAlign!=MYBTNTXTALIGN_CENTER && MYBTNTXTALIGN_STREN != m_MyBtnTxtAlign)
{
if (X>=0)
{
pDC->BitBlt(X,Y,m_ImageWidth,m_ImageHeight,&memdc,m_ImageIndex * m_ImageWidth,0,SRCCOPY);
}
else
{
ratio = m_ImageWidth*1.0/(lpDrawItemStruct->rcItem.right- lpDrawItemStruct->rcItem.left);
pDC->SetStretchBltMode(HALFTONE);
pDC->StretchBlt(0,Y,lpDrawItemStruct->rcItem.right - lpDrawItemStruct->rcItem.left,
(int)(m_ImageHeight/ratio)
,&memdc,
(m_ImageIndex * m_ImageWidth),0,m_ImageWidth,m_ImageHeight,SRCCOPY);
}
int nMode = pDC->SetBkMode(TRANSPARENT);
COLORREF clr;
if(m_bUserForceTextColor)
{
clr = pDC->SetTextColor((COLORREF)m_iForceTextColor);
}
else
{
if(m_bHot && (lpDrawItemStruct->itemState & ODS_DISABLED) == 0 && m_bTextColorChange)
clr = pDC->SetTextColor(RGB(200,0,0));
else if((lpDrawItemStruct->itemState & ODS_DISABLED) != 0)
clr = pDC->SetTextColor(RGB(80,80,80));
else
clr = pDC->SetTextColor(RGB(0,0,0));
}
int nSpace = -1;
int nLastSpace = -1;
int nLength = str.GetLength();
switch(m_MyBtnTxtAlign)
{
case MYBTNTXTALIGN_TOP:
rect.bottom = rect.bottom - m_ImageHeight - m_nSpaceBetween;
pDC->DrawText(str,rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
rect.top = rect.bottom + 2;
rect.bottom = lpDrawItemStruct->rcItem.bottom;
break;
case MYBTNTXTALIGN_BOTTOM:
{
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
int iHeight = tm.tmHeight + tm.tmExternalLeading+4;
rect.top = rect.bottom- iHeight;
pDC->DrawText(str,rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
rect.bottom = rect.top - 2;
rect.top = lpDrawItemStruct->rcItem.top;
break;
}
case MYBTNTXTALIGN_BOTTOM_PRO:
rect.top = rect.top + (int)((m_ImageHeight + m_nSpaceBetween)/ratio);
if(m_bIsLatin)
{
CRect rectCal=rect;
str.TrimLeft();
str.TrimRight();
pDC->DrawText(str,rectCal,DT_CALCRECT);
if(rectCal.right>rect.right)
{
CString str1 = _T("");
nSpace = str.Find(_T(' '));
if(nSpace>=0)//有空格
{
int nSplit = nSpace;
while(rectCal.right>rect.right)
{
str1 = str.Left(nSplit);
str1.TrimLeft();
str1.TrimRight();
rectCal = rect;
pDC->DrawText(str1,rectCal,DT_CALCRECT);
nSplit--;
}
if(nSpace!=++nSplit)//第一个空格就超出范围
{
str = str.Mid(nSplit);
str.TrimLeft();
str.TrimRight();
}
else
{
while(rectCal.right<=rect.right)
{
nLastSpace = nSpace;
nSpace = str.Find(_T(' '),nSpace+1);
if(nSpace>=0)
{
str1 = str.Left(nSpace);
}
else
{
str1 = str;
}
rectCal = rect;
pDC->DrawText(str1,rectCal,DT_CALCRECT);
}
str1 = str.Left(nLastSpace);
str1.TrimLeft();
str1.TrimRight();
str = str.Mid(nLastSpace);
str.TrimLeft();
str.TrimRight();
}
}
else//没有空格
{
int nSplit = str.GetLength();
while(rectCal.right>rect.right)
{
str1 = str.Left(nSplit);
str1.TrimLeft();
str1.TrimRight();
rectCal = rect;
pDC->DrawText(str1,rectCal,DT_CALCRECT);
nSplit--;
}
str = str.Mid(++nSplit);
str.TrimLeft();
str.TrimRight();
}
rect.top-=9;
pDC->DrawText(str1,rect,DT_CENTER);
rect.top+=9;
rectCal = rect;
pDC->DrawText(str,rectCal,DT_CALCRECT);
if(rectCal.right<=rect.right)
pDC->DrawText(str,rect,DT_CENTER);
else
pDC->DrawText(str,rect,DT_LEFT);
}
else
{
rect.top-=3;
rectCal = rect;
pDC->DrawText(str,rectCal,DT_CALCRECT);
if(rectCal.right<=rect.right)
pDC->DrawText(str,rect,DT_CENTER);
else
pDC->DrawText(str,rect,DT_LEFT);
rect.top+=3;
}
}
else
{
pDC->DrawText(str,rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
rect.bottom = rect.top - 2;
rect.top = lpDrawItemStruct->rcItem.top;
break;
case MYBTNTXTALIGN_RIGHT:
rect.left = rect.left + m_ImageWidth + m_nSpaceBetween;
pDC->DrawText(str,rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
rect.right = rect.left - 2;
r