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

📄 labutton.cpp

📁 Lakey这是一个免费的CW练习/收/发软件
💻 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 + -