mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
170 lines
3.6 KiB
C++
170 lines
3.6 KiB
C++
|
#include "stdafx.h"
|
||
|
#include "Label.h"
|
||
|
|
||
|
namespace Forms
|
||
|
{
|
||
|
Label::Label()
|
||
|
: Control(), _OwnerDraw(false), _FlatStyle(FlatStyle::Standard), _TextAlign(Drawing::ContentAlignment::TopLeft), _BorderStyle(BorderStyle::None)
|
||
|
{
|
||
|
SetStyle(ControlStyles::UserPaint |
|
||
|
ControlStyles::SupportsTransparentBackColor |
|
||
|
ControlStyles::OptimizedDoubleBuffer, this->_OwnerDraw);
|
||
|
|
||
|
SetStyle(ControlStyles::Selectable |
|
||
|
ControlStyles::FixedHeight, false);
|
||
|
|
||
|
SetStyle(ControlStyles::ResizeRedraw, true);
|
||
|
|
||
|
// We are a label control
|
||
|
this->_RTTI = ControlTypes::Label;
|
||
|
}
|
||
|
|
||
|
bool Label::OwnerDraw()
|
||
|
{
|
||
|
return this->_OwnerDraw;
|
||
|
}
|
||
|
|
||
|
void Label::SetOwnerDraw(bool Value)
|
||
|
{
|
||
|
this->_OwnerDraw = Value;
|
||
|
|
||
|
SetStyle(ControlStyles::UserPaint | ControlStyles::SupportsTransparentBackColor | ControlStyles::OptimizedDoubleBuffer, Value);
|
||
|
|
||
|
UpdateStyles();
|
||
|
Invalidate();
|
||
|
}
|
||
|
|
||
|
Drawing::ContentAlignment Label::TextAlign()
|
||
|
{
|
||
|
return this->_TextAlign;
|
||
|
}
|
||
|
|
||
|
void Label::SetTextAlign(Drawing::ContentAlignment Value)
|
||
|
{
|
||
|
this->_TextAlign = Value;
|
||
|
|
||
|
if (this->_OwnerDraw)
|
||
|
Invalidate();
|
||
|
else
|
||
|
UpdateStyles();
|
||
|
}
|
||
|
|
||
|
FlatStyle Label::GetFlatStyle()
|
||
|
{
|
||
|
return this->_FlatStyle;
|
||
|
}
|
||
|
|
||
|
void Label::SetFlatStyle(FlatStyle Value)
|
||
|
{
|
||
|
this->_FlatStyle = Value;
|
||
|
|
||
|
Invalidate();
|
||
|
|
||
|
// Force update styles...
|
||
|
SetStyle(ControlStyles::UserPaint | ControlStyles::SupportsTransparentBackColor | ControlStyles::OptimizedDoubleBuffer, this->_OwnerDraw);
|
||
|
UpdateStyles();
|
||
|
}
|
||
|
|
||
|
BorderStyle Label::GetBorderStyle()
|
||
|
{
|
||
|
return this->_BorderStyle;
|
||
|
}
|
||
|
|
||
|
void Label::SetBorderStyle(BorderStyle Value)
|
||
|
{
|
||
|
this->_BorderStyle = Value;
|
||
|
|
||
|
Invalidate();
|
||
|
|
||
|
// Force update styles...
|
||
|
SetStyle(ControlStyles::UserPaint | ControlStyles::SupportsTransparentBackColor | ControlStyles::OptimizedDoubleBuffer, this->_OwnerDraw);
|
||
|
UpdateStyles();
|
||
|
}
|
||
|
|
||
|
void Label::WndProc(Message& Msg)
|
||
|
{
|
||
|
switch (Msg.Msg)
|
||
|
{
|
||
|
case WM_NCHITTEST:
|
||
|
{
|
||
|
auto RcScreen = this->RectangleToScreen(Drawing::Rectangle(0, 0, this->_Width, this->_Height));
|
||
|
|
||
|
// A label normally returns HT_TRANSPARENT, we can modify this by calculating the
|
||
|
// hits ourself here
|
||
|
Msg.Result = (RcScreen.Contains(LOWORD(Msg.LParam), HIWORD(Msg.LParam)) ? HTCLIENT : HTNOWHERE);
|
||
|
break;
|
||
|
}
|
||
|
case WM_SETTEXT:
|
||
|
{
|
||
|
Control::WndProc(Msg);
|
||
|
|
||
|
// A lable that is SS_OWNERDRAW does not render properly during WM_SETTEXT
|
||
|
// we must trigger this...
|
||
|
if (this->OwnerDraw())
|
||
|
this->Invalidate(true);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
Control::WndProc(Msg);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CreateParams Label::GetCreateParams()
|
||
|
{
|
||
|
auto Cp = Control::GetCreateParams();
|
||
|
Cp.ClassName = "STATIC";
|
||
|
|
||
|
if (this->_OwnerDraw)
|
||
|
{
|
||
|
Cp.Style |= SS_OWNERDRAW;
|
||
|
Cp.ExStyle &= ~WS_EX_RIGHT;
|
||
|
}
|
||
|
|
||
|
if (!this->_OwnerDraw)
|
||
|
{
|
||
|
switch (this->_TextAlign)
|
||
|
{
|
||
|
case Drawing::ContentAlignment::TopLeft:
|
||
|
case Drawing::ContentAlignment::MiddleLeft:
|
||
|
case Drawing::ContentAlignment::BottomLeft:
|
||
|
Cp.Style |= SS_LEFT;
|
||
|
break;
|
||
|
|
||
|
case Drawing::ContentAlignment::TopRight:
|
||
|
case Drawing::ContentAlignment::MiddleRight:
|
||
|
case Drawing::ContentAlignment::BottomRight:
|
||
|
Cp.Style |= SS_RIGHT;
|
||
|
break;
|
||
|
|
||
|
case Drawing::ContentAlignment::TopCenter:
|
||
|
case Drawing::ContentAlignment::MiddleCenter:
|
||
|
case Drawing::ContentAlignment::BottomCenter:
|
||
|
Cp.Style |= SS_CENTER;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Trick to vertically center built-in label text
|
||
|
if (((int)this->_TextAlign & (int)Drawing::AnyMiddleAlign) != 0)
|
||
|
Cp.Style |= SS_CENTERIMAGE;
|
||
|
}
|
||
|
else
|
||
|
Cp.Style |= SS_LEFT;
|
||
|
|
||
|
switch (this->_BorderStyle)
|
||
|
{
|
||
|
case BorderStyle::FixedSingle:
|
||
|
Cp.Style |= WS_BORDER;
|
||
|
break;
|
||
|
case BorderStyle::Fixed3D:
|
||
|
Cp.Style |= SS_SUNKEN;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
Cp.Style |= SS_NOPREFIX;
|
||
|
|
||
|
return Cp;
|
||
|
}
|
||
|
}
|