📄 buttonst.cpp
字号:
// ButtonST.cpp : implementation file
//
#include "stdafx.h"
#include "RussianGame.h"
#include "ButtonST.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define TOOLTIP_ID 1
/////////////////////////////////////////////////////////////////////////////
// CButtonST
CButtonST::CButtonST()
{
m_MouseOnButton=FALSE;
m_hIconIn=NULL;
m_hIconOut=NULL;
m_cxIcon=0;
m_cyIcon=0;
m_hCursor=NULL;
m_bIsFlat=TRUE;
m_bDrawBorder=TRUE;
m_nAlign=ST_ALIGN_HORIZ;
m_bShowText=TRUE;
m_bDrawFlatFocus=FALSE;
m_strToolTip.Empty();
SetDefaultInactiveBgColor(FALSE);
SetDefaultInactiveFgColor(FALSE);
SetDefaultActiveBgColor(FALSE);
SetDefaultActiveFgColor(FALSE);
}
CButtonST::~CButtonST()
{
if(m_hIconIn!=NULL)::DeleteObject(m_hIconIn);
if(m_hIconOut!=NULL)::DeleteObject(m_hIconOut);
if(m_hCursor!=NULL)::DestroyCursor(m_hCursor);
}
BEGIN_MESSAGE_MAP(CButtonST, CButton)
//{{AFX_MSG_MAP(CButtonST)
ON_WM_CAPTURECHANGED()
ON_WM_SETCURSOR()
ON_WM_MOUSEMOVE()
ON_WM_KILLFOCUS()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CButtonST message handlers
void CButtonST::AddToolTip(const CString &strTip)
{
m_ctrlToolTip.UpdateTipText(strTip,this,TOOLTIP_ID);
}
void CButtonST::DrawBorder(BOOL bEnable)
{
m_bDrawBorder=bEnable;
}
void CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
#ifdef ST_USE_MEMDC
CDC *pdrawDC=CDC::FromHandle(lpDIS->hDC );
CMemDC memDC(pdrawDC);
CDC *pDC=&memDC;
#else
CDC * pDC=CDC.FromHandle(lpDIS->hDC );
#endif
CPen *pOldPen;
BOOL bIsPressed=(lpDIS->itemState & ODS_SELECTED);
BOOL bIsFocused=(lpDIS->itemState & ODS_FOCUS);
BOOL bIsDisabled = (lpDIS->itemState & ODS_DISABLED);
CRect itemRect = lpDIS->rcItem;
if (m_bIsFlat == FALSE)
{
if (bIsFocused)
{
CBrush br(RGB(0,0,0));
pDC->FrameRect(&itemRect, &br);
itemRect.DeflateRect(1, 1);
}
}
// Prepare draw... paint button's area with background color
COLORREF bgColor;
if ((m_MouseOnButton == TRUE) || (bIsPressed))
bgColor = GetActiveBgColor();
else
bgColor = GetInactiveBgColor();
CBrush br(bgColor);
pDC->FillRect(&itemRect, &br);
// Disegno lo sfondo del bottone
//CBrush br(GetSysColor(COLOR_BTNFACE));
//pDC->FillRect(&itemRect, &br);
// Draw pressed button
if (bIsPressed)
{
if (m_bIsFlat == TRUE)
{
if (m_bDrawBorder == TRUE)
{
CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // Bianco
CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW)); // Grigio scuro
//CPen penBtnShadow(PS_SOLID, 0, RGB(255,0,0)); // Grigio scuro
// Disegno i bordi a sinistra e in alto
// Dark gray line
pOldPen = pDC->SelectObject(&penBtnShadow);
pDC->MoveTo(itemRect.left, itemRect.bottom-1);
pDC->LineTo(itemRect.left, itemRect.top);
pDC->LineTo(itemRect.right, itemRect.top);
// Disegno i bordi a destra e in basso
// White line
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);
//
pDC->SelectObject(pOldPen);
}
}
else
{
CBrush brBtnShadow(GetSysColor(COLOR_BTNSHADOW));
pDC->FrameRect(&itemRect, &brBtnShadow);
}
}
else // ...else draw non pressed button
{
CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // White
CPen pen3DLight(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT)); // Light gray
CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW)); // Dark gray
CPen pen3DDKShadow(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW)); // Black
if (m_bIsFlat == TRUE)
{
if (m_MouseOnButton == TRUE && m_bDrawBorder == TRUE)
{
// Disegno i bordi a sinistra e in alto
// White line
pOldPen = pDC->SelectObject(&penBtnHiLight);
pDC->MoveTo(itemRect.left, itemRect.bottom-1);
pDC->LineTo(itemRect.left, itemRect.top);
pDC->LineTo(itemRect.right, itemRect.top);
// Disegno i bordi a destra e in basso
// Dark gray line
pDC->SelectObject(penBtnShadow);
pDC->MoveTo(itemRect.left, itemRect.bottom-1);
pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
pDC->LineTo(itemRect.right-1, itemRect.top-1);
//
pDC->SelectObject(pOldPen);
}
}
else
{
// Disegno i bordi a sinistra e in alto
// White line
pOldPen = pDC->SelectObject(&penBtnHiLight);
pDC->MoveTo(itemRect.left, itemRect.bottom-1);
pDC->LineTo(itemRect.left, itemRect.top);
pDC->LineTo(itemRect.right, itemRect.top);
// Light gray line
pDC->SelectObject(pen3DLight);
pDC->MoveTo(itemRect.left+1, itemRect.bottom-1);
pDC->LineTo(itemRect.left+1, itemRect.top+1);
pDC->LineTo(itemRect.right, itemRect.top+1);
// Disegno i bordi a destra e in basso
// Black line
pDC->SelectObject(pen3DDKShadow);
pDC->MoveTo(itemRect.left, itemRect.bottom-1);
pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
pDC->LineTo(itemRect.right-1, itemRect.top-1);
// Dark gray line
pDC->SelectObject(penBtnShadow);
pDC->MoveTo(itemRect.left+1, itemRect.bottom-2);
pDC->LineTo(itemRect.right-2, itemRect.bottom-2);
pDC->LineTo(itemRect.right-2, itemRect.top);
//
pDC->SelectObject(pOldPen);
}
}
// Read the button title
CString sTitle;
GetWindowText(sTitle);
// If we don't want the title displayed
if (m_bShowText == FALSE) sTitle.Empty();
CRect captionRect = lpDIS->rcItem;
// Draw the icon
if (m_hIconIn != NULL)
{
DrawTheIcon(pDC, &sTitle, &lpDIS->rcItem, &captionRect, bIsPressed, bIsDisabled);
}
// Write the button title (if any)
if (sTitle.IsEmpty() == FALSE)
{
// Disegno la caption del bottone
// Se il bottone e' premuto muovo la captionRect di conseguenza
if (bIsPressed)
captionRect.OffsetRect(1, 1);
// ONLY FOR DEBUG
// Evidenzia il rettangolo in cui verra' centrata la caption
//CBrush brBtnShadow(RGB(255, 0, 0));
//pDC->FrameRect(&captionRect, &brBtnShadow);
#ifdef ST_USE_MEMDC
// Get dialog's font
CFont *pCurrentFont = GetFont();
CFont *pOldFont = pDC->SelectObject(pCurrentFont);
#endif
if ((m_MouseOnButton == TRUE) || (bIsPressed))
{
pDC->SetTextColor(GetActiveFgColor());
pDC->SetBkColor(GetActiveBgColor());
}
else
{
pDC->SetTextColor(GetInactiveFgColor());
pDC->SetBkColor(GetInactiveBgColor());
}
// Center text
CRect centerRect = captionRect;
pDC->DrawText(sTitle, -1, captionRect, DT_SINGLELINE|DT_CALCRECT);
captionRect.OffsetRect((centerRect.Width() - captionRect.Width())/2, (centerRect.Height() - captionRect.Height())/2);
/* RFU
captionRect.OffsetRect(0, (centerRect.Height() - captionRect.Height())/2);
captionRect.OffsetRect((centerRect.Width() - captionRect.Width())-4, (centerRect.Height() - captionRect.Height())/2);
*/
pDC->DrawState(captionRect.TopLeft(), captionRect.Size(), (LPCTSTR)sTitle, (bIsDisabled ? DSS_DISABLED : DSS_NORMAL),
TRUE, 0, (CBrush*)NULL);
#ifdef ST_USE_MEMDC
pDC->SelectObject(pOldFont);
#endif
}
if (m_bIsFlat == FALSE || (m_bIsFlat == TRUE && m_bDrawFlatFocus == TRUE))
{
// Draw the focus rect
if (bIsFocused)
{
CRect focusRect = itemRect;
focusRect.DeflateRect(3, 3);
pDC->DrawFocusRect(&focusRect);
}
}
} // End of DrawItem
void CButtonST::DrawTheIcon(CDC *pDC, CString *title, RECT *rcItem, CRect *captionRect, BOOL IsPressed, BOOL IsDisabled)
{
CRect iconRect=rcItem;
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.top +=((iconRect.Height()-m_cyIcon)/2);
break;
case ST_ALIGN_VERT:
iconRect.left +=((iconRect.Width()-m_cxIcon)/2);
if (title->IsEmpty())
{
iconRect.top +=((iconRect.Height()-m_cyIcon)/2);
}
else
{
captionRect->top +=m_cyIcon;
}
break;
}
if(IsPressed) iconRect.OffsetRect(1,1);
pDC->DrawState(iconRect.TopLeft(),iconRect.Size(),(m_MouseOnButton==TRUE || IsPressed)?m_hIconIn:m_hIconOut,
(IsDisabled? DSS_DISABLED:DSS_NORMAL),(CBrush*)NULL);
}
void CButtonST::OnCaptureChanged(CWnd *pWnd)
{
if(m_MouseOnButton==TRUE)
{
ReleaseCapture();
Invalidate();
}
// TODO: Add your message handler code here
CButton::OnCaptureChanged(pWnd);
}
BOOL CButtonST::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
if(m_hCursor!=NULL)
{
::SetCursor(m_hCursor);
return TRUE;
}
return CButton::OnSetCursor(pWnd, nHitTest, message);
}
void CButtonST::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWnd * pWnd;
CWnd* pParent;
CButton::OnMouseMove(nFlags, point);
if(nFlags & MK_LBUTTON && m_MouseOnButton==FALSE)return;
if(m_bIsFlat==FALSE)return;
pWnd=GetActiveWindow();
pParent=GetOwner();
if((GetCapture()!=this) &&
(
#ifndef ST_LIKEIE
pWnd!=NULL &&
#endif
pParent!=NULL))
{
m_MouseOnButton=TRUE;
SetCapture();
Invalidate();
}
else
{
CRect rc;
GetClientRect(&rc);
if(!rc.PtInRect(point))
{
if(m_MouseOnButton==TRUE)
{
m_MouseOnButton=FALSE;
Invalidate();
}
if(!(nFlags & MK_LBUTTON))ReleaseCapture();
}
}
}
void CButtonST::OnKillFocus(CWnd* pNewWnd)
{
CButton::OnKillFocus(pNewWnd);
if(m_bIsFlat==FALSE)return;
if(m_MouseOnButton==TRUE)
{
m_MouseOnButton=FALSE;
Invalidate();
}
// TODO: Add your message handler code here
}
BOOL CButtonST::GetShowText()
{
return m_bShowText;
}
int CButtonST::GetAlign()
{
return m_nAlign;
}
BOOL CButtonST::GetFlat()
{
return m_bIsFlat;
}
const COLORREF CButtonST::GetActiveBgColor()
{
return m_crActiveBg;
}
const COLORREF CButtonST::GetActiveFgColor()
{
return m_crActiveFg;
}
BOOL CButtonST::GetFlatFocus()
{
return m_bDrawFlatFocus;
}
const COLORREF CButtonST::GetInactiveBgColor()
{
return m_crInactiveBg;
}
const COLORREF CButtonST::GetInactiveFgColor()
{
return m_crInactiveFg;
}
const char * CButtonST::GetVersionC()
{
return "2.3";
}
const short CButtonST::GetVersionI()
{
return 23;
}
void CButtonST::SetActiveBgColor(COLORREF crNew, BOOL bRepaint)
{
m_crActiveBg=crNew;
if(bRepaint==TRUE)Invalidate();
}
void CButtonST::SetActiveFgColor(COLORREF crNew, BOOL bRepaint)
{
m_crActiveFg=crNew;
if(bRepaint==TRUE)Invalidate();
}
void CButtonST::SetAlign(int nAlign)
{
switch(nAlign)
{
case ST_ALIGN_HORIZ:
m_nAlign=ST_ALIGN_HORIZ;
break;
case ST_ALIGN_VERT:
m_nAlign=ST_ALIGN_VERT;
break;
}
Invalidate();
}
BOOL CButtonST::SetBtnCursor(int nCursorId)
{
HINSTANCE hInstResource;
if(m_hCursor!=NULL)::DestroyCursor(m_hCursor);
m_hCursor=NULL;
if(nCursorId!=-1)
{
hInstResource=AfxFindResourceHandle(MAKEINTRESOURCE(nCursorId),RT_GROUP_CURSOR);
m_hCursor=(HCURSOR)::LoadImage(hInstResource,MAKEINTRESOURCE(nCursorId),IMAGE_CURSOR,0,0,0);
if(m_hCursor==NULL)return FALSE;
}
return true;
}
void CButtonST::SetDefaultActiveBgColor(BOOL bRepaint)
{
m_crActiveBg=::GetSysColor(COLOR_BTNFACE);
if(bRepaint==TRUE)Invalidate();
}
void CButtonST::SetDefaultActiveFgColor(BOOL bRepaint)
{
m_crActiveFg=::GetSysColor(COLOR_BTNTEXT);
if(bRepaint==TRUE)Invalidate();
}
void CButtonST::SetDefaultInactiveBgColor(BOOL bRepaint)
{
m_crInactiveBg=::GetSysColor(COLOR_BTNFACE);
if(bRepaint==TRUE)Invalidate();
}
void CButtonST::SetDefaultInactiveFgColor(BOOL bRepaint)
{
m_crInactiveFg=::GetSysColor(COLOR_BTNTEXT);
if(bRepaint==TRUE)Invalidate();
}
void CButtonST::SetFlat(BOOL bState)
{
m_bIsFlat=bState;
Invalidate();
}
void CButtonST::SetFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint)
{
m_bDrawFlatFocus=bDrawFlatFocus;
if(bRepaint==TRUE)Invalidate();
}
void CButtonST::SetInactiveBgColor(COLORREF crNew, BOOL bRepaint)
{
m_crInactiveBg=crNew;
if(bRepaint==TRUE)Invalidate();
}
void CButtonST::SetInactiveFgColor(COLORREF crNew, BOOL bRepaint)
{
m_crInactiveFg=crNew;
if(bRepaint==TRUE)Invalidate();
}
void CButtonST::SetShowText(BOOL bShow)
{
m_bShowText=bShow;
Invalidate();
}
void CButtonST::SetIcon(int nIconInId, int nIconOutId,BYTE cx,BYTE cy)
{
HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nIconInId),
RT_GROUP_ICON);
// Set icon when the mouse is IN the button
m_hIconIn = (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconInId), IMAGE_ICON, 0, 0, 0);
// Set icon when the mouse is OUT the button
m_hIconOut = (nIconOutId == NULL) ? m_hIconIn : (HICON)::LoadImage(hInstResource/*AfxGetApp()->m_hInstance*/, MAKEINTRESOURCE(nIconOutId), IMAGE_ICON, 0, 0, 0);
m_cxIcon = cx;
m_cyIcon = cy;
RedrawWindow();
}
void CButtonST::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
CRect rect;
GetClientRect ( &rect );
// Add BS_OWNERDRAW style
SetButtonStyle(GetButtonStyle() | BS_OWNERDRAW);
// Create tooltips
m_ctrlToolTip.Create ( this );
m_ctrlToolTip.AddTool ( this, m_strToolTip, rect, TOOLTIP_ID );
CButton::PreSubclassWindow();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -