feat: add a new awesome feature

This commit is contained in:
Ysm-04
2025-09-22 15:08:49 +08:00
parent bd4588731b
commit 9f2b175b17
25 changed files with 1962 additions and 616 deletions

View File

@@ -1,14 +1,22 @@
/*******************************************************************************
* @文件: Button.h
* @摘要: 按钮控件
* @描述:
* 提供多种样式和行为的按钮控件,支持点击、悬停、切换等状态。
* 继承自Control基类是框架的核心交互组件之一
*
* @所属框架: 星垣(StellarX) GUI框架
* @作者: 我在人间做废物
* @日期: September 2025
******************************************************************************/
/*******************************************************************************
* @: Button
* @摘要: 多功能按钮控件,支持多种状态和样式
* @描述:
* 提供完整的按钮功能,包括普通点击、切换模式、禁用状态。
* 支持多种形状(矩形、圆形、椭圆等)和丰富的视觉样式
* 通过回调函数机制实现灵活的交互逻辑。
*
* @特性:
* - 支持三种工作模式:普通、切换、禁用
* - 八种几何形状,各有边框和无边框版本
* - 自定义颜色(默认、悬停、点击状态)
* - 多种填充模式(纯色、图案、图像)
* - 完整的鼠标事件处理(点击、悬停、移出)
*
* @使用场景: 作为主要交互控件,用于触发动作或表示状态
* @所属框架: 星垣(StellarX) GUI框架
* @作者: 我在人间做废物
******************************************************************************/
#pragma once
#include "Control.h"
@@ -18,7 +26,6 @@ class Button : public Control
std::string text; // 按钮上的文字
bool click; // 是否被点击
bool hover; // 是否被悬停
bool dirty = true; // 是否重绘
COLORREF buttonTrueColor; // 按钮被点击后的颜色
COLORREF buttonFalseColor; // 按钮未被点击的颜色
@@ -28,7 +35,7 @@ class Button : public Control
StellarX::ButtonMode mode; // 按钮模式
StellarX::ControlShape shape; // 按钮形状
int buttonFillMode = BS_SOLID; //按钮填充模式
StellarX::FillMode buttonFillMode = StellarX::FillMode::Solid; //按钮填充模式
StellarX::FillStyle buttonFillIma = StellarX::FillStyle::BDiagonal; //按钮填充图案
IMAGE* buttonFileIMAGE = nullptr; //按钮填充图像
@@ -47,12 +54,9 @@ public:
StellarX::ControlText textStyle; // 按钮文字样式
public:
/*************************************************************************/
/********************************构造函数*********************************/
/*************************************************************************/
//默认按钮颜色
Button(int x, int y, int width, int height, const std::string text,
Button(int x, int y, int width, int height, const std::string text,
StellarX::ButtonMode mode = StellarX::ButtonMode::NORMAL, StellarX::ControlShape shape = StellarX::ControlShape::RECTANGLE);
//自定义按钮未被点击和被点击颜色
Button(int x, int y, int width, int height, const std::string text,
@@ -65,24 +69,13 @@ public:
//析构函数 释放图形指针内存
~Button();
/*************************************************************************/
/********************************Set方法**********************************/
/*************************************************************************/
//绘制按钮
void draw() override;
//按钮事件处理
void handleEvent(const ExMessage& msg) override;
bool handleEvent(const ExMessage& msg) override;
//设置回调函数
//************************************
// 名称: setOnClickListener | setOnToggleOnListener | setOnToggleOffListener
// 全名: Button::setOnClickListener
// 访问: public
// 返回类型: void
// Parameter: const std::function<> & & callback 设置回调函数 传入回调函数名即可,不需要传入(),不需要传入参数,不需要传入返回值
// 如果要传入参数可以使用lambda表达式
//************************************
void setOnClickListener(const std::function<void()>&& callback);
//设置TOGGLE模式下被点击的回调函数
void setOnToggleOnListener(const std::function<void()>&& callback);
@@ -91,17 +84,19 @@ public:
//设置按钮模式
void setbuttonMode(StellarX::ButtonMode mode);
//设置圆角矩形椭圆宽度
int setROUND_RECTANGLEwidth(int width);
void setROUND_RECTANGLEwidth(int width);
//设置圆角矩形椭圆高度
int setROUND_RECTANGLEheight(int height);
void setROUND_RECTANGLEheight(int height);
//设置按钮填充模式
void setFillMode(int mode);
void setFillMode(StellarX::FillMode mode);
//设置按钮填充图案
void setFillIma(StellarX::FillStyle ima);
//设置按钮填充图像
void setFillIma(std::string imaName);
//设置按钮边框颜色
void setButtonBorder(COLORREF Border);
//设置按钮未被点击颜色
void setButtonFalseColor(COLORREF color);
//设置按钮文本
void setButtonText(const char* text);
void setButtonText(std::string text);
@@ -110,10 +105,6 @@ public:
//判断按钮是否被点击
bool isClicked() const;
/*************************************************************************/
/********************************Get方法**********************************/
/*************************************************************************/
//获取按钮文字
std::string getButtonText() const;
@@ -123,7 +114,7 @@ public:
//获取按钮形状
StellarX::ControlShape getButtonShape() const;
//获取按钮填充模式
int getFillMode() const;
StellarX::FillMode getFillMode() const;
//获取按钮填充图案
StellarX::FillStyle getFillIma() const;
//获取按钮填充图像
@@ -134,6 +125,14 @@ public:
COLORREF getButtonTextColor() const;
//获取按钮文字样式
StellarX::ControlText getButtonTextStyle() const;
//获取按钮宽度
int getButtonWidth() const;
//获取按钮高度
int getButtonHeight() const;
//获取按钮横坐标
int getButtonX() const;
//获取按钮纵坐标
int getButtonY() const;
private:
//初始化按钮
@@ -141,6 +140,11 @@ private:
//判断鼠标是否在圆形按钮内
bool isMouseInCircle(int mouseX, int mouseY, int x, int y, int radius);
//判断鼠标是否在椭圆按钮内
bool isMouseInEllipse(int mouseX, int mouseY, int x, int y, int width, int height);
bool isMouseInEllipse(int mouseX, int mouseY, int x, int y, int width, int height);
//检查是否对话框是否可见
bool IsVisible() const override { return false; }
//获取对话框类型
bool model() const override { return false; }
};

View File

@@ -1,15 +1,27 @@
#pragma once
/*******************************************************************************
* @类: Canvas
* @摘要: 画布容器控件,用于分组和管理子控件
* @描述:
* 作为其他控件的父容器,提供统一的背景和边框样式。
* 负责将事件传递给子控件并管理它们的绘制顺序。
*
* @特性:
* - 支持四种矩形形状(普通、圆角,各有边框和无边框版本)
* - 可自定义填充模式、边框颜色和背景颜色
* - 自动管理子控件的生命周期和事件传递
* - 支持嵌套容器结构
*
* @使用场景: 用于分组相关控件、实现复杂布局或作为对话框基础
* @所属框架: 星垣(StellarX) GUI框架
* @作者: 我在人间做废物
******************************************************************************/
#pragma once
#include "Control.h"
// 画布容器控件,可以作为其他控件的父容器
// 功能:
// - 包含和管理子控件
// - 将事件传递给子控件
// - 提供统一的背景和边框
// 使用场景: 用于分组相关控件或实现复杂布局
class Canvas : public Control
{
private:
protected:
std::vector<std::unique_ptr<Control>> controls;
StellarX::ControlShape shape = StellarX::ControlShape::RECTANGLE; //容器形状
@@ -21,12 +33,20 @@ private:
COLORREF canvasBorderClor = RGB(0, 0, 0);//边框颜色
COLORREF canvasBkClor = RGB(255,255,255); //背景颜色
void clearAllControls(); // 清除所有子控件
//检查是否对话框是否可见
bool IsVisible() const override { return false; }
//获取对话框类型
bool model() const override { return false; }
public:
Canvas();
Canvas(int x, int y, int width, int height);
~Canvas() {}
//绘制容器及其子控件
void draw() override;
void handleEvent(const ExMessage& msg) override;
bool handleEvent(const ExMessage& msg) override;
//添加控件
void addControl(std::unique_ptr<Control> control);

View File

@@ -1,19 +1,28 @@
#pragma once
/*********************************************************************
* \文件: Control.h
* \描述 控件基类,所有控件都继承自此类。
* 提供控件的一些基本属性和方法。
/*******************************************************************************
* @类: Control
* @摘要: 所有控件的抽象基类,定义通用接口和基础功能
* @描述:
* 提供控件的基本属性和方法,包括位置、尺寸、重绘标记等
* 实现绘图状态保存和恢复机制,确保控件绘制不影响全局状态。
*
* \作者: 我在人间做废物
* \日期: September 2025
*********************************************************************/
* @特性:
* - 定义控件基本属性(坐标、尺寸、脏标记)
* - 提供绘图状态管理saveStyle/restoreStyle
* - 声明纯虚接口draw、handleEvent等
* - 支持移动语义,禁止拷贝语义
*
* @使用场景: 作为所有具体控件类的基类,不直接实例化
* @所属框架: 星垣(StellarX) GUI框架
* @作者: 我在人间做废物
******************************************************************************/
#pragma once
#include <vector>
#include <memory>
#include <easyx.h>
#undef MessageBox
#include <iostream>
#include <string>
#include <functional>
#include <initializer_list>
#include "CoreTypes.h"
class Control
@@ -21,14 +30,15 @@ class Control
protected:
int x, y; // 左上角坐标
int width, height; // 控件尺寸
bool dirty = true; // 是否重绘
StellarX::RouRectangle rouRectangleSize; // 圆角矩形椭圆宽度和高度
LOGFONT currentFont; // 保存当前字体样式和颜色
COLORREF currentColor = 0;
COLORREF currentBkColor = 0; // 保存当前填充色
COLORREF currentBorderColor = 0; // 边框颜色
LINESTYLE* currentLineStyle = new LINESTYLE; // 保存当前线型
LOGFONT* currentFont = new LOGFONT(); // 保存当前字体样式和颜色
COLORREF* currentColor = new COLORREF();
COLORREF* currentBkColor = new COLORREF(); // 保存当前填充色
COLORREF* currentBorderColor = new COLORREF(); // 边框颜色
LINESTYLE* currentLineStyle = new LINESTYLE(); // 保存当前线型
public:
Control(const Control&) = delete;
@@ -42,10 +52,21 @@ public:
}
virtual ~Control() {
delete currentFont;
delete currentColor;
delete currentBkColor;
delete currentBorderColor;
delete currentLineStyle;
currentLineStyle = nullptr;
}
currentFont = nullptr;
currentColor = nullptr;
currentBkColor = nullptr;
currentBorderColor = nullptr;
currentLineStyle = nullptr;
}
protected:
// 获取位置和尺寸
int getX() const { return x; }
int getY() const { return y; }
@@ -53,9 +74,15 @@ public:
int getHeight() const { return height; }
int getRight() const { return x + width; }
int getBottom() const { return y + height; }
public:
//设置是否重绘
void setDirty(bool dirty) { this->dirty = dirty; }
virtual void draw() = 0;
virtual void handleEvent(const ExMessage& msg) = 0;
virtual bool handleEvent(const ExMessage& msg) = 0;//返回true代表事件已消费
//用来检查非模态对话框是否可见,其他控件不用实现
virtual bool IsVisible() const = 0;
//用来检查对话框是否模态,其他控件不用实现
virtual bool model()const = 0;
protected:
void saveStyle();

View File

@@ -1,7 +1,6 @@
#pragma once
/*******************************************************************************
/*******************************************************************************
* @文件: CoreTypes.h
* @摘要: 星垣框架核心类型定义文件
* @摘要: 星垣(StellarX)框架核心类型定义文件
* @描述:
* 集中定义框架中使用的所有枚举类型和结构体,确保类型一致性。
* 这是框架的类型系统基础,所有控件都依赖于此文件中定义的类型。
@@ -9,43 +8,59 @@
* @作者: 我在人间做废物
* @日期: September 2025
******************************************************************************/
#include"easyX.h"
#pragma once
#include "easyx.h"
/**
* @命名空间: StellarX
*
* @详细说明:
* 集中定义框架中使用的所有枚举类型和结构体,确保类型一致性。
* 这是框架的类型系统基础,所有控件都依赖于此文件中定义的类型
*
* @使用示例:
* StellarX::FillStyle::Horizontal - 填充样式
*
* @备注:
* 不用单独包含此头文件已在StellarX.h中包含包含唯一对外头文件即可
*/
namespace StellarX
{
/**
* @枚举类名称: hatchStyle
* @功能描述: 用来定义控件填充图案的枚举类
*
* @详细说明:
* 根据此枚举类可以自定义控件填充图案
* 可以在控件初始化时设置填充图案
* 根据具体情况选择不同的填充图案
* 默认填充图案为水平线
*
* @取值说明:
* Horizontal - 水平线
* Vertical - 垂直线
* FDiagonal - 反斜线
* BDiagonal - 正斜线
* Cross - 十字
* DiagCross - 网格
*
* @使用示例:
* // 示例代码展示如何使用此枚举类
* hatchStyle var = hatchStyle::Horizontal;
*
* @备注:
* 此枚举类仅支持图案填充模式
* 枚举类在使用时,需要使用::进行调用,还要注意大小写
*/
enum class FillStyle {
* @枚举类名称: FillStyle
* @功能描述: 用来定义控件填充图案的枚举类
*
* @详细说明:
* 根据此枚举类可以自定义控件填充图案
* 可以在控件初始化时设置填充图案
* 根据具体情况选择不同的填充图案
* 默认填充图案为水平线
*
* @取值说明:
* Horizontal - 水平线
* Vertical - 垂直线
* FDiagonal - 反斜线
* BDiagonal - 正斜线
* Cross - 十字
* DiagCross - 网格
*
* @使用示例:
* FillStyle var = FillStyle::Horizontal;
*
* @备注:
* 此枚举类仅支持图案填充模式
*/
enum class FillStyle
{
Horizontal = HS_HORIZONTAL, // 水平线
Vertical = HS_VERTICAL, // 垂直线
Vertical = HS_VERTICAL, // 垂直线
FDiagonal = HS_FDIAGONAL, // 反斜线
BDiagonal = HS_BDIAGONAL, // 正斜线
Cross = HS_CROSS, // 十字
Cross = HS_CROSS, // 十字
DiagCross = HS_DIAGCROSS // 网格
};
/**
* @枚举类名称: FillMode
* @功能描述: 用来定义控件填充模式的枚举类
@@ -64,22 +79,19 @@ namespace StellarX
* DibPattern - 自定义图像填充
*
* @使用示例:
* // 示例代码展示如何使用此枚举类
* FillMode var = FillMode::Solid;
*
* @备注:
* 枚举类在使用时,需要使用::进行调用,还要注意大小写
*/
enum class FillMode
{
Solid = BS_SOLID, //固实填充
Null = BS_NULL, // 不填充
Hatched = BS_HATCHED, // 图案填充
Pattern = BS_PATTERN, // 自定义图案填充
Null = BS_NULL, // 不填充
Hatched = BS_HATCHED, // 图案填充
Pattern = BS_PATTERN, // 自定义图案填充
DibPattern = BS_DIBPATTERN // 自定义图像填充
};
/**
* @枚举类名称: linStyle
* @枚举类名称: LineStyle
* @功能描述: 此枚举类用来定义控件边框线型
*
* @详细说明:
@@ -97,13 +109,10 @@ namespace StellarX
* Null // 无线
*
* @使用示例:
* // 示例代码展示如何使用此枚举类
* LineStyle var = LineStyle::Solid;
*
* @备注:
* 枚举类在使用时,需要使用::进行调用,还要注意大小写
*/
enum class LineStyle {
enum class LineStyle
{
Solid = PS_SOLID, // 实线
Dash = PS_DASH, // 虚线
Dot = PS_DOT, // 点线
@@ -130,15 +139,12 @@ namespace StellarX
* bool bItalic = false; - 是否斜体
* bool bUnderline = false; - 是否下划线
* bool bStrikeOut = false; - 是否删除线
* bool operator!=(const ControlText& text);
* ControlText& operator=(const ControlText& text
*/
struct ControlText
{
int nHeight = 0; //- 字体高度
int nWidth = 0; //- 字体宽度 如果为0则自适应
LPCTSTR lpszFace = "宋体"; //- 字体名称
LPCTSTR lpszFace = "微软雅黑"; //- 字体名称
COLORREF color = RGB(0, 0, 0); //- 字体颜色
int nEscapement = 0; //- 字符串旋转角度
int nOrientation = 0; //- 字符旋转角度
@@ -149,7 +155,6 @@ namespace StellarX
bool operator!=(const ControlText& text);
ControlText& operator=(const ControlText& text);
};
/**
@@ -163,18 +168,15 @@ namespace StellarX
* @取值说明:
* RECTANGLE = 1, //有边框矩形
* B_RECTANGLE, //无边框矩形
* ROUND_RECTANGLE, //有边框圆角矩形
* B_ROUND_RECTANGLE, //无边框圆角矩形
* CIRCLE, //有边框圆形
* B_CIRCLE, //无边框圆形
* ELLIPSE, //有边框椭圆
* B_ELLIPSE //无边框椭圆
*
* @使用示例:
* ControlShape shape = ELLIPSE;
* ControlShape shape = ControlShape::ELLIPSE;
*
* @备注:
* 按钮类支持所有形状,部分控件只支持部分形状,具体请参考控件类。
@@ -183,66 +185,91 @@ namespace StellarX
{
RECTANGLE = 1, //有边框矩形
B_RECTANGLE, //无边框矩形
ROUND_RECTANGLE, //有边框圆角矩形
B_ROUND_RECTANGLE, //无边框圆角矩形
CIRCLE, //有边框圆形
B_CIRCLE, //无边框圆形
ELLIPSE, //有边框椭圆
B_ELLIPSE //无边框椭圆
};
/**
* @枚举类名称: TextBoxmode
* @功能描述: 定义了文本框的两种模式
*
* @详细说明:
* 需要限制文本框是否接受用户输入时使用
*
* @取值说明:
* INPUT_MODE, // 用户可输入模式
* READONLY_MODE // 只读模式
*
* @使用示例:
* // 示例代码展示如何使用此枚举类
* StellarX::TextBoxmode var = EnumClassName::VALUE1;
*
* @备注:
* 枚举类的特性、与普通枚举的区别
*/
enum class TextBoxmode
{
INPUT_MODE, // 用户可输入模式
READONLY_MODE // 只读模式
};
/**
* @枚举名称: ButtonMode
* @功能描述: brief
*
* @详细说明:
* 根据按钮的工作模式,按钮可以有不同的行为。
* 用户可以在具体情况下设置按钮的工作模式。
*
* @取值说明:
* NORMAL = 1, - 普通模式,点击后触发回调,但不会保持状态。
* TOGGLE, - 切换模式,点击后会在选中和未选中之间切换,触发不同的回调函数。
* DISABLED - 禁用模式,按钮不可点击,显示为灰色,文本显示删除线。
*
* @使用示例:
* Button b1(100, 100, 120, 120, "测试按钮", RGB(128, 0, 0), RGB(255, 9, 9));
*
*/
* @枚举名称: TextBoxmode
* @功能描述: 定义了文本框的两种模式
*
* @详细说明:
* 需要限制文本框是否接受用户输入时使用
*
* @取值说明:
* INPUT_MODE, // 用户可输入模式
* READONLY_MODE // 只读模式
*/
enum class TextBoxmode
{
INPUT_MODE, // 用户可输入模式
READONLY_MODE // 只读模式
};
/**
* @枚举名称: ButtonMode
* @功能描述: 定义按钮的工作模式
*
* @详细说明:
* 根据按钮的工作模式,按钮可以有不同的行为。
* 用户可以在具体情况下设置按钮的工作模式。
*
* @取值说明:
* NORMAL = 1, - 普通模式,点击后触发回调,但不会保持状态。
* TOGGLE, - 切换模式,点击后会在选中和未选中之间切换,触发不同的回调函数。
* DISABLED - 禁用模式,按钮不可点击,显示为灰色,文本显示删除线。
*
* @使用示例:
* ButtonMode mode = ButtonMode::NORMAL;
*/
enum class ButtonMode
{
NORMAL = 1, //普通模式,点击后触发回调,但不会保持状态。
TOGGLE, //切换模式,点击后会在选中和未选中之间切换,触发不同的回调函数。
DISABLED //禁用模式,按钮不可点击,显示为灰色,文本显示删除线。
NORMAL = 1, //普通模式
TOGGLE, //切换模式
DISABLED //禁用模式
};
struct RouRectangle
/**
* @结构体名称: RouRectangle
* @功能描述: 定义了控件圆角矩形样式时圆角的椭圆尺寸
*
* @详细说明:
* 需要修改控件圆角矩形样式时的圆角椭圆。
*
* @成员说明:
* int ROUND_RECTANGLEwidth = 20; //构成圆角矩形的圆角的椭圆的宽度。
* int ROUND_RECTANGLEheight = 20; //构成圆角矩形的圆角的椭圆的高度。
*/
struct RouRectangle
{
int ROUND_RECTANGLEwidth = 20; //构成圆角矩形的圆角的椭圆的宽度。
int ROUND_RECTANGLEheight = 20; //构成圆角矩形的圆角的椭圆的高度。
};
};
// 消息框类型
enum class MessageBoxType
{
OK, // 只有确定按钮
OKCancel, // 确定和取消按钮
YesNo, // 是和否按钮
YesNoCancel, // 是、否和取消按钮
RetryCancel, // 重试和取消按钮
AbortRetryIgnore, // 中止、重试和忽略按钮
};
// 消息框返回值
enum class MessageBoxResult
{
OK = 1, // 确定按钮
Cancel = 2, // 取消按钮
Yes = 6, // 是按钮
No = 7, // 否按钮
Abort = 3, // 中止按钮
Retry = 4, // 重试按钮
Ignore = 5 // 忽略按钮
};
}

139
include/StellarX/Dialog.h Normal file
View File

@@ -0,0 +1,139 @@
/*******************************************************************************
* @类: Dialog
* @摘要: 模态和非模态对话框控件,提供丰富的消息框功能
* @描述:
* 实现完整的对话框功能,支持多种按钮组合和异步结果回调。
* 自动处理布局、背景保存恢复和生命周期管理。
*
* @特性:
* - 支持六种标准消息框类型OK、YesNo、YesNoCancel等
* - 模态和非模态两种工作模式
* - 自动文本换行和尺寸计算
* - 背景保存和恢复机制
* - 工厂模式下的去重检测
*
* @使用场景: 用户提示、确认操作、输入请求等交互场景
* @所属框架: 星垣(StellarX) GUI框架
* @作者: 我在人间做废物
******************************************************************************/
#pragma once
#include"StellarX.h"
#define closeButtonWidth 20 //关闭按钮宽度
#define closeButtonHeight 20 //关闭按钮高度 同时作为对话框标题栏高度
#define functionButtonWidth 70 //按钮宽度
#define functionButtonHeight 30 //按钮高度
#define buttonMargin 10 //按钮间距
#define buttonAreaHeight 50 //按钮区域高度
#define titleToTextMargin 10 //标题到文本的距离
#define textToBorderMargin 10 //文本到边框的距离
class Dialog : public Canvas
{
Window& hWnd; //窗口引用
int textWidth = 0; //文本宽度
int textHeight = 0; //文本高度
int buttonNum = 0; // 按钮数量
int BorderWidth = 2; //边框宽度
IMAGE* saveBkImage = nullptr; // 用于保存背景图像
int saveBkX = 0, saveBkY = 0; // 保存背景的位置
int saveBkWidth = 0, saveBkHeight = 0; // 保存背景的尺寸
StellarX::MessageBoxType type = StellarX::MessageBoxType::OK; //对话框类型
std::string titleText = "提示"; //标题文本
std::unique_ptr<Label> title = nullptr; //标题标签
std::string message; //提示信息
std::vector<std::string> lines; //消息内容按行分割
bool needsInitialization = true; //是否需要初始化
bool close = false; //是否关闭
bool modal = true; //是否模态
bool isVisible = false; //是否可见
COLORREF backgroundColor = RGB(240, 240, 240); //背景颜色
COLORREF borderColor = RGB(100, 100, 100); //边框颜色
COLORREF buttonTrueColor = RGB(211, 190, 190); //按钮被点击颜色
COLORREF buttonFalseColor = RGB(215, 215, 215); //按钮未被点击颜色
COLORREF buttonHoverColor = RGB(224, 224, 224); //按钮悬浮颜色
Button* closeButton = nullptr; //关闭按钮
StellarX::MessageBoxResult result = StellarX::MessageBoxResult::Cancel; // 对话框结果
public:
bool shouldClose = false; //是否应该关闭
bool isCleaning = false; //是否正在清理
bool pendingCleanup = false; //延迟清理
StellarX::ControlText textStyle; // 字体样式
// 清理方法声明
void performDelayedCleanup();
//工厂模式下调用非模态对话框时用来返回结果
std::function<void(StellarX::MessageBoxResult)> resultCallback;
//设置非模态获取结果的回调函数
void SetResultCallback(std::function<void(StellarX::MessageBoxResult)> cb);
//获取对话框消息,用以去重
std::string GetCaption() const;
public:
Dialog(Window& hWnd, std::string text, std::string message = "对话框", StellarX::MessageBoxType type = StellarX::MessageBoxType::OK, bool modal = true);
~Dialog();
//绘制对话框
void draw() override;
//事件处理
bool handleEvent(const ExMessage& msg) override;
// 设置标题
void SetTitle(const std::string& title);
// 设置消息内容
void SetMessage(const std::string& message);
// 设置对话框类型
void SetType(StellarX::MessageBoxType type);
// 设置模态属性
void SetModal(bool modal);
// 设置对话框结果
void SetResult(StellarX::MessageBoxResult result);
// 获取对话框结果
StellarX::MessageBoxResult GetResult() const;
// 获取模态属性
bool getModal() const;
// 检查是否可见
bool IsVisible() const override;
//获取对话框类型
bool model() const override;
// 显示对话框
void Show();
// 关闭对话框
void Close();
private:
// 初始化按钮
void initButtons();
// 初始化关闭按钮
void initCloseButton();
// 初始化标题
void initTitle();
// 按行分割消息内容
void splitMessageLines();
// 获取文本大小
void getTextSize();
//初始化对话框尺寸
void initDialogSize();
// 初始化对话框
void initializeDialog();
// 清除所有控件
void clearControls();
//创建对话框按钮
std::unique_ptr<Button> createDialogButton(int x, int y, const std::string& text);
};

View File

@@ -0,0 +1,43 @@
/*******************************************************************************
* @类: MessageBox
* @摘要: 消息框工厂类,提供简化的对话框创建接口
* @描述:
* 封装对话框的创建和显示逻辑,提供静态方法供快速调用。
* 支持模态阻塞和非模态回调两种使用方式。
*
* @特性:
* - 静态方法调用,无需实例化
* - 自动处理模态和非模态的逻辑差异
* - 集成到窗口的对话框管理系统中
* - 提供去重机制防止重复对话框
*
* @使用场景: 快速创建标准消息框,减少样板代码
* @所属框架: 星垣(StellarX) GUI框架
* @作者: 我在人间做废物
******************************************************************************/
#pragma once
#include <string>
#include <functional>
#include "CoreTypes.h"
#include "Dialog.h"
#include "Window.h"
namespace StellarX
{
class MessageBox
{
public:
// 模态:阻塞直到关闭,返回结果
static MessageBoxResult ShowModal(Window& wnd,
const std::string& text,
const std::string& caption = "提示",
MessageBoxType type = MessageBoxType::OK);
// 非模态:立即返回,通过回调异步获取结果
static void ShowAsync(Window& wnd,
const std::string& text,
const std::string& caption = "提示",
MessageBoxType type = MessageBoxType::OK,
std::function<void(MessageBoxResult)> onResult = nullptr);
};
} // namespace StellarX

View File

@@ -1,17 +1,17 @@
/*******************************************************************************
* @文件: StellarX.h
* @摘要: 星垣(StellarX) GUI框架 - 主包含头文件
* @版本: v1.0.0
* @版本: v2.0.0
* @描述:
* 一个为Windows平台打造的轻量级、模块化C++ GUI框架。
* 基于EasyX图形库提供简洁易用的API和丰富的控件。
*
*
* 通过包含此单一头文件,即可使用框架的所有功能。
* 内部包含顺序经过精心设计,确保所有依赖关系正确解析。
*
* @作者: 我在人间做废物
* @邮箱: [3150131407@qq.com][]
* @仓库: https://github.com/Ysm-04/StellarX
* @邮箱: [3150131407@qq.com] | [ysm3150131407@gmail.com]
* @仓库: [https://github.com/Ysm-04/StellarX]
*
* @许可证: MIT License
* @版权: Copyright (c) 2025 我在人间做废物
@@ -23,6 +23,8 @@
* 1. CoreTypes.h - 基础类型定义
* 2. Control.h - 控件基类
* 3. 其他具体控件头文件
* 4. Dialog继承自 CanvasDialog 为可包含子控件的对话框容器)
* 5.MessageBox对话框工厂提供便捷的模态/非模态调用方式
******************************************************************************/
#pragma once
@@ -35,3 +37,5 @@
#include"TextBox.h"
#include"Canvas.h"
#include"Table.h"
#include"Dialog.h"
#include"MessageBox.h"

View File

@@ -1,10 +1,23 @@
#pragma once
/*******************************************************************************
* @类: Label
* @摘要: 简单文本标签控件,用于显示静态文本
* @描述:
* 提供基本的文本显示功能,支持透明背景和自定义样式。
* 不支持用户交互,专注于文本呈现。
*
* @特性:
* - 支持背景透明/不透明模式
* - 完整的文本样式控制(字体、颜色、效果)
* - 自动适应文本内容
* - 轻量级无事件处理开销
*
* @使用场景: 显示说明文字、标题、状态信息等静态内容
* @所属框架: 星垣(StellarX) GUI框架
* @作者: 我在人间做废物
******************************************************************************/
#pragma once
#include "Control.h"
// 标签控件,用于显示文本
// 特点:
// - 支持背景透明/不透明模式
// - 不支持用户交互(无事件处理)
// - 自动适应文本内容大小
class Label : public Control
{
@@ -13,14 +26,16 @@ class Label : public Control
COLORREF textBkColor; //标签背景颜色
bool textBkDisap = false; //标签背景是否透明
//标签事件处理(标签无事件)不实现具体代码
void handleEvent(const ExMessage& msg) override {}
bool handleEvent(const ExMessage& msg) override { return false; }
public:
StellarX::ControlText textStyle; //标签文本样式
public:
Label();
Label(int x, int y, std::string text = "标签",COLORREF textcolor = BLACK, COLORREF bkColor= RGB(255,255,255));
//绘标签
void draw() override;
//设置标签背景是否透明
void setTextdisap(bool key);
@@ -30,6 +45,13 @@ public:
void setTextBkColor(COLORREF color);
//设置标签文本
void setText(std::string text);
private:
//检查是否对话框是否可见
bool IsVisible() const override { return false; }
//获取对话框类型
bool model() const override { return false; }
};

View File

@@ -1,19 +1,20 @@
/*******************************************************************************
* @文件: Table.h
* @摘要: 高级表格控件,支持分页显示
* @: Table
* @摘要: 高级表格控件,支持分页显示和大数据量展示
* @描述:
* 提供完整的数据表格功能,包括表头、数据行、分页导航按钮
* 自动计算列宽行高,支持自定义样式
* 提供完整的数据表格功能,包括表头、数据行、分页导航
* 自动计算列宽行高,支持自定义样式和交互。
*
* @实现机制:
* 1. 使用二维向量存储数据
* 2. 通过分页算法计算显示范围
* 3. 使用内部按钮和标签实现分页UI
* 4. 通过背景缓存优化渲染性能
* @特性:
* - 自动分页和页码计算
* - 可配置的每页行数
* - 自定义边框样式和填充模式
* - 翻页按钮和页码显示
* - 背景缓存优化渲染性能
*
* @使用场景: 数据展示、报表生成、记录浏览等表格需求
* @所属框架: 星垣(StellarX) GUI框架
* @作者: 我在人间做废物
* @日期: September 2025
******************************************************************************/
#pragma once
@@ -40,7 +41,6 @@ private:
int totalPages = 1; // 总页数
bool isShowPageButton = true; // 是否显示翻页按钮
bool dirty = true; // 是否需要重绘
bool isNeedDrawHeaders = true; // 是否需要绘制表头
bool isNeedCellSize = true; // 是否需要计算单元格尺寸
@@ -67,6 +67,11 @@ private:
void drawHeader(); //绘制表头
void drawPageNum(); //绘制页码信息
void drawButton(); //绘制翻页按钮
//检查是否对话框是否可见
bool IsVisible() const override { return false; }
//获取对话框类型
bool model() const override { return false; }
public:
StellarX::ControlText textStyle; // 文本样式
@@ -77,15 +82,13 @@ public:
// 绘制表格
void draw() override;
//事件处理
void handleEvent(const ExMessage& msg) override;
//************************** 设置属性 *****************************/
bool handleEvent(const ExMessage& msg) override;
//设置表头
void setHeaders(std::initializer_list<std::string> headers);
//设置表格数据
void setData(const std::vector<std::string>& data);
void setData(const std::initializer_list<std::vector<std::string>>& data);
void setData(std::vector<std::string> data);
void setData(std::initializer_list<std::vector<std::string>> data);
//设置每页显示的行数
void setRowsPerPage(int rows);
//设置是否显示翻页按钮

View File

@@ -1,34 +1,49 @@
#pragma once
/*******************************************************************************
* @类: TextBox
* @摘要: 文本框控件,支持输入和只读两种模式
* @描述:
* 提供文本输入和显示功能集成EasyX的InputBox用于数据输入。
* 支持有限的形状样式和视觉定制。
*
* @特性:
* - 两种工作模式:输入模式和只读模式
* - 最大字符长度限制
* - 集成系统输入框简化文本输入
* - 支持四种矩形形状变体
*
* @使用场景: 数据输入、文本显示、表单字段等
* @所属框架: 星垣(StellarX) GUI框架
* @作者: 我在人间做废物
******************************************************************************/
#pragma once
#include "Control.h"
// 文本框控件,支持输入和只读两种模式
// 特殊说明:
// - 在INPUT_MODE下点击会调用EasyX的InputBox
// - 在READONLY_MODE下点击会显示信息对话框
// - 最大字符长度受maxCharLen限制
class TextBox : public Control
{
std::string text; //文本
StellarX::TextBoxmode mode; //模式
StellarX::ControlShape shape; //形状
bool dirty = true; //是否重绘
bool click = false; //是否点击
int maxCharLen = 10;//最大字符长度
size_t maxCharLen = 10;//最大字符长度
COLORREF textBoxBkClor = RGB(255, 255, 255); //背景颜色
COLORREF textBoxBorderClor = RGB(0,0,0); //边框颜色
//检查是否对话框是否可见
bool IsVisible() const override { return false; }
//获取对话框类型
bool model() const override { return false; }
public:
StellarX::ControlText textStyle; //文本样式
TextBox(int x, int y, int width, int height, std::string text = "", StellarX::TextBoxmode mode = StellarX::TextBoxmode::INPUT_MODE, StellarX::ControlShape shape = StellarX::ControlShape::RECTANGLE);
void draw() override;
void handleEvent(const ExMessage& msg) override;
bool handleEvent(const ExMessage& msg) override;
//设置模式
void setMode(StellarX::TextBoxmode mode);
//设置可输入最大字符长度
void setMaxCharLen(int len);
void setMaxCharLen(size_t len);
//设置形状
void setTextBoxshape(StellarX::ControlShape shape);
//设置边框颜色

View File

@@ -1,34 +1,40 @@
#pragma once
#include "Control.h"
//窗口模式
//#define EX_DBLCLKS 1 - 在绘图窗口中支持鼠标双击事件。
//#define EX_NOCLOSE 2 - 禁用绘图窗口的关闭按钮。
//#define EX_NOMINIMIZE 3 - 禁用绘图窗口的最小化按钮。
//#define EX_SHOWCONSOLE 4 - 显示控制台窗口。
#pragma once
#include"Control.h"
/*******************************************************************************
* @类: Window
* @摘要: 应用程序主窗口类
* @摘要: 应用程序主窗口类,管理窗口生命周期和消息循环
* @描述:
* 负责创建和管理应用程序主窗口,所有控件的根容器。
* 处理消息循环、事件分发和窗口生命周期管理
* 创建和管理应用程序主窗口,作为所有控件的根容器。
* 处理消息分发、事件循环和渲染调度
*
* @重要说明:
* - 使用 initgraph() 创建窗口
* - 使用 BeginBatchDraw()/EndBatchDraw() 实现双缓冲
* - 使用 getmessage() 处理消息循环
* @特性:
* - 多种窗口模式配置(双缓冲、控制台等)
* - 背景图片和颜色支持
* - 集成的对话框管理系统
* - 完整的消息处理循环
* - 控件和对话框的生命周期管理
*
* @使用场景: 应用程序主窗口GUI程序的入口和核心
* @所属框架: 星垣(StellarX) GUI框架
* @作者: 我在人间做废物
******************************************************************************/
class Window
{
int width; //窗口宽度
int height; //窗口高度
int width; //窗口宽度
int height; //窗口高度
int windowMode = NULL; //窗口模式
HWND hWnd = NULL; //窗口句柄
std::string headline; //窗口标题
COLORREF wBkcolor = BLACK; //窗口背景
IMAGE* background = nullptr; //窗口背景图片
std::vector<std::unique_ptr<Control>> controls; //控件管理
std::vector<std::unique_ptr<Control>> dialogs; //对话框管理
public:
bool dialogClose = false; //是否有对话框关闭
Window(int width, int height, int mode);
Window(int width, int height, int mode, COLORREF bkcloc);
Window(int width, int height, int mode , COLORREF bkcloc, std::string headline = "窗口");
@@ -47,6 +53,25 @@ public:
void setHeadline(std::string headline);
//添加控件
void addControl(std::unique_ptr<Control> control);
//添加对话框
void addDialog(std::unique_ptr<Control> dialogs);
//检查是否已有对话框显示用于去重,防止工厂模式调用非模态对话框,多次打开污染对话框背景快照
bool hasNonModalDialogWithCaption(const std::string& caption) const;
//获取窗口句柄
HWND getHwnd() const;
//获取窗口宽度
int getWidth() const;
//获取窗口高度
int getHeight() const;
//获取窗口标题
std::string getHeadline() const;
//获取窗口背景颜色
COLORREF getBkcolor() const;
//获取窗口背景图片
IMAGE* getBkImage() const;
//获取控件管理
std::vector<std::unique_ptr<Control>>& getControls();
};