📄 bitmapbtn.cpp
字号:
#include "stdafx.h"
#include <afxwin.h>
#include <afxcmn.h>
#include "BitmapBtn.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CBitmapBtn
CBitmapBtn::CBitmapBtn()
{
m_CheckedButton = m_Check = m_MouseOnButton = FALSE;
}
// set button to be a checked button or not
void CBitmapBtn::SetCheckedButton(BOOL chk)
{
m_CheckedButton = chk;
}
void CBitmapBtn::SetCheckStatus(BOOL chk)
{
m_Check = chk;
Invalidate();
}
CBitmapBtn::~CBitmapBtn()
{
m_Normal.DeleteObject();
m_Over.DeleteObject();
m_Down.DeleteObject();
m_Disabled.DeleteObject();
m_MouseOnButton = FALSE;
}
BEGIN_MESSAGE_MAP(CBitmapBtn, CButton)
//{{AFX_MSG_MAP(CBitmapBtn)
ON_WM_KILLFOCUS()
ON_WM_MOUSEMOVE()
ON_WM_CAPTURECHANGED()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBitmapBtn message handlers
void CBitmapBtn::SetBitmap(HBITMAP mNrml, HBITMAP mOvr, HBITMAP mDwn, HBITMAP mDsbl, HBITMAP mFocus)
{
m_Normal.DeleteObject();
m_Over.DeleteObject();
m_Down.DeleteObject();
m_Disabled.DeleteObject();
m_Focus.DeleteObject();
m_Normal.Attach(mNrml);
m_Over.Attach(mOvr);
m_Down.Attach(mDwn);
m_Disabled.Attach(mDsbl);
m_Focus.Attach(mFocus);
}
void CBitmapBtn::SetBitmap(CBitmap* mNrml, CBitmap* mOvr, CBitmap* mDwn)
{
m_Normal.DeleteObject();
m_Over.DeleteObject();
m_Down.DeleteObject();
m_Normal.Attach(mNrml->m_hObject);
m_Over.Attach(mOvr->m_hObject);
m_Down.Attach(mDwn->m_hObject);
}
// draw the button
void CBitmapBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
BOOL bIsPressed = (lpDrawItemStruct->itemState & ODS_SELECTED);
BOOL bIsFocused = (lpDrawItemStruct->itemState & ODS_FOCUS);
BOOL bIsDisabled = (lpDrawItemStruct->itemState & ODS_DISABLED);
CDC memdc;
memdc.CreateCompatibleDC(pDC);
if(!m_CheckedButton)
{
if (m_Check && !m_MouseOnButton)
{
TRACE(L"m_check && !m_MouseOnButton\n");
memdc.SelectObject(m_Down);
}
else if (bIsPressed)
memdc.SelectObject(m_Down);
else if (m_MouseOnButton)
{
TRACE(L"MouseOnButton\n");
memdc.SelectObject(m_Over);
}
else if (bIsDisabled)
memdc.SelectObject(m_Disabled);
else if (bIsFocused)
memdc.SelectObject(m_Focus);
else
memdc.SelectObject(m_Normal);
}
else
{
if (m_Check)
memdc.SelectObject(m_Down);
else
memdc.SelectObject(m_Normal);
}
CRect r;
GetClientRect(&r);
/*
this->GetWindowRect(&r);
TRACE("(%d,%d)\n",r.left, r.top);
*/
pDC->BitBlt(0, 0, r.Width(), r.Height(), &memdc, 0, 0, SRCCOPY);
memdc.DeleteDC();
}
void CBitmapBtn::PreSubclassWindow()
{
UINT nBS;
nBS = GetButtonStyle();
if (nBS & BS_DEFPUSHBUTTON) m_MouseOnButton = TRUE;
SetButtonStyle(nBS | BS_OWNERDRAW);
CButton::PreSubclassWindow();
ModifyStyle(WS_TABSTOP, 0);
}
void CBitmapBtn::OnKillFocus(CWnd* pNewWnd)
{
CButton::OnKillFocus(pNewWnd);
m_MouseOnButton = FALSE;
Invalidate();
}
void CBitmapBtn::OnMouseMove(UINT nFlags, CPoint point)
{
#if 0
CWnd* pWnd;
CWnd* pParent;
CButton::OnMouseMove(nFlags, point);
if (nFlags & MK_LBUTTON && m_MouseOnButton == FALSE) return;
pWnd = GetActiveWindow();
pParent = GetOwner();
if ((GetCapture() != this) && (pWnd != NULL && pParent != NULL))
{
m_MouseOnButton = TRUE;
SetCapture();
Invalidate();
}
else
{
POINT p2 = point;
ClientToScreen(&p2);
CWnd* wndUnderMouse = WindowFromPoint(p2);
if (wndUnderMouse && wndUnderMouse->m_hWnd != this->m_hWnd)
{
if (m_MouseOnButton == TRUE)
{
m_MouseOnButton = FALSE;
Invalidate();
}
if (!(nFlags & MK_LBUTTON)) ReleaseCapture();
}
}
#endif
}
void CBitmapBtn::OnCaptureChanged(CWnd *pWnd)
{
if (m_MouseOnButton == TRUE)
{
ReleaseCapture();
Invalidate();
}
CButton::OnCaptureChanged(pWnd);
}
BOOL CBitmapBtn::PreTranslateMessage(MSG* pMsg)
{
return CButton::PreTranslateMessage(pMsg);
}
BOOL CBitmapBtn::OnEraseBkgnd(CDC* pDC)
{
return FALSE;
}
BOOL CBitmapBtn::GetCheck()
{
return m_Check;
}
void CBitmapBtn::SetCheck(BOOL m_NewValue)
{
if(m_NewValue != m_Check)
{
m_Check = m_NewValue;
Invalidate();
}
}
void CBitmapBtn::SetNormalState()
{
UINT nBS;
nBS = GetButtonStyle();
SetButtonStyle(nBS | BS_DEFPUSHBUTTON);
ModifyStyle(BS_OWNERDRAW,0);
}
void CBitmapBtn::SetOwnerDrawState()
{
UINT nBS;
nBS = GetButtonStyle();
SetButtonStyle(nBS | BS_OWNERDRAW);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -