170 lines
3.6 KiB
C++
Raw Normal View History

2022-05-21 19:58:09 +02:00
#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;
}
}