mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
189 lines
3.4 KiB
C++
189 lines
3.4 KiB
C++
#include "stdafx.h"
|
|
#include "CheckBox.h"
|
|
|
|
namespace Forms
|
|
{
|
|
CheckBox::CheckBox()
|
|
: ButtonBase(), _AutoCheck(true), _ThreeState(false), _Appearence(Appearence::Normal), _CheckState(CheckState::Unchecked)
|
|
{
|
|
SetStyle(ControlStyles::StandardClick | ControlStyles::StandardDoubleClick, false);
|
|
this->SetTextAlign(Drawing::ContentAlignment::MiddleLeft);
|
|
|
|
// We are a checkbox control
|
|
this->_RTTI = ControlTypes::CheckBox;
|
|
}
|
|
|
|
Appearence CheckBox::GetAppearence()
|
|
{
|
|
return this->_Appearence;
|
|
}
|
|
|
|
void CheckBox::SetAppearence(Appearence Value)
|
|
{
|
|
if (this->_Appearence != Value)
|
|
{
|
|
this->_Appearence = Value;
|
|
|
|
if (this->_OwnerDraw)
|
|
Refresh();
|
|
else
|
|
UpdateStyles();
|
|
|
|
OnAppearenceChanged();
|
|
}
|
|
}
|
|
|
|
bool CheckBox::AutoCheck()
|
|
{
|
|
return this->_AutoCheck;
|
|
}
|
|
|
|
void CheckBox::SetAutoCheck(bool Value)
|
|
{
|
|
this->_AutoCheck = Value;
|
|
}
|
|
|
|
bool CheckBox::Checked()
|
|
{
|
|
return _CheckState != CheckState::Unchecked;
|
|
}
|
|
|
|
void CheckBox::SetChecked(bool Value)
|
|
{
|
|
this->SetCheckState((Value) ? CheckState::Checked : CheckState::Unchecked);
|
|
}
|
|
|
|
CheckState CheckBox::GetCheckState()
|
|
{
|
|
return _CheckState;
|
|
}
|
|
|
|
void CheckBox::SetCheckState(CheckState Value)
|
|
{
|
|
if (_CheckState != Value)
|
|
{
|
|
bool oChecked = Checked();
|
|
|
|
_CheckState = Value;
|
|
|
|
if (GetState(ControlStates::StateCreated))
|
|
SendMessageA(this->_Handle, BM_SETCHECK, (int)_CheckState, 0);
|
|
|
|
if (oChecked != Checked())
|
|
{
|
|
OnCheckedChanged();
|
|
}
|
|
|
|
OnCheckStateChanged();
|
|
}
|
|
}
|
|
|
|
bool CheckBox::ThreeState()
|
|
{
|
|
return _ThreeState;
|
|
}
|
|
|
|
void CheckBox::SetThreeState(bool Value)
|
|
{
|
|
_ThreeState = Value;
|
|
}
|
|
|
|
void CheckBox::OnClick()
|
|
{
|
|
if (_AutoCheck)
|
|
{
|
|
switch (_CheckState)
|
|
{
|
|
case CheckState::Unchecked:
|
|
SetCheckState(CheckState::Checked);
|
|
break;
|
|
case CheckState::Checked:
|
|
if (_ThreeState)
|
|
SetCheckState(CheckState::Indeterminate);
|
|
else
|
|
SetCheckState(CheckState::Unchecked);
|
|
break;
|
|
default:
|
|
SetCheckState(CheckState::Unchecked);
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Call base event last
|
|
ButtonBase::OnClick();
|
|
}
|
|
|
|
void CheckBox::OnAppearenceChanged()
|
|
{
|
|
AppearenceChanged.RaiseEvent(this);
|
|
}
|
|
|
|
void CheckBox::OnCheckedChanged()
|
|
{
|
|
CheckedChanged.RaiseEvent(this);
|
|
}
|
|
|
|
void CheckBox::OnCheckStateChanged()
|
|
{
|
|
if (this->_OwnerDraw)
|
|
Refresh();
|
|
|
|
CheckStateChanged.RaiseEvent(this);
|
|
}
|
|
|
|
void CheckBox::OnHandleCreated()
|
|
{
|
|
SendMessageA(this->_Handle, BM_SETCHECK, (int)_CheckState, NULL);
|
|
|
|
// We must call base event last
|
|
Control::OnHandleCreated();
|
|
}
|
|
|
|
void CheckBox::OnMouseUp(const std::unique_ptr<MouseEventArgs>& EventArgs)
|
|
{
|
|
if (EventArgs->Button == MouseButtons::Left && GetFlag(ButtonFlags::FlagMousePressed))
|
|
{
|
|
if (GetFlag(ButtonFlags::FlagMouseDown))
|
|
{
|
|
auto Pt = PointToScreen({ (INT)EventArgs->X, (INT)EventArgs->Y });
|
|
|
|
POINT nPt;
|
|
nPt.x = Pt.X;
|
|
nPt.y = Pt.Y;
|
|
|
|
if (WindowFromPoint(nPt) == this->_Handle)
|
|
{
|
|
ResetFlagsAndPaint();
|
|
|
|
if (this->Capture())
|
|
OnClick();
|
|
|
|
OnMouseClick(EventArgs);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Call base event last
|
|
ButtonBase::OnMouseUp(EventArgs);
|
|
}
|
|
|
|
CreateParams CheckBox::GetCreateParams()
|
|
{
|
|
auto Cp = ButtonBase::GetCreateParams();
|
|
|
|
Cp.ClassName = "BUTTON";
|
|
|
|
if (GetStyle(ControlStyles::UserPaint))
|
|
Cp.Style |= BS_OWNERDRAW;
|
|
else
|
|
{
|
|
Cp.Style |= BS_3STATE;
|
|
|
|
if (this->_Appearence == Appearence::Button)
|
|
Cp.Style |= BS_PUSHLIKE;
|
|
}
|
|
|
|
return Cp;
|
|
}
|
|
}
|