initial commit

This commit is contained in:
Ysm-04
2025-09-07 00:22:33 +08:00
parent d62d8a90d6
commit a29b4371fb
16 changed files with 481 additions and 461 deletions

View File

@@ -1,24 +1,24 @@
#include "button.h"
#include "Button.h"
button::button(int x, int y, int width, int height, const std::string text, StellarX::buttonMode mode, StellarX::controlShape shape)
Button::Button(int x, int y, int width, int height, const std::string text, StellarX::ButtonMode mode, StellarX::ControlShape shape)
: Control(x, y, width, height)
{
initButton(text, mode, shape, RGB(202, 255, 255), RGB(171, 196, 220), RGB(255, 255, 0));
}
button::button(int x, int y, int width, int height, const std::string text, COLORREF ct, COLORREF cf, StellarX::buttonMode mode, StellarX::controlShape shape)
Button::Button(int x, int y, int width, int height, const std::string text, COLORREF ct, COLORREF cf, StellarX::ButtonMode mode, StellarX::ControlShape shape)
: Control(x, y, width, height)
{
initButton(text, mode, shape, ct, cf, RGB(255, 255, 0));
}
button::button(int x, int y, int width, int height, const std::string text, COLORREF ct, COLORREF cf, COLORREF ch, StellarX::buttonMode mode, StellarX::controlShape shape)
Button::Button(int x, int y, int width, int height, const std::string text, COLORREF ct, COLORREF cf, COLORREF ch, StellarX::ButtonMode mode, StellarX::ControlShape shape)
: Control(x, y, width, height)
{
initButton(text, mode, shape, ct, cf, ch);
}
void button::initButton(const std::string text, StellarX::buttonMode mode, StellarX::controlShape shape, COLORREF ct, COLORREF cf, COLORREF ch)
void Button::initButton(const std::string text, StellarX::ButtonMode mode, StellarX::ControlShape shape, COLORREF ct, COLORREF cf, COLORREF ch)
{
this->text = text;
this->mode = mode;
@@ -31,226 +31,257 @@ void button::initButton(const std::string text, StellarX::buttonMode mode, Stell
}
button::~button()
Button::~Button()
{
if (buttonFileIMAGE)
delete buttonFileIMAGE;
buttonFileIMAGE = nullptr;
}
void button::draw()
void Button::draw()
{
if (dirty)
{
//保存当前样式和颜色
saveStyle();
if (dirty)
{
//保存当前样式和颜色
saveStyle();
if (StellarX::buttonMode::DISABLED == mode) //设置禁用按钮色
{
setfillcolor(RGB(96, 96, 96));
textStyle.bStrikeOut = 1;
}
else
{
if (hover)
setfillcolor(buttonHoverColor);
else
setfillcolor(click ? buttonTrueColor : buttonFalseColor);
}
//设置字体背景色透明
setbkmode(TRANSPARENT);
//边框颜色
setlinecolor(buttonBorderColor);
if(this->textStyle !=oldStyle)
{
//设置字体颜色
settextcolor(textStyle.color);
//设置字体样式
settextstyle(textStyle.nHeight, textStyle.nWidth, textStyle.lpszFace,
textStyle.nEscapement, textStyle.nOrientation, textStyle.nWeight,
textStyle.bItalic, textStyle.bUnderline, textStyle.bStrikeOut); //设置字体样式
}
//设置按钮填充模式
setfillstyle(buttonFillMode, (int)buttonFillIma, buttonFileIMAGE);
//获取字符串像素高度和宽度
if((this->oldtext_width!= this->text_width|| this->oldtext_height!= this->text_height)
||(-1 == oldtext_width &&oldtext_height == -1))
{
this->oldtext_width = this->text_width = textwidth(LPCTSTR(this->text.c_str()));;
this->oldtext_height = this->text_height = textheight(LPCTSTR(this->text.c_str()));;
if (StellarX::ButtonMode::DISABLED == mode) //设置禁用按钮色
{
setfillcolor(RGB(96, 96, 96));
textStyle.bStrikeOut = 1;
}
else
{
// 修改这里:确保点击状态的颜色正确显示
// 点击状态优先级最高,然后是悬停状态,最后是默认状态
if (click)
setfillcolor(buttonTrueColor);
else if (hover)
setfillcolor(buttonHoverColor);
else
setfillcolor(buttonFalseColor);
}
//根据按钮形状绘制
switch (shape)
{
case StellarX::controlShape::RECTANGLE:
fillrectangle(x, y, width, height);//有边框填充矩形
outtextxy((x + (width - x - text_width) / 2), (y + (height - y - text_height) / 2), LPCTSTR(text.c_str()));
break;
case StellarX::controlShape::B_RECTANGLE:
solidrectangle(x, y, width, height);//无边框填充矩形
outtextxy((x + (width - x - text_width) / 2), (y + (height - y - text_height) / 2), LPCTSTR(text.c_str()));
break;
case StellarX::controlShape::ROUND_RECTANGLE:
fillroundrect(x, y, width, height, ROUND_RECTANGLEwidth, ROUND_RECTANGLEheight);//有边框填充圆角矩形
outtextxy((x + (width - x - text_width) / 2), (y + (height - y - text_height) / 2), LPCTSTR(text.c_str()));
break;
case StellarX::controlShape::B_ROUND_RECTANGLE:
solidroundrect(x, y, width, height, ROUND_RECTANGLEwidth, ROUND_RECTANGLEheight);//无边框填充圆角矩形
outtextxy((x + (width - x - text_width) / 2), (y + (height - y - text_height) / 2), LPCTSTR(text.c_str()));
break;
case StellarX::controlShape::CIRCLE:
fillcircle(x, y, (width - x) / 2);//有边框填充圆形
outtextxy(x - text_width / 2, y - text_height / 2, LPCTSTR(text.c_str()));
break;
case StellarX::controlShape::B_CIRCLE:
solidcircle(x, y, (width - x) / 2);//无边框填充圆形
outtextxy(x - text_width / 2, y - text_height / 2, LPCTSTR(text.c_str()));
break;
case StellarX::controlShape::ELLIPSE:
fillellipse(x, y, width, height);//有边框填充椭圆
outtextxy((x + (width - x - text_width) / 2), (y + (height - y - text_height) / 2), LPCTSTR(text.c_str()));
break;
case StellarX::controlShape::B_ELLIPSE:
solidellipse(x, y, width, height);//无边框填充椭圆
outtextxy((x + (width - x - text_width) / 2), (y + (height - y - text_height) / 2), LPCTSTR(text.c_str()));
break;
}
//设置字体背景色透明
setbkmode(TRANSPARENT);
//边框颜色
setlinecolor(buttonBorderColor);
if (this->textStyle != oldStyle)
{
//设置字体颜色
settextcolor(textStyle.color);
//设置字体样式
settextstyle(textStyle.nHeight, textStyle.nWidth, textStyle.lpszFace,
textStyle.nEscapement, textStyle.nOrientation, textStyle.nWeight,
textStyle.bItalic, textStyle.bUnderline, textStyle.bStrikeOut); //设置字体样式
}
//设置按钮填充模式
setfillstyle(buttonFillMode, (int)buttonFillIma, buttonFileIMAGE);
restoreStyle();//恢复默认字体样式和颜色
//获取字符串像素高度和宽度
if ((this->oldtext_width != this->text_width || this->oldtext_height != this->text_height)
|| (-1 == oldtext_width && oldtext_height == -1))
{
this->oldtext_width = this->text_width = textwidth(LPCTSTR(this->text.c_str()));
this->oldtext_height = this->text_height = textheight(LPCTSTR(this->text.c_str()));
}
dirty = false; //标记按钮不需要重绘
}
//根据按钮形状绘制
switch (shape)
{
case StellarX::ControlShape::RECTANGLE:
fillrectangle(x, y, x + width, y + height);//有边框填充矩形
outtextxy((x + (width - text_width) / 2), (y + (height - text_height) / 2), LPCTSTR(text.c_str()));
break;
case StellarX::ControlShape::B_RECTANGLE:
solidrectangle(x, y, x + width, y + height);//无边框填充矩形
outtextxy((x + (width - text_width) / 2), (y + (height - text_height) / 2), LPCTSTR(text.c_str()));
break;
case StellarX::ControlShape::ROUND_RECTANGLE:
fillroundrect(x, y, x + width, y + height, rouRectangleSize.ROUND_RECTANGLEwidth, rouRectangleSize.ROUND_RECTANGLEheight);//有边框填充圆角矩形
outtextxy((x + (width - text_width) / 2), (y + (height - text_height) / 2), LPCTSTR(text.c_str()));
break;
case StellarX::ControlShape::B_ROUND_RECTANGLE:
solidroundrect(x, y, x + width, y + height, rouRectangleSize.ROUND_RECTANGLEwidth, rouRectangleSize.ROUND_RECTANGLEheight);//无边框填充圆角矩形
outtextxy((x + (width - text_width) / 2), (y + (height - text_height) / 2), LPCTSTR(text.c_str()));
break;
case StellarX::ControlShape::CIRCLE:
fillcircle(x + width / 2, y + height / 2, min(width, height) / 2);//有边框填充圆形
outtextxy(x + width / 2 - text_width / 2, y + height / 2 - text_height / 2, LPCTSTR(text.c_str()));
break;
case StellarX::ControlShape::B_CIRCLE:
solidcircle(x + width / 2, y + height / 2, min(width, height) / 2);//无边框填充圆形
outtextxy(x + width / 2 - text_width / 2, y + height / 2 - text_height / 2, LPCTSTR(text.c_str()));
break;
case StellarX::ControlShape::ELLIPSE:
fillellipse(x, y, x + width, y + height);//有边框填充椭圆
outtextxy((x + (width - text_width) / 2), (y + (height - text_height) / 2), LPCTSTR(text.c_str()));
break;
case StellarX::ControlShape::B_ELLIPSE:
solidellipse(x, y, x + width, y + height);//无边框填充椭圆
outtextxy((x + (width - text_width) / 2), (y + (height - text_height) / 2), LPCTSTR(text.c_str()));
break;
}
restoreStyle();//恢复默认字体样式和颜色
dirty = false; //标记按钮不需要重绘
}
}
// 处理鼠标事件,检测点击和悬停状态
// 根据按钮模式和形状进行不同的处理
void button::handleEvent(const ExMessage& msg)
void Button::handleEvent(const ExMessage& msg)
{
bool oldHover = hover;
bool oldClick = click;
// 检测悬停状态(根据不同形状)
switch (shape)
{
case StellarX::controlShape::RECTANGLE:
case StellarX::controlShape::B_RECTANGLE:
case StellarX::controlShape::ROUND_RECTANGLE:
case StellarX::controlShape::B_ROUND_RECTANGLE:
hover = (msg.x > x && msg.x < width && msg.y > y && msg.y < height);//判断鼠标是否在矩形按钮内
break;
case StellarX::controlShape::CIRCLE:
case StellarX::controlShape::B_CIRCLE:
hover = isMouseInCircle(msg.x, msg.y, x, y, (width - x) / 2);//判断鼠标是否在圆形按钮内
break;
case StellarX::controlShape::ELLIPSE:
case StellarX::controlShape::B_ELLIPSE:
hover = isMouseInEllipse(msg.x, msg.y, x, y, width, height);//判断鼠标是否在椭圆按钮内
break;
bool oldHover = hover;
bool oldClick = click;
}
// 检测悬停状态(根据不同形状)
switch (shape)
{
case StellarX::ControlShape::RECTANGLE:
case StellarX::ControlShape::B_RECTANGLE:
case StellarX::ControlShape::ROUND_RECTANGLE:
case StellarX::ControlShape::B_ROUND_RECTANGLE:
hover = (msg.x > x && msg.x < (x + width) && msg.y > y && msg.y < (y + height));
break;
case StellarX::ControlShape::CIRCLE:
case StellarX::ControlShape::B_CIRCLE:
hover = isMouseInCircle(msg.x, msg.y, x + width / 2, y + height / 2, min(width, height) / 2);
break;
case StellarX::ControlShape::ELLIPSE:
case StellarX::ControlShape::B_ELLIPSE:
hover = isMouseInEllipse(msg.x, msg.y, x, y, x + width, y + height);
break;
}
if (hover && msg.message == WM_LBUTTONUP)
{
if (mode == StellarX::buttonMode::NORMAL) // 普通按钮 NORMAL
{
click = true;
if (onClickCallback) onClickCallback();
// 刷新消息队列,避免重复处理
flushmessage(EX_MOUSE | EX_KEY);
}
else if (mode == StellarX::buttonMode::TOGGLE) // 切换状态 Toggle
{
click = !click;
if (click && onToggleOnCallback) onToggleOnCallback();
else if (!click && onToggleOffCallback) onToggleOffCallback();
flushmessage(EX_MOUSE | EX_KEY);
}
else if (mode == StellarX::buttonMode::DISABLED) // 禁用状态 Disabled
flushmessage(EX_MOUSE | EX_KEY);
}
if (hover != oldHover || click != oldClick)
dirty = true; // 标记按钮需要重绘
if (dirty)
draw();
// 处理鼠标点击事件
if (msg.message == WM_LBUTTONDOWN && hover && mode != StellarX::ButtonMode::DISABLED)
{
if (mode == StellarX::ButtonMode::NORMAL)
{
click = true;
dirty = true;
}
else if (mode == StellarX::ButtonMode::TOGGLE)
{
// TOGGLE模式在鼠标释放时处理
}
}
// 处理鼠标释放事件
else if (msg.message == WM_LBUTTONUP && hover && mode != StellarX::ButtonMode::DISABLED)
{
if (mode == StellarX::ButtonMode::NORMAL && click)
{
if (onClickCallback) onClickCallback();
click = false;
dirty = true;
// 使用新的flushmessage函数刷新消息队列:cite[2]:cite[3]
flushmessage(EX_MOUSE | EX_KEY);
}
else if (mode == StellarX::ButtonMode::TOGGLE)
{
click = !click;
if (click && onToggleOnCallback) onToggleOnCallback();
else if (!click && onToggleOffCallback) onToggleOffCallback();
dirty = true;
// 使用新的flushmessage函数刷新消息队列:cite[2]:cite[3]
flushmessage(EX_MOUSE | EX_KEY);
}
}
// 处理鼠标移出区域的情况
else if (msg.message == WM_MOUSEMOVE)
{
if (!hover && mode == StellarX::ButtonMode::NORMAL && click)
{
click = false;
dirty = true;
}
else if (hover != oldHover)
{
dirty = true;
}
}
if (StellarX::buttonMode::NORMAL == mode)
if (isClicked())
click = false;
// 如果状态发生变化,标记需要重绘
if (hover != oldHover || click != oldClick)
{
dirty = true;
}
// 如果需要重绘,立即执行
if (dirty)
{
draw();
}
}
void button::setOnClickListener(const std::function<void()>&& callback)
void Button::setOnClickListener(const std::function<void()>&& callback)
{
this->onClickCallback = callback;
}
void button::setOnToggleOnListener(const std::function<void()>&& callback)
void Button::setOnToggleOnListener(const std::function<void()>&& callback)
{
this->onToggleOnCallback = callback;
}
void button::setOnToggleOffListener(const std::function<void()>&& callback)
void Button::setOnToggleOffListener(const std::function<void()>&& callback)
{
this->onToggleOffCallback = callback;
}
void button::setbuttonMode(StellarX::buttonMode mode)
void Button::setbuttonMode(StellarX::ButtonMode mode)
{
//取值范围参考 buttMode的枚举注释
this->mode = mode;
}
int button::setROUND_RECTANGLEwidth(int width)
int Button::setROUND_RECTANGLEwidth(int width)
{
return ROUND_RECTANGLEwidth = width;
return rouRectangleSize.ROUND_RECTANGLEwidth = width;
}
int button::setROUND_RECTANGLEheight(int height)
int Button::setROUND_RECTANGLEheight(int height)
{
return ROUND_RECTANGLEheight = height;
return rouRectangleSize.ROUND_RECTANGLEheight = height;
}
bool button::isClicked() const
bool Button::isClicked() const
{
return this->click;
}
void button::setFillMode(int mode)
void Button::setFillMode(int mode)
{
buttonFillMode = mode;
}
void button::setFillIma(StellarX::fillStyle ima)
void Button::setFillIma(StellarX::FillStyle ima)
{
buttonFillIma = ima;
}
void button::setFillIma(std::string imaNAme)
void Button::setFillIma(std::string imaNAme)
{
buttonFileIMAGE = new IMAGE;
loadimage(buttonFileIMAGE, imaNAme.c_str(),width-x,height-y);
}
void button::setbuttonBorder(COLORREF Border)
void Button::setButtonBorder(COLORREF Border)
{
buttonBorderColor = Border;
}
void button::setbuttonText(const char* text)
void Button::setButtonText(const char* text)
{
this->text = std::string(text);
this->text_width = textwidth(LPCTSTR(this->text.c_str()));
this->text_height = textheight(LPCTSTR(this->text.c_str()));
}
void button::setbuttonText(std::string text)
void Button::setButtonText(std::string text)
{
this->text = text;
this->text_width = textwidth(LPCTSTR(this->text.c_str()));
@@ -258,64 +289,64 @@ void button::setbuttonText(std::string text)
this->dirty = true; // 标记需要重绘
}
void button::setbuttonShape(StellarX::controlShape shape)
void Button::setButtonShape(StellarX::ControlShape shape)
{
this->shape = shape;
}
std::string button::getbuttonText() const
std::string Button::getButtonText() const
{
return this->text;
}
const char* button::getbuttonText_c() const
const char* Button::getButtonText_c() const
{
return this->text.c_str();
}
StellarX::buttonMode button::getbuttonMode() const
StellarX::ButtonMode Button::getButtonMode() const
{
return this->mode;
}
StellarX::controlShape button::getbuttonShape() const
StellarX::ControlShape Button::getButtonShape() const
{
return this->shape;
}
int button::getFillMode() const
int Button::getFillMode() const
{
return this->buttonFillMode;
}
StellarX::fillStyle button::getFillIma() const
StellarX::FillStyle Button::getFillIma() const
{
return this->buttonFillIma;
}
IMAGE* button::getFillImaImage() const
IMAGE* Button::getFillImaImage() const
{
return this->buttonFileIMAGE;
}
COLORREF button::getbuttonBorder() const
COLORREF Button::getButtonBorder() const
{
return this->buttonBorderColor;
}
COLORREF button::getbuttonTxtColor() const
COLORREF Button::getButtonTextColor() const
{
return this->textStyle.color;
}
StellarX::controlText button::getbuttonTextStyle() const
StellarX::ControlText Button::getButtonTextStyle() const
{
return this->textStyle;
}
bool button::isMouseInCircle(int mouseX, int mouseY, int x, int y, int radius)
bool Button::isMouseInCircle(int mouseX, int mouseY, int x, int y, int radius)
{
double dis = sqrt(pow(mouseX - x, 2) + pow(mouseY - y, 2));
if (dis <= radius)
@@ -324,7 +355,7 @@ bool button::isMouseInCircle(int mouseX, int mouseY, int x, int y, int radius)
return false;
}
bool button::isMouseInEllipse(int mouseX, int mouseY, int x, int y, int width, int height)
bool Button::isMouseInEllipse(int mouseX, int mouseY, int x, int y, int width, int height)
{
int centerX = (x + width) / 2;
int centerY = (y + height) / 2;

View File

@@ -15,17 +15,17 @@ void Canvas::draw()
//根据画布形状绘制
switch (shape)
{
case StellarX::controlShape::RECTANGLE:
fillrectangle(x, y, width, height);//有边框填充矩形
case StellarX::ControlShape::RECTANGLE:
fillrectangle(x,y,x+width,y+height);//有边框填充矩形
break;
case StellarX::controlShape::B_RECTANGLE:
solidrectangle(x, y, width, height);//无边框填充矩形
case StellarX::ControlShape::B_RECTANGLE:
solidrectangle(x, y, x + width, y + height);//无边框填充矩形
break;
case StellarX::controlShape::ROUND_RECTANGLE:
fillroundrect(x, y, width, height, 20, 20);//有边框填充圆角矩形
case StellarX::ControlShape::ROUND_RECTANGLE:
fillroundrect(x, y, x + width, y + height, rouRectangleSize.ROUND_RECTANGLEwidth, rouRectangleSize.ROUND_RECTANGLEheight);//有边框填充圆角矩形
break;
case StellarX::controlShape::B_ROUND_RECTANGLE:
solidroundrect(x, y, width, height, 20, 20);//无边框填充圆角矩形
case StellarX::ControlShape::B_ROUND_RECTANGLE:
solidroundrect(x, y, x + width, y + height, rouRectangleSize.ROUND_RECTANGLEwidth, rouRectangleSize.ROUND_RECTANGLEheight);//无边框填充圆角矩形
break;
}
// 绘制所有子控件
@@ -48,26 +48,26 @@ void Canvas::addControl(std::unique_ptr<Control> control)
controls.push_back(std::move(control));
}
void Canvas::setShape(StellarX::controlShape shape)
void Canvas::setShape(StellarX::ControlShape shape)
{
switch (shape)
{
case StellarX::controlShape::RECTANGLE:
case StellarX::controlShape::B_RECTANGLE:
case StellarX::controlShape::ROUND_RECTANGLE:
case StellarX::controlShape::B_ROUND_RECTANGLE:
case StellarX::ControlShape::RECTANGLE:
case StellarX::ControlShape::B_RECTANGLE:
case StellarX::ControlShape::ROUND_RECTANGLE:
case StellarX::ControlShape::B_ROUND_RECTANGLE:
this->shape = shape;
break;
case StellarX::controlShape::CIRCLE:
case StellarX::controlShape::B_CIRCLE:
case StellarX::controlShape::ELLIPSE:
case StellarX::controlShape::B_ELLIPSE:
this->shape = StellarX::controlShape::RECTANGLE;
case StellarX::ControlShape::CIRCLE:
case StellarX::ControlShape::B_CIRCLE:
case StellarX::ControlShape::ELLIPSE:
case StellarX::ControlShape::B_ELLIPSE:
this->shape = StellarX::ControlShape::RECTANGLE;
break;
}
}
void Canvas::setcanvasfillMode(StellarX::fillMode mode)
void Canvas::setCanvasfillMode(StellarX::FillMode mode)
{
this->canvasFillMode = mode;
}
@@ -82,13 +82,13 @@ void Canvas::setCanvasBkColor(COLORREF color)
this->canvasBkClor = color;
}
void Canvas::setcanvasLineStyle(StellarX::lineStyle style)
void Canvas::setCanvasLineStyle(StellarX::LineStyle style)
{
this->canvasLineStyle = style;
}
void Canvas::setlinewidth(int width)
void Canvas::setLinewidth(int width)
{
this->canvaslinewidth = width;
}

View File

@@ -1,6 +1,6 @@
#include "Control.h"
StellarX::controlText& StellarX::controlText::operator=(const controlText& text)
StellarX::ControlText& StellarX::ControlText::operator=(const ControlText& text)
{
{
nHeight = text.nHeight;
@@ -17,7 +17,7 @@ StellarX::controlText& StellarX::controlText::operator=(const controlText& text)
}
}
bool StellarX::controlText::operator!=(const controlText& text)
bool StellarX::ControlText::operator!=(const ControlText& text)
{
if(nHeight != text.nHeight)
return true;

View File

@@ -1,6 +1,6 @@
#include "label.h"
#include "Label.h"
label::label()
Label::Label()
:Control(0, 0, 0, 0)
{
this->text = "默认标签";
@@ -8,7 +8,7 @@ label::label()
textBkColor = RGB(255, 255, 255);; //默认白色背景
}
label::label(int x, int y, std::string text, COLORREF textcolor, COLORREF bkColor)
Label::Label(int x, int y, std::string text, COLORREF textcolor, COLORREF bkColor)
:Control(x, y, 0, 0)
{
this->text = text;
@@ -16,7 +16,7 @@ label::label(int x, int y, std::string text, COLORREF textcolor, COLORREF bkColo
textBkColor = bkColor; //默认白色背景
}
void label::draw()
void Label::draw()
{
saveStyle();
if (textBkDisap)
@@ -34,22 +34,22 @@ void label::draw()
restoreStyle();
}
void label::setTxtdisap(bool key)
void Label::setTextdisap(bool key)
{
textBkDisap = key;
}
void label::setTxtColor(COLORREF color)
void Label::setTextColor(COLORREF color)
{
textColor = color;
}
void label::setTxtBkColor(COLORREF color)
void Label::setTextBkColor(COLORREF color)
{
textBkColor = color;
}
void label::setText(std::string text)
void Label::setText(std::string text)
{
this->text = text;
}

View File

@@ -1,7 +1,7 @@
#include "table.h"
#include "Table.h"
// 绘制表格的当前页
// 使用双循环绘制行和列,考虑分页偏移
void table::drawTable()
void Table::drawTable()
{
dX = x;
dY = uY;
@@ -24,7 +24,7 @@ void table::drawTable()
uY = y + lineHeights.at(0) + 10;
}
void table::drawHeader()
void Table::drawHeader()
{
uY = dY + lineHeights.at(0) + 10;
@@ -41,7 +41,7 @@ void table::drawHeader()
// 初始化文本宽度和高度计算
// 遍历所有数据和表头,计算每列的最大宽度和行高
// 此方法在数据变更时自动调用
void table::initTextWaH()
void Table::initTextWaH()
{
this->colWidths.resize(this->headers.size());
this->lineHeights.resize(this->headers.size());
@@ -91,15 +91,15 @@ void table::initTextWaH()
}
}
void table::initButton()
void Table::initButton()
{
int x1, x2;
int y1, y2;
x1 = pX - 70;
x2 = pX + textwidth(LPCTSTR(pageNumtext.c_str())) + 10;
y1 = y2 = pY;
this->prevButton = new button(x1, y1, 60, textheight(LPCTSTR(pageNumtext.c_str())), "上一页", RGB(0, 0, 0), RGB(255, 255, 255));
this->nextButton = new button(x2, y2, 60, textheight(LPCTSTR(pageNumtext.c_str())), "下一页", RGB(0, 0, 0), RGB(255, 255, 255));
this->prevButton = new Button(x1, y1, 60, textheight(LPCTSTR(pageNumtext.c_str())), "上一页", RGB(0, 0, 0), RGB(255, 255, 255));
this->nextButton = new Button(x2, y2, 60, textheight(LPCTSTR(pageNumtext.c_str())), "下一页", RGB(0, 0, 0), RGB(255, 255, 255));
prevButton->setOnClickListener([this]()
{if (this->currentPage > 1)
{
@@ -117,7 +117,7 @@ void table::initButton()
}});
}
void table::initPageNum()
void Table::initPageNum()
{
if (0 == pY)
pY = uY + lineHeights.at(0) * rowsPerPage + rowsPerPage * 10+10;
@@ -126,12 +126,12 @@ void table::initPageNum()
this->pX -= textwidth(LPCTSTR(pageNumtext.c_str()));
this->pX /= 2;
this->pX += x;
this->pageNum = new label(this->pX, pY, pageNumtext);
//pageNum->setTxtdisap(true);
this->pageNum = new Label(this->pX, pY, pageNumtext);
//pageNum->setTextdisap(true);
pageNum->textStyle = this->textStyle;
}
void table::drawPageNum()
void Table::drawPageNum()
{
if (nullptr == pageNum)
initPageNum();
@@ -144,7 +144,7 @@ void table::drawPageNum()
}
void table::drawButton()
void Table::drawButton()
{
if (nullptr == prevButton || nullptr == nextButton)
initButton();
@@ -153,13 +153,13 @@ void table::drawButton()
}
table::table(int x, int y)
Table::Table(int x, int y)
:Control(x, y, 0,0)
{
//this->saveBkImage = new IMAGE(this->width,this->height);
}
table::~table()
Table::~Table()
{
if (this->prevButton)
delete this->prevButton;
@@ -175,7 +175,7 @@ table::~table()
this->saveBkImage = nullptr;
}
void table::draw()
void Table::draw()
{
if (this->dirty)
{
@@ -260,7 +260,7 @@ void table::draw()
}
}
void table::handleEvent(const ExMessage& msg)
void Table::handleEvent(const ExMessage& msg)
{
if(!this->isShowPageButton)
return;
@@ -271,7 +271,7 @@ void table::handleEvent(const ExMessage& msg)
}
}
void table::setHeaders(std::initializer_list<std::string> headers)
void Table::setHeaders(std::initializer_list<std::string> headers)
{
this->headers.clear();
for (auto lis : headers)
@@ -281,7 +281,7 @@ void table::setHeaders(std::initializer_list<std::string> headers)
dirty = true;
}
void table::setData(const std::vector<std::string>& data)
void Table::setData(const std::vector<std::string>& data)
{
this->data.push_back(data);
totalPages = (this->data.size() + rowsPerPage - 1) / rowsPerPage;
@@ -291,7 +291,7 @@ void table::setData(const std::vector<std::string>& data)
dirty = true;
}
void table::setData(const std::initializer_list<std::vector<std::string>>& data)
void Table::setData(const std::initializer_list<std::vector<std::string>>& data)
{
for (auto lis : data)
this->data.push_back(lis);
@@ -302,7 +302,7 @@ void table::setData(const std::initializer_list<std::vector<std::string>>& data)
dirty = true;
}
void table::setRowsPerPage(int rows)
void Table::setRowsPerPage(int rows)
{
this->rowsPerPage = rows;
totalPages = (data.size() + rowsPerPage - 1) / rowsPerPage;
@@ -312,90 +312,90 @@ void table::setRowsPerPage(int rows)
dirty = true;
}
void table::showPageButton(bool isShow)
void Table::showPageButton(bool isShow)
{
this->isShowPageButton = isShow;
}
void table::settableBorder(COLORREF color)
void Table::setTableBorder(COLORREF color)
{
this->tableBorderClor = color;
}
void table::settableBk(COLORREF color)
void Table::setTableBk(COLORREF color)
{
this->tableBkClor = color;
}
void table::settableFillMode(StellarX::fillMode mode)
void Table::setTableFillMode(StellarX::FillMode mode)
{
if (StellarX::fillMode::Solid == mode || StellarX::fillMode::Null == mode)
if (StellarX::FillMode::Solid == mode || StellarX::FillMode::Null == mode)
this->tableFillMode = mode;
else
this->tableFillMode = StellarX::fillMode::Solid;
this->tableFillMode = StellarX::FillMode::Solid;
}
void table::settableLineStyle(StellarX::lineStyle style)
void Table::setTableLineStyle(StellarX::LineStyle style)
{
this->tableLineStyle = style;
}
void table::settableBorderWidth(int width)
void Table::setTableBorderWidth(int width)
{
this->tableBorderWidth = width;
}
int table::getCurrentPage() const
int Table::getCurrentPage() const
{
return this->currentPage;
}
int table::getTotalPages() const
int Table::getTotalPages() const
{
return this->totalPages;;
}
int table::getRowsPerPage() const
int Table::getRowsPerPage() const
{
return this->rowsPerPage;
}
bool table::getShowPageButton() const
bool Table::getShowPageButton() const
{
return this->isShowPageButton;
}
COLORREF table::gettableBorder() const
COLORREF Table::getTableBorder() const
{
return this->tableBorderClor;
}
COLORREF table::gettableBk() const
COLORREF Table::getTableBk() const
{
return this->tableBkClor;
}
StellarX::fillMode table::gettableFillMode() const
StellarX::FillMode Table::getTableFillMode() const
{
return this->tableFillMode;
}
StellarX::lineStyle table::gettableLineStyle() const
StellarX::LineStyle Table::getTableLineStyle() const
{
return this->tableLineStyle;
}
std::vector<std::string> table::getHeaders() const
std::vector<std::string> Table::getHeaders() const
{
return this->headers;
}
std::vector<std::vector<std::string>> table::getData() const
std::vector<std::vector<std::string>> Table::getData() const
{
return this->data;
}
int table::gettableBorderWidth() const
int Table::getTableBorderWidth() const
{
return this->tableBorderWidth;
}

View File

@@ -1,22 +1,22 @@
// TxtBox.cpp
#include "textBox.h"
// TextBox.cpp
#include "TextBox.h"
textBox::textBox(int x, int y, int width, int height, std::string text, StellarX::textBoxmode mode, StellarX::controlShape shape)
TextBox::TextBox(int x, int y, int width, int height, std::string text, StellarX::TextBoxmode mode, StellarX::ControlShape shape)
:Control(x,y,width,height),text(text), mode(mode), shape(shape)
{
}
void textBox::draw()
void TextBox::draw()
{
if(dirty)
{
saveStyle();
setfillcolor(textBoxBkClor);
setlinecolor(textBoxBorderClor);
if (textStyle.nHeight > height - y)
if (textStyle.nHeight > height)
textStyle.nHeight = height;
if (textStyle.nWidth > width - x)
if (textStyle.nWidth > width)
textStyle.nWidth = width;
settextstyle(textStyle.nHeight, textStyle.nWidth, textStyle.lpszFace,
textStyle.nEscapement, textStyle.nOrientation, textStyle.nWeight,
@@ -31,21 +31,21 @@ void textBox::draw()
//根据形状绘制
switch (shape)
{
case StellarX::controlShape::RECTANGLE:
fillrectangle(x, y, width, height);//有边框填充矩形
outtextxy(x + 10, (y + (height - y - text_height) / 2), LPCTSTR(text.c_str()));
case StellarX::ControlShape::RECTANGLE:
fillrectangle(x,y,x+width,y+height);//有边框填充矩形
outtextxy(x + 10, (y + (height - text_height) / 2), LPCTSTR(text.c_str()));
break;
case StellarX::controlShape::B_RECTANGLE:
solidrectangle(x, y, width, height);//无边框填充矩形
outtextxy(x + 10, (y + (height - y - text_height) / 2), LPCTSTR(text.c_str()));
case StellarX::ControlShape::B_RECTANGLE:
solidrectangle(x, y, x + width, y + height);//无边框填充矩形
outtextxy(x + 10, (y + (height - text_height) / 2), LPCTSTR(text.c_str()));
break;
case StellarX::controlShape::ROUND_RECTANGLE:
fillroundrect(x, y, width, height, 20, 20);//有边框填充圆角矩形
outtextxy(x + 10, (y + (height - y - text_height) / 2), LPCTSTR(text.c_str()));
case StellarX::ControlShape::ROUND_RECTANGLE:
fillroundrect(x, y, x + width, y + height, rouRectangleSize.ROUND_RECTANGLEwidth, rouRectangleSize.ROUND_RECTANGLEheight);//有边框填充圆角矩形
outtextxy(x + 10, (y + (height - text_height) / 2), LPCTSTR(text.c_str()));
break;
case StellarX::controlShape::B_ROUND_RECTANGLE:
solidroundrect(x, y, width, height, 20, 20);//无边框填充圆角矩形
outtextxy(x + 10, (y + (height - y - text_height) / 2), LPCTSTR(text.c_str()));
case StellarX::ControlShape::B_ROUND_RECTANGLE:
solidroundrect(x, y, x + width, y + height, rouRectangleSize.ROUND_RECTANGLEwidth, rouRectangleSize.ROUND_RECTANGLEheight);//无边框填充圆角矩形
outtextxy(x + 10, (y + (height - text_height) / 2), LPCTSTR(text.c_str()));
break;
}
@@ -54,26 +54,26 @@ void textBox::draw()
dirty = false; //标记不需要重绘
}
void textBox::handleEvent(const ExMessage& msg)
void TextBox::handleEvent(const ExMessage& msg)
{
bool hover = false;
bool oldClick = click;
switch (shape)
{
case StellarX::controlShape::RECTANGLE:
case StellarX::controlShape::B_RECTANGLE:
case StellarX::controlShape::ROUND_RECTANGLE:
case StellarX::controlShape::B_ROUND_RECTANGLE:
hover = (msg.x > x && msg.x < width && msg.y > y && msg.y < height);//判断鼠标是否在矩形按钮内
case StellarX::ControlShape::RECTANGLE:
case StellarX::ControlShape::B_RECTANGLE:
case StellarX::ControlShape::ROUND_RECTANGLE:
case StellarX::ControlShape::B_ROUND_RECTANGLE:
hover = (msg.x > x && msg.x < (x + width) && msg.y > y && msg.y < (y + height));//判断鼠标是否在矩形按钮内
break;
}
if (hover && msg.message == WM_LBUTTONUP)
{
click = true;
if(StellarX::textBoxmode::INPUT_MODE == mode)
if(StellarX::TextBoxmode::INPUT_MODE == mode)
dirty = InputBox(LPTSTR(text.c_str()), maxCharLen,"输入框",NULL,text.c_str(), NULL ,NULL,false);
else if (StellarX::textBoxmode::READONLY_MODE == mode)
else if (StellarX::TextBoxmode::READONLY_MODE == mode)
{
dirty = false;
InputBox(NULL, maxCharLen, "输出框(输入无效!)", NULL, text.c_str(), NULL, NULL, false);
@@ -87,47 +87,47 @@ void textBox::handleEvent(const ExMessage& msg)
click = false;
}
void textBox::setMode(StellarX::textBoxmode mode)
void TextBox::setMode(StellarX::TextBoxmode mode)
{
this->mode = mode;
}
void textBox::setmaxCharLen(int len)
void TextBox::setMaxCharLen(int len)
{
if (len > 0)
maxCharLen = len;
}
void textBox::settextBoxshape(StellarX::controlShape shape)
void TextBox::setTextBoxshape(StellarX::ControlShape shape)
{
switch (shape)
{
case StellarX::controlShape::RECTANGLE:
case StellarX::controlShape::B_RECTANGLE:
case StellarX::controlShape::ROUND_RECTANGLE:
case StellarX::controlShape::B_ROUND_RECTANGLE:
case StellarX::ControlShape::RECTANGLE:
case StellarX::ControlShape::B_RECTANGLE:
case StellarX::ControlShape::ROUND_RECTANGLE:
case StellarX::ControlShape::B_ROUND_RECTANGLE:
this->shape = shape;
break;
case StellarX::controlShape::CIRCLE:
case StellarX::controlShape::B_CIRCLE:
case StellarX::controlShape::ELLIPSE:
case StellarX::controlShape::B_ELLIPSE:
this->shape = StellarX::controlShape::RECTANGLE;
case StellarX::ControlShape::CIRCLE:
case StellarX::ControlShape::B_CIRCLE:
case StellarX::ControlShape::ELLIPSE:
case StellarX::ControlShape::B_ELLIPSE:
this->shape = StellarX::ControlShape::RECTANGLE;
break;
}
}
void textBox::settextBoxBorder(COLORREF color)
void TextBox::setTextBoxBorder(COLORREF color)
{
textBoxBorderClor = color;
}
void textBox::settextBoxBk(COLORREF color)
void TextBox::setTextBoxBk(COLORREF color)
{
textBoxBkClor = color;
}
std::string textBox::gettext()
std::string TextBox::getText() const
{
return this->text;
}

View File

@@ -1,13 +1,13 @@
#include "window.h"
#include "Window.h"
window::window(int width, int height, int mode)
Window::Window(int width, int height, int mode)
{
this->width = width;
this->height = height;
this->windowMode = mode;
}
window::window(int width, int height, int mode, COLORREF bkcloc)
Window::Window(int width, int height, int mode, COLORREF bkcloc)
{
this->width = width;
this->height = height;
@@ -15,7 +15,7 @@ window::window(int width, int height, int mode, COLORREF bkcloc)
this->wBkcolor = bkcloc;
}
window::window(int width, int height, int mode, COLORREF bkcloc, std::string headline)
Window::Window(int width, int height, int mode, COLORREF bkcloc, std::string headline)
{
this->width = width;
this->height = height;
@@ -24,7 +24,7 @@ window::window(int width, int height, int mode, COLORREF bkcloc, std::string hea
this->headline = headline;
}
window::~window()
Window::~Window()
{
if (background)
delete background;
@@ -32,7 +32,7 @@ window::~window()
closegraph(); // 确保关闭图形上下文
}
void window::draw()
void Window::draw()
{
hWnd = initgraph(width, height, windowMode);
SetWindowText(hWnd,headline.c_str());
@@ -47,9 +47,9 @@ void window::draw()
// 使用背景图片绘制窗口
// @参数 pImgFile: 图片文件路径,支持常见图片格式
// @备注: 会拉伸图片以适应窗口尺寸
void window::draw(std::string pImgFile)
void Window::draw(std::string pImgFile)
{
this->background = new IMAGE;
this->background = new IMAGE(width, height);
hWnd = initgraph(width, height, windowMode);
SetWindowText(hWnd, headline.c_str());
loadimage(background, pImgFile.c_str(), width, height, true);
@@ -64,7 +64,7 @@ void window::draw(std::string pImgFile)
}
// 运行主事件循环,处理用户输入和窗口消息
// 此方法会阻塞直到窗口关闭
void window::runEventLoop()
void Window::runEventLoop()
{
ExMessage msg;
bool running = true;
@@ -81,7 +81,7 @@ void window::runEventLoop()
}
}
void window::setBkImage(std::string pImgFile)
void Window::setBkImage(std::string pImgFile)
{
if(nullptr == background)
this->background = new IMAGE;
@@ -92,18 +92,18 @@ void window::setBkImage(std::string pImgFile)
putimage(0, 0, background);
}
void window::setBkcolor(COLORREF c)
void Window::setBkcolor(COLORREF c)
{
wBkcolor = c;
}
void window::setHeadline(std::string headline)
void Window::setHeadline(std::string headline)
{
this->headline = headline;
SetWindowText(this->hWnd, headline.c_str());
}
void window::addControl(std::unique_ptr<Control> control)
void Window::addControl(std::unique_ptr<Control> control)
{
this->controls.push_back(std::move(control));
}