📄 labutton.cpp
字号:
#include "StdAfx.h"
#include "LaButton.h"
CLaButton::CLaButton(IPaintableParent* pParent, const char* pText, const RECT* pRect, ButtonStyle nStyle/* = BT_NORMAL */, CFont* pFont/* = NULL */)
{
InitButton(pParent, pText, pRect, nStyle, pFont);
}
void CLaButton::InitButton(IPaintableParent* pParent, const char* pText, const RECT* pRect, ButtonStyle nStyle, CFont* pFont)
{
m_pParent = pParent;
m_pText = new char[strlen(pText) + 1];
strcpy(m_pText, pText);
m_oRect = *pRect;
m_nStyle = nStyle;
m_pFont = pFont;
m_nState = BS_UP;
m_bIsDown = FALSE;
m_bMouseOver = FALSE;
m_bMouseHold = FALSE;
m_pKeyboardEventListener = NULL;
m_pMouseMoveEventListener = NULL;
m_pMouseKeyEventListener = NULL;
m_nWantKeyCode = 0;
}
CLaButton::~CLaButton(void)
{
delete[] m_pText;
}
void CLaButton::AddKeyboardEventListener(IKeyboardEventListener* pListener)
{
m_pKeyboardEventListener = pListener;
}
void CLaButton::AddMouseMoveEventListener(IMouseMoveEventListener* pListener)
{
m_pMouseMoveEventListener = pListener;
}
void CLaButton::AddMouseKeyEventListener(IMouseKeyEventListener* pListener)
{
m_pMouseKeyEventListener = pListener;
}
BOOL CLaButton::IsRelated(int x, int y)
{
BOOL r = IControl::PointInRect(&m_oRect, x, y);
if (r != m_bMouseOver)
{
m_bMouseOver = r;
m_pParent->Invalidate(&m_oRect);
}
return m_bMouseHold || r;
}
void CLaButton::GetRect(RECT* r)
{
*r = m_oRect;
}
void CLaButton::SetRect(const RECT* r)
{
m_oRect = *r;
m_pParent->Invalidate(r);
}
void CLaButton::SetText(const char* pNewText)
{
delete[] m_pText;
m_pText = new char[strlen(pNewText) + 1];
strcpy(m_pText, pNewText);
m_pParent->Invalidate(&m_oRect);
}
void CLaButton::OnPaint(void* owner, CGraphics* g, const RECT* pRect)
{
if (BS_UP == m_nState)
{
g->SetBgColor(RGB(255, 255, 255));
if (m_bMouseOver)
g->SetColor(RGB(0, 0, 0));
else
g->SetColor(RGB(127, 127, 127));
}
else
{
g->SetColor(RGB(0, 0, 0));
g->SetBgColor(RGB(240, 240, 240));
}
RECT r = m_oRect;
OffsetRect(&r, -r.left, -r.top);
int rw = (r.right - r.left) / 2;
int rh = (r.bottom - r.top) / 2;
if (rw > 16) rw = 16;
if (rh > 16) rh = 16;
int rd = (rw > rh ? rh : rw);
g->DrawRoundRect(&r, rd, rd);
if (m_pFont)
g->SetFont(m_pFont);
g->DrawText(&r, m_pText, DT_VCENTER|DT_CENTER|DT_SINGLELINE);
}
void CLaButton::OnKeyDown(void* owner, int nKeyCode)
{
if (m_nWantKeyCode == nKeyCode)
{
m_nState = BS_DOWN;
m_pParent->Invalidate(&m_oRect);
if (m_pKeyboardEventListener)
m_pKeyboardEventListener->OnKeyDown(this, nKeyCode);
}
}
void CLaButton::OnKeyUp(void* owner, int nKeyCode)
{
if (m_nWantKeyCode == nKeyCode)
{
if (BT_LOCKABLE == m_nStyle)
{
m_bIsDown = !m_bIsDown;
m_nState = (m_bIsDown ? BS_DOWN : BS_UP);
}
else
m_nState = BS_UP;
m_pParent->Invalidate(&m_oRect);
if (m_pKeyboardEventListener)
m_pKeyboardEventListener->OnKeyUp(this, nKeyCode);
OnClick(this);
}
}
void CLaButton::OnMouseMove(void* owner, int x, int y)
{
if (m_pMouseMoveEventListener)
m_pMouseMoveEventListener->OnMouseMove(this, x, y);
}
void CLaButton::OnMouseKeyDown(void* owner, MouseKeyType nMkt, int x, int y)
{
m_bMouseHold = TRUE;
m_nState = BS_DOWN;
m_pParent->Invalidate(&m_oRect);
if (m_pMouseKeyEventListener)
m_pMouseKeyEventListener->OnMouseKeyDown(this, nMkt, x, y);
}
void CLaButton::OnMouseKeyUp(void* owner, MouseKeyType nMkt, int x, int y)
{
m_bMouseHold = FALSE;
if (BT_LOCKABLE == m_nStyle)
{
m_bIsDown = !m_bIsDown;
m_nState = (m_bIsDown ? BS_DOWN : BS_UP);
}
else
m_nState = BS_UP;
m_pParent->Invalidate(&m_oRect);
if (m_pMouseKeyEventListener)
m_pMouseKeyEventListener->OnMouseKeyUp(this, nMkt, x, y);
if (IControl::PointInRect(&m_oRect, x + m_oRect.left, y + m_oRect.top))
OnClick(this);
}
BOOL CLaButton::OnClick(void* owner)
{
BOOL bProcess = FALSE;
if (m_pKeyboardEventListener)
bProcess = m_pKeyboardEventListener->OnClick(this);
if (m_pMouseKeyEventListener && !bProcess)
bProcess = m_pMouseKeyEventListener->OnClick(this);
return bProcess;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -