80 lines
3.0 KiB
C++
80 lines
3.0 KiB
C++
/*******************************************************************************
|
|
* @类: Canvas
|
|
* @摘要: 画布容器控件,用于分组和管理子控件
|
|
* @描述:
|
|
* 作为其他控件的父容器,提供统一的背景和边框样式。
|
|
* 负责将事件传递给子控件并管理它们的绘制顺序。
|
|
* 在托管重绘模式下,Canvas 通常作为一组子控件的安全重绘 root。
|
|
*
|
|
* @特性:
|
|
* - 支持四种矩形形状(普通、圆角,各有边框和无边框版本)
|
|
* - 可自定义填充模式、边框颜色和背景颜色
|
|
* - 自动管理子控件的生命周期和事件传递
|
|
* - 支持嵌套容器结构
|
|
*
|
|
* @使用场景: 用于分组相关控件、实现复杂布局或作为对话框基础
|
|
* @所属框架: 星垣(StellarX) GUI框架
|
|
* @作者: 我在人间做废物
|
|
*******************************************************************************/
|
|
|
|
#pragma once
|
|
#include "Control.h"
|
|
#include"Table.h"
|
|
|
|
class Canvas : public Control
|
|
{
|
|
protected:
|
|
std::vector<std::unique_ptr<Control>> controls;
|
|
|
|
StellarX::ControlShape shape = StellarX::ControlShape::RECTANGLE; //容器形状
|
|
StellarX::FillMode canvasFillMode = StellarX::FillMode::Solid; //容器填充模式
|
|
StellarX::LineStyle canvasLineStyle = StellarX::LineStyle::Solid; //线型
|
|
int canvaslinewidth = 1; //线宽
|
|
|
|
COLORREF canvasBorderClor = RGB(0, 0, 0); //边框颜色
|
|
COLORREF canvasBkClor = RGB(255, 255, 255); //背景颜色
|
|
|
|
// 清除所有子控件
|
|
void clearAllControls();
|
|
public:
|
|
Canvas();
|
|
Canvas(int x, int y, int width, int height);
|
|
~Canvas() {}
|
|
|
|
void setX(int x)override;
|
|
void setY(int y)override;
|
|
|
|
//绘制容器及其子控件
|
|
void draw() override;
|
|
bool handleEvent(const ExMessage& msg) override;
|
|
//添加控件
|
|
void addControl(std::unique_ptr<Control> control);
|
|
//设置容器样式
|
|
void setShape(StellarX::ControlShape shape);
|
|
//设置容器填充模式
|
|
void setCanvasfillMode(StellarX::FillMode mode);
|
|
//设置容器边框颜色
|
|
void setBorderColor(COLORREF color);
|
|
//设置填充颜色
|
|
void setCanvasBkColor(COLORREF color);
|
|
//设置线形
|
|
void setCanvasLineStyle(StellarX::LineStyle style);
|
|
//设置线段宽度
|
|
void setLinewidth(int width);
|
|
//设置不可见后传递给子控件重写
|
|
void setIsVisible(bool visible) override;
|
|
void setDirty(bool dirty) override;
|
|
void onWindowResize() override;
|
|
// 托管模式下登记为 root;非托管模式下走局部或根级重绘
|
|
void requestRepaint(Control* parent)override;
|
|
// 判断当前 Canvas 是否可安全做局部提交
|
|
bool canCommitManagedPartialRepaint() const override;
|
|
// 托管收口阶段执行 Canvas 的真正重绘
|
|
void commitManagedRepaint() override;
|
|
//获取子控件列表
|
|
std::vector<std::unique_ptr<Control>>& getControls() { return controls; }
|
|
private:
|
|
//用来检查对话框是否模态,此控件不做实现
|
|
bool model() const override { return false; };
|
|
};
|