📄 btnst.cpp
字号:
// BtnST.cpp : implementation file
//
#include "stdafx.h"
#include "BtnST.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CButtonST
CButtonST::CButtonST()
{
m_MouseOnButton = FALSE;
m_hIcon = NULL;
m_cxIcon = 0;
m_cyIcon = 0;
m_bIsFlat = TRUE; // Default type is 'flat' button
m_bDrawBorder = TRUE; // By default draw border in 'flat' button
m_nAlign = ST_ALIGN_HORIZ; // By default icon is aligned horizontally
} // End of CButtonST
BEGIN_MESSAGE_MAP(CButtonST, CButton)
//{{AFX_MSG_MAP(CButtonST)
//}}AFX_MSG_MAP
ON_WM_MOUSEMOVE()
ON_WM_KILLFOCUS()
END_MESSAGE_MAP()
void CButtonST::SetIcon(int nIconId, BYTE cx, BYTE cy)
{
m_hIcon = (HICON)::LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(nIconId), IMAGE_ICON, cx, cy, 0);
m_cxIcon = cx;
m_cyIcon = cy;
} // End of SetIcon
void CButtonST::SetFlat(BOOL bState)
{
m_bIsFlat = bState;
Invalidate();
} // End of SetFlat
BOOL CButtonST::GetFlat()
{
return m_bIsFlat;
} // End of GetFlat
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();
} // End of SetAlign
int CButtonST::GetAlign()
{
return m_nAlign;
} // End of GetAlign
void CButtonST::DrawBorder(BOOL bEnable)
{
m_bDrawBorder = !m_bDrawBorder;
} // End of DrawBorder
const char* CButtonST::GetVersionC()
{
return "2.0";
} // End of GetVersionC
const short CButtonST::GetVersionI()
{
return 20; // Divide by 10 to get actual version
} // End of GetVersionI
void CButtonST::OnMouseMove(UINT nFlags, CPoint point)
{
CWnd* pWnd = NULL; // Finestra attiva
CWnd* pParent = NULL; // Finestra che contiene il bottone
CButton::OnMouseMove(nFlags, point);
// If our button is not flat then do nothing
if (m_bIsFlat == FALSE) return;
pWnd = GetActiveWindow();
pParent = GetOwner();
if (FALSE == m_MouseOnButton == FALSE && this != GetCapture() && NULL != pWnd)//&& (pWnd->m_hWnd == pParent->m_hWnd)))
{
m_MouseOnButton = TRUE;
SetFocus();
if (TRUE == m_bDrawBorder)
{
SetCapture();
Invalidate();
}
}
else
{
CRect rc;
GetClientRect(&rc);
if (!rc.PtInRect(point))
{
m_MouseOnButton = FALSE;
Invalidate();
ReleaseCapture();
}
}
} // End of OnMouseMove
void CButtonST::OnKillFocus(CWnd * pNewWnd)
{
CButton::OnKillFocus(pNewWnd);
// If our button is not flat then do nothing
if (m_bIsFlat == FALSE) return;
if (TRUE == m_MouseOnButton)
{
m_MouseOnButton = FALSE;
Invalidate();
UpdateWindow();
}
} // End of OnKillFocus
void CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CPen* pOldPen = NULL;
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
unsigned int IsPressed = (lpDIS->itemState & ODS_SELECTED);
unsigned int IsFocused = (lpDIS->itemState & ODS_FOCUS);
unsigned int IsDisabled = (lpDIS->itemState & ODS_DISABLED);
CRect itemRect = lpDIS->rcItem;
if (m_bIsFlat == FALSE)
{
if (IsFocused)
{
CBrush br(RGB(0,0,0));
pDC->FrameRect(&itemRect, &br);
itemRect.DeflateRect(1, 1);
}
}
// Disegno lo sfondo del bottone
CBrush br(GetSysColor(COLOR_BTNFACE));
pDC->FillRect(&itemRect, &br);
// Draw pressed button
if (IsPressed)
{
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
// 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 not 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);
}
}
if (m_bIsFlat == FALSE)
{
// Draw the focus rect
if (IsFocused)
{
CRect focusRect = itemRect;
focusRect.DeflateRect(3, 3);
pDC->DrawFocusRect(&focusRect);
}
}
// Read the button title
CString title;
GetWindowText(title);
CRect captionRect = lpDIS->rcItem;
// Draw the icon
if (m_hIcon != NULL)
{
DrawTheIcon(pDC, &title, &lpDIS->rcItem, &captionRect, IsPressed, IsDisabled);
}
// Write the button title (if any)
if (title.IsEmpty() == FALSE)
{
// Disegno la caption del bottone
// pDC->SetBkMode(TRANSPARENT);
// Se il bottone e' premuto muovo la captionRect di conseguenza
if (IsPressed)
captionRect.OffsetRect(1, 1);
// SOLO PER DEBUG
// Evidenzia il rettangolo in cui verra' centrata la caption
//CBrush brBtnShadow(RGB(255, 0, 0));
//pDC->FrameRect(&captionRect, &brBtnShadow);
// Center text
CRect centerRect = captionRect;
pDC->DrawText(title, -1, captionRect, DT_SINGLELINE|DT_CALCRECT);
captionRect.OffsetRect((centerRect.Width() - captionRect.Width())/2, (centerRect.Height() - captionRect.Height())/2);
pDC->DrawState(captionRect.TopLeft(), captionRect.Size(), (LPCTSTR)title, (IsDisabled ? DSS_DISABLED : DSS_NORMAL),
TRUE, 0, (CBrush*)NULL);
}
} // 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())
{
// Center the icon horizontally
iconRect.left += ((iconRect.Width() - m_cxIcon)/2);
}
else
{
// L'icona deve vedersi subito dentro il focus rect
iconRect.left += 3;
captionRect->left += m_cxIcon + 3;
}
// Center the icon vertically
iconRect.top += ((iconRect.Height() - m_cyIcon)/2);
break;
case ST_ALIGN_VERT:
// Center the icon horizontally
iconRect.left += ((iconRect.Width() - m_cxIcon)/2);
if (title->IsEmpty())
{
// Center the icon vertically
iconRect.top += ((iconRect.Height() - m_cyIcon)/2);
}
else
{
captionRect->top += m_cyIcon;
}
break;
}
// If button is pressed then press the icon also
if (IsPressed) iconRect.OffsetRect(1, 1);
// Ole'!
pDC->DrawState(iconRect.TopLeft(), iconRect.Size(), m_hIcon, (IsDisabled ? DSS_DISABLED : DSS_NORMAL),
(CBrush*)NULL);
} // End of DrawTheIcon
BOOL CButtonST::SubclassDlgItem(UINT nID, CWnd * pParent)
{
BOOL retValue = CButton::SubclassDlgItem(nID, pParent);
// If something wrong then abort
if (retValue == 0) return 0;
// Add BS_OWNERDRAW style
LONG bs = ::GetWindowLong(m_hWnd, GWL_STYLE);
bs |= BS_OWNERDRAW;
::SetWindowLong(m_hWnd, GWL_STYLE, bs);
return retValue;
} // End of SubclassDlgItem
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -