⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buttonst.cpp

📁 一款精美的俄罗斯方块游戏的源代码。
💻 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 + -