发布前托管重绘与布局封版收口

收口 Dialog/overlay 后鼠标状态同步、Tooltip 临时 coverage 与持久 coverage 拆分、跨 root 脏区补提交、TextBox/Button 绘制副作用修复,并补充 KEY6 回归用例和 BUG/Fix/Feature 开发记录。
This commit is contained in:
Codex
2026-05-17 00:26:08 +08:00
parent 2388f22c99
commit 9155a86a8a
26 changed files with 1355 additions and 175 deletions
+347 -79
View File
@@ -39,12 +39,318 @@
// * TabControl 页签按钮与页面层级正确;页签 tooltip 不会再被页面盖掉。
// * Table 分页按钮、页码标签、与上层浮层相交时的重绘链保持正确。
//
// 6. KEY6:已实现但主回归未覆盖的枚举/分支补充
// - 目标:补充 TabPlacement::Right、Button 圆/椭圆/禁用态、TextBox 圆角形状、
// 以及 YesNo / RetryCancel / AbortRetryIgnore 消息框类型。
// - 预期:
// * 右侧页签布局、切页、页内按钮和输入框正常。
// * 圆形/椭圆按钮命中区域符合形状,禁用按钮不触发点击回调。
// * 剩余 MessageBox 类型按钮结果链正常,非模态关闭不残留。
//
// 当前阶段建议主回归集:KEY1 + KEY2 + KEY5
// Dialog / MessageBox 补充专项:KEY4
// 实现分支补充专项:KEY6
#include"StellarX.h"
#include <vector>
#ifndef KEY
#define KEY 5
#define KEY 6
#endif
// 测试用例统一使用最新布局 API,避免继续依赖旧 setAnchor() 兼容层。
// 这些 helper 只服务 z-testDome:命名带 SxTest 前缀,避免被误认为框架公开接口。
static void SxTestSetDesignX(Control* control)
{
if (!control) return;
control->setHorizontalAnchors(false, false);
control->setHorizontalSizePolicy(StellarX::AxisSizePolicy::FixedSize);
control->setHorizontalAlignPolicy(StellarX::AxisAlignPolicy::Start);
}
static void SxTestSetDesignY(Control* control)
{
if (!control) return;
control->setVerticalAnchors(false, false);
control->setVerticalSizePolicy(StellarX::AxisSizePolicy::FixedSize);
control->setVerticalAlignPolicy(StellarX::AxisAlignPolicy::Start);
}
static void SxTestSetStretchX(Control* control)
{
if (!control) return;
control->setHorizontalAnchors(true, true);
control->setHorizontalSizePolicy(StellarX::AxisSizePolicy::Stretch);
control->setHorizontalAlignPolicy(StellarX::AxisAlignPolicy::Start);
SxTestSetDesignY(control);
}
static void SxTestSetLeftFixed(Control* control)
{
if (!control) return;
control->setHorizontalAnchors(true, false);
control->setHorizontalSizePolicy(StellarX::AxisSizePolicy::FixedSize);
control->setHorizontalAlignPolicy(StellarX::AxisAlignPolicy::Start);
SxTestSetDesignY(control);
}
static void SxTestSetRightFixed(Control* control)
{
if (!control) return;
control->setHorizontalAnchors(false, true);
control->setHorizontalSizePolicy(StellarX::AxisSizePolicy::FixedSize);
control->setHorizontalAlignPolicy(StellarX::AxisAlignPolicy::End);
SxTestSetDesignY(control);
}
static void SxTestSetTopFixed(Control* control)
{
if (!control) return;
SxTestSetDesignX(control);
control->setVerticalAnchors(true, false);
control->setVerticalSizePolicy(StellarX::AxisSizePolicy::FixedSize);
control->setVerticalAlignPolicy(StellarX::AxisAlignPolicy::Start);
}
static void SxTestSetBottomFixed(Control* control)
{
if (!control) return;
SxTestSetDesignX(control);
control->setVerticalAnchors(false, true);
control->setVerticalSizePolicy(StellarX::AxisSizePolicy::FixedSize);
control->setVerticalAlignPolicy(StellarX::AxisAlignPolicy::End);
}
static void SxTestSetStretchY(Control* control)
{
if (!control) return;
SxTestSetDesignX(control);
control->setVerticalAnchors(true, true);
control->setVerticalSizePolicy(StellarX::AxisSizePolicy::Stretch);
control->setVerticalAlignPolicy(StellarX::AxisAlignPolicy::Start);
}
#if 6 == KEY
int main()
{
StellarX::SxLogger::setGBK();
StellarX::SxLogger::Get().enableConsole(true);
StellarX::SxLogger::Get().setMinLevel(StellarX::SxLogLevel::Debug);
StellarX::SxLogger::Get().setLanguage(StellarX::SxLogLanguage::ZhCN);
Window win(1120, 760, 1, RGB(246, 248, 251), "StellarX KEY6 分支覆盖补充");
const COLORREF panelColor = RGB(230, 238, 248);
const COLORREF shapeColor = RGB(244, 235, 218);
const COLORREF tabColor = RGB(226, 242, 235);
const COLORREF msgColor = RGB(240, 229, 245);
const COLORREF hoverColor = RGB(255, 225, 92);
const COLORREF trueColor = RGB(238, 142, 104);
const COLORREF falseColor = RGB(247, 248, 250);
auto configureButton = [&](Button* button, const std::string& tooltip)
{
button->enableTooltip(true);
button->setTooltipDelay(120);
button->setTooltipText(tooltip);
};
auto makeButton = [&](int x, int y, int w, int h, const std::string& text)
{
auto button = std::make_unique<Button>(x, y, w, h, text, trueColor, falseColor, hoverColor);
configureButton(button.get(), text);
return button;
};
auto header = std::make_unique<Canvas>(20, 20, 1080, 82);
auto headerPtr = header.get();
headerPtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
headerPtr->setCanvasBkColor(panelColor);
SxTestSetStretchX(headerPtr);
auto title = std::make_unique<Label>(18, 10, "KEY6:已实现但主回归未覆盖的分支补充");
title->textStyle.nHeight = 26;
title->setDirty(true);
title->setTextdisap(true);
auto hint = std::make_unique<Label>(18, 48, "覆盖:Right 页签、圆/椭圆按钮命中、DISABLED 按钮、圆角 TextBox、剩余 MessageBox 类型");
hint->setTextdisap(true);
headerPtr->addControl(std::move(title));
headerPtr->addControl(std::move(hint));
auto shapePanel = std::make_unique<Canvas>(20, 120, 470, 270);
auto shapePanelPtr = shapePanel.get();
shapePanelPtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
shapePanelPtr->setCanvasBkColor(shapeColor);
SxTestSetLeftFixed(shapePanelPtr);
auto statusLabel = std::make_unique<Label>(18, 226, "状态:等待交互");
auto statusLabelPtr = statusLabel.get();
statusLabelPtr->setTextdisap(true);
auto shapeTitle = std::make_unique<Label>(18, 14, "AButton 形状与禁用态");
shapeTitle->setTextdisap(true);
auto shapeHint = std::make_unique<Label>(18, 40, "圆/椭圆按钮需要按形状命中;禁用按钮不应触发回调。");
shapeHint->setTextdisap(true);
auto circleButton = makeButton(30, 78, 72, 72, "");
circleButton->setButtonShape(StellarX::ControlShape::CIRCLE);
circleButton->setOnClickListener([statusLabelPtr]()
{
statusLabelPtr->setText("状态:有边框圆形按钮被点击");
});
auto solidCircleButton = makeButton(132, 78, 72, 72, "无边圆");
solidCircleButton->setButtonShape(StellarX::ControlShape::B_CIRCLE);
solidCircleButton->setOnClickListener([statusLabelPtr]()
{
statusLabelPtr->setText("状态:无边框圆形按钮被点击");
});
auto ellipseButton = makeButton(234, 84, 116, 58, "椭圆");
ellipseButton->setButtonShape(StellarX::ControlShape::ELLIPSE);
ellipseButton->setOnClickListener([statusLabelPtr]()
{
statusLabelPtr->setText("状态:有边框椭圆按钮被点击");
});
auto solidEllipseButton = makeButton(30, 164, 116, 50, "无边椭圆");
solidEllipseButton->setButtonShape(StellarX::ControlShape::B_ELLIPSE);
solidEllipseButton->setOnClickListener([statusLabelPtr]()
{
statusLabelPtr->setText("状态:无边框椭圆按钮被点击");
});
auto disabledButton = std::make_unique<Button>(176, 164, 116, 50, "禁用", StellarX::ButtonMode::DISABLED, StellarX::ControlShape::ROUND_RECTANGLE);
configureButton(disabledButton.get(), "禁用按钮:应只显示禁用态,不触发点击");
disabledButton->setOnClickListener([statusLabelPtr]()
{
statusLabelPtr->setText("状态:BUG,禁用按钮触发了点击");
});
shapePanelPtr->addControl(std::move(shapeTitle));
shapePanelPtr->addControl(std::move(shapeHint));
shapePanelPtr->addControl(std::move(circleButton));
shapePanelPtr->addControl(std::move(solidCircleButton));
shapePanelPtr->addControl(std::move(ellipseButton));
shapePanelPtr->addControl(std::move(solidEllipseButton));
shapePanelPtr->addControl(std::move(disabledButton));
shapePanelPtr->addControl(std::move(statusLabel));
auto tabPanel = std::make_unique<Canvas>(520, 120, 580, 270);
auto tabPanelPtr = tabPanel.get();
tabPanelPtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
tabPanelPtr->setCanvasBkColor(tabColor);
SxTestSetStretchX(tabPanelPtr);
auto tabTitle = std::make_unique<Label>(18, 14, "BTabPlacement::Right");
tabTitle->setTextdisap(true);
auto tabHint = std::make_unique<Label>(18, 40, "右侧页签栏应稳定,页面区宽度应扣除页签栏。");
tabHint->setTextdisap(true);
auto rightTabs = std::make_unique<TabControl>(18, 72, 542, 172);
auto rightTabsPtr = rightTabs.get();
rightTabsPtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
rightTabsPtr->setCanvasfillMode(StellarX::FillMode::Null);
rightTabsPtr->setTabPlacement(StellarX::TabPlacement::Right);
rightTabsPtr->setTabBarHeight(76);
SxTestSetStretchX(rightTabsPtr);
auto rightPage1 = std::make_unique<Canvas>(0, 0, 466, 172);
rightPage1->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
rightPage1->setCanvasBkColor(RGB(240, 248, 255));
auto rightPage1Ptr = rightPage1.get();
auto rightPage1Label = std::make_unique<Label>(16, 18, "右侧页签页 1:按钮和圆角输入框");
rightPage1Label->setTextdisap(true);
auto rightPage1Button = makeButton(18, 58, 120, 34, "页内按钮");
rightPage1Button->setOnClickListener([statusLabelPtr]()
{
statusLabelPtr->setText("状态:Right 页签页内按钮被点击");
});
auto roundInput = std::make_unique<TextBox>(160, 58, 260, 34, "圆角输入框", StellarX::TextBoxmode::INPUT_MODE, StellarX::ControlShape::ROUND_RECTANGLE);
roundInput->setTextBoxshape(StellarX::ControlShape::ROUND_RECTANGLE);
roundInput->setMaxCharLen(24);
SxTestSetStretchX(roundInput.get());
rightPage1Ptr->addControl(std::move(rightPage1Label));
rightPage1Ptr->addControl(std::move(rightPage1Button));
rightPage1Ptr->addControl(std::move(roundInput));
auto rightPage2 = std::make_unique<Canvas>(0, 0, 466, 172);
rightPage2->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
rightPage2->setCanvasBkColor(RGB(247, 244, 236));
auto rightPage2Ptr = rightPage2.get();
auto rightPage2Label = std::make_unique<Label>(16, 18, "右侧页签页 2:只读圆角 TextBox");
rightPage2Label->setTextdisap(true);
auto roundReadOnly = std::make_unique<TextBox>(18, 58, 380, 34, "只读圆角文本框", StellarX::TextBoxmode::READONLY_MODE, StellarX::ControlShape::B_ROUND_RECTANGLE);
roundReadOnly->setTextBoxshape(StellarX::ControlShape::B_ROUND_RECTANGLE);
SxTestSetStretchX(roundReadOnly.get());
rightPage2Ptr->addControl(std::move(rightPage2Label));
rightPage2Ptr->addControl(std::move(roundReadOnly));
rightTabsPtr->add(std::make_pair(std::make_unique<Button>(0, 0, 76, 34, "页一"), std::move(rightPage1)));
rightTabsPtr->add(std::make_pair(std::make_unique<Button>(0, 0, 76, 34, "页二"), std::move(rightPage2)));
rightTabsPtr->setActiveIndex(0);
tabPanelPtr->addControl(std::move(tabTitle));
tabPanelPtr->addControl(std::move(tabHint));
tabPanelPtr->addControl(std::move(rightTabs));
auto messagePanel = std::make_unique<Canvas>(20, 420, 1080, 250);
auto messagePanelPtr = messagePanel.get();
messagePanelPtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
messagePanelPtr->setCanvasBkColor(msgColor);
SxTestSetStretchX(messagePanelPtr);
auto msgTitle = std::make_unique<Label>(18, 14, "C:剩余 MessageBox 类型");
msgTitle->setTextdisap(true);
auto msgHint = std::make_unique<Label>(18, 40, "分别打开 YesNo、RetryCancel、AbortRetryIgnore,观察按钮结果和关闭后 hover 恢复。");
msgHint->setTextdisap(true);
auto msgStatus = std::make_unique<Label>(18, 202, "消息框结果:等待操作");
auto msgStatusPtr = msgStatus.get();
msgStatus->setTextdisap(true);
auto yesNoButton = makeButton(30, 92, 170, 44, "模态 YesNo");
yesNoButton->setOnClickListener([&win, msgStatusPtr]()
{
auto result = StellarX::MessageBox::showModal(win, "KEY6YesNo 分支验证", "KEY6 YesNo", StellarX::MessageBoxType::YesNo);
msgStatusPtr->setText("消息框结果:YesNo -> " + std::to_string((int)result));
});
auto retryCancelButton = makeButton(230, 92, 190, 44, "模态 RetryCancel");
retryCancelButton->setOnClickListener([&win, msgStatusPtr]()
{
auto result = StellarX::MessageBox::showModal(win, "KEY6RetryCancel 分支验证", "KEY6 RetryCancel", StellarX::MessageBoxType::RetryCancel);
msgStatusPtr->setText("消息框结果:RetryCancel -> " + std::to_string((int)result));
});
auto abortRetryIgnoreButton = makeButton(450, 92, 230, 44, "非模态 AbortRetryIgnore");
abortRetryIgnoreButton->setOnClickListener([&win, msgStatusPtr]()
{
StellarX::MessageBox::showAsync(
win,
"KEY6AbortRetryIgnore 非模态分支验证。\n关闭后检查底层按钮 hover / tooltip 是否恢复。",
"KEY6 AbortRetryIgnore",
StellarX::MessageBoxType::AbortRetryIgnore,
[msgStatusPtr](StellarX::MessageBoxResult result)
{
msgStatusPtr->setText("消息框结果:AbortRetryIgnore -> " + std::to_string((int)result));
});
});
messagePanelPtr->addControl(std::move(msgTitle));
messagePanelPtr->addControl(std::move(msgHint));
messagePanelPtr->addControl(std::move(yesNoButton));
messagePanelPtr->addControl(std::move(retryCancelButton));
messagePanelPtr->addControl(std::move(abortRetryIgnoreButton));
messagePanelPtr->addControl(std::move(msgStatus));
win.addControl(std::move(header));
win.addControl(std::move(shapePanel));
win.addControl(std::move(tabPanel));
win.addControl(std::move(messagePanel));
win.draw();
return win.runEventLoop();
}
#endif
#if 5 == KEY
@@ -89,8 +395,7 @@ int main()
auto headerPtr = header.get();
headerPtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
headerPtr->setCanvasBkColor(headerColor);
headerPtr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
headerPtr->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(headerPtr);
auto headerTitle = std::make_unique<Label>(18, 8, "KEY5:第二阶段专项回归");
headerTitle->textStyle.nHeight = 26;
@@ -108,8 +413,7 @@ int main()
auto nestedZonePtr = nestedZone.get();
nestedZonePtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
nestedZonePtr->setCanvasBkColor(nestedZoneColor);
nestedZonePtr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
nestedZonePtr->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(nestedZonePtr);
auto nestedTitle = std::make_unique<Label>(16, 16, "A 蓝:三层 Canvas 嵌套");
nestedTitle->setTextdisap(true);
@@ -117,55 +421,46 @@ int main()
nestedHint->setTextdisap(true);
auto nestedLeftBtn = makeTestButton(20, 74, 110, 34, "左固定");
nestedLeftBtn->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
nestedLeftBtn->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::NoAnchor);
SxTestSetLeftFixed(nestedLeftBtn.get());
auto nestedStretchBox = std::make_unique<TextBox>(150, 74, 350, 34, "A 区横向拉伸输入框");
nestedStretchBox->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
nestedStretchBox->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(nestedStretchBox.get());
auto nestedRightBtn = makeTestButton(520, 74, 110, 34, "右固定");
nestedRightBtn->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
nestedRightBtn->setAnchor(StellarX::Anchor::Right, StellarX::Anchor::NoAnchor);
SxTestSetRightFixed(nestedRightBtn.get());
auto level1 = std::make_unique<Canvas>(18, 126, 614, 134);
auto level1Ptr = level1.get();
level1Ptr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
level1Ptr->setCanvasBkColor(level1Color);
level1Ptr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
level1Ptr->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(level1Ptr);
auto level1Title = std::make_unique<Label>(14, 10, "A-1 青:第一层");
level1Title->setTextdisap(true);
auto level1Btn = makeTestButton(18, 42, 110, 30, "内层左");
level1Btn->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
level1Btn->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::NoAnchor);
SxTestSetLeftFixed(level1Btn.get());
auto level2 = std::make_unique<Canvas>(142, 36, 454, 84);
auto level2Ptr = level2.get();
level2Ptr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
level2Ptr->setCanvasBkColor(level2Color);
level2Ptr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
level2Ptr->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(level2Ptr);
auto level2Title = std::make_unique<Label>(12, 8, "A-2 绿:第二层");
level2Title->setTextdisap(true);
auto level2Btn = makeTestButton(332, 8, 108, 28, "右固定");
level2Btn->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
level2Btn->setAnchor(StellarX::Anchor::Right, StellarX::Anchor::NoAnchor);
SxTestSetRightFixed(level2Btn.get());
auto level3 = std::make_unique<Canvas>(16, 42, 422, 28);
auto level3Ptr = level3.get();
level3Ptr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
level3Ptr->setCanvasBkColor(level3Color);
level3Ptr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
level3Ptr->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(level3Ptr);
auto level3Label = std::make_unique<Label>(10, 6, "A-3 橙:第三层");
level3Label->setTextdisap(true);
auto level3Btn = makeTestButton(312, 2, 98, 24, "右按钮");
level3Btn->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
level3Btn->setAnchor(StellarX::Anchor::Right, StellarX::Anchor::NoAnchor);
SxTestSetRightFixed(level3Btn.get());
configureTooltip(level3Btn.get(), "第三层 Canvas 里的右固定按钮");
level3Ptr->addControl(std::move(level3Label));
@@ -188,8 +483,7 @@ int main()
auto tabZonePtr = tabZone.get();
tabZonePtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
tabZonePtr->setCanvasBkColor(tabZoneColor);
tabZonePtr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
tabZonePtr->setAnchor(StellarX::Anchor::Right, StellarX::Anchor::NoAnchor);
SxTestSetRightFixed(tabZonePtr);
auto tabTitle = std::make_unique<Label>(16, 16, "B 青:TabControl 外层 resize");
tabTitle->setTextdisap(true);
@@ -202,8 +496,7 @@ int main()
tabControlPtr->setCanvasfillMode(StellarX::FillMode::Null);
tabControlPtr->setTabPlacement(StellarX::TabPlacement::Top);
tabControlPtr->setTabBarHeight(30);
tabControlPtr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
tabControlPtr->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(tabControlPtr);
auto tabPage1 = std::make_unique<Canvas>(0, 0, 634, 170);
auto tabPage1Ptr = tabPage1.get();
@@ -218,25 +511,21 @@ int main()
auto page1Label = std::make_unique<Label>(14, 12, "页 1:页内 TextBox 继续由 Canvas 管。");
page1Label->setTextdisap(true);
auto page1Box = std::make_unique<TextBox>(18, 44, 468, 34, "页 1 左右拉伸输入框");
page1Box->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
page1Box->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(page1Box.get());
auto page1Btn = makeTestButton(504, 44, 96, 34, "右固定");
page1Btn->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
page1Btn->setAnchor(StellarX::Anchor::Right, StellarX::Anchor::NoAnchor);
SxTestSetRightFixed(page1Btn.get());
configureTooltip(page1Btn.get(), "页 1 右固定按钮");
auto page1InnerCanvas = std::make_unique<Canvas>(18, 92, 582, 56);
auto page1InnerCanvasPtr = page1InnerCanvas.get();
page1InnerCanvasPtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
page1InnerCanvasPtr->setCanvasBkColor(RGB(223, 236, 248));
page1InnerCanvasPtr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
page1InnerCanvasPtr->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(page1InnerCanvasPtr);
auto page1InnerLabel = std::make_unique<Label>(10, 8, "页 1 内层 Canvas");
page1InnerLabel->setTextdisap(true);
auto page1InnerBtn = makeTestButton(462, 14, 108, 28, "右按钮");
page1InnerBtn->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
page1InnerBtn->setAnchor(StellarX::Anchor::Right, StellarX::Anchor::NoAnchor);
SxTestSetRightFixed(page1InnerBtn.get());
configureTooltip(page1InnerBtn.get(), "页 1 内层 Canvas 按钮");
page1InnerCanvasPtr->addControl(std::move(page1InnerLabel));
@@ -259,8 +548,7 @@ int main()
auto page2InnerLabel = std::make_unique<Label>(10, 8, "页 2 内层 Canvas");
page2InnerLabel->setTextdisap(true);
auto page2InnerBtn = makeTestButton(286, 42, 126, 28, "右侧 Tooltip");
page2InnerBtn->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
page2InnerBtn->setAnchor(StellarX::Anchor::Right, StellarX::Anchor::NoAnchor);
SxTestSetRightFixed(page2InnerBtn.get());
configureTooltip(page2InnerBtn.get(), "页 2 内层按钮 Tooltip");
page2InnerCanvasPtr->addControl(std::move(page2InnerLabel));
@@ -323,8 +611,7 @@ int main()
});
auto innerHoverBtn = makeTestButton(506, 120, 118, 34, "容器内按钮");
innerHoverBtn->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
innerHoverBtn->setAnchor(StellarX::Anchor::Right, StellarX::Anchor::NoAnchor);
SxTestSetRightFixed(innerHoverBtn.get());
configureTooltip(innerHoverBtn.get(), "Canvas 内按钮 Tooltip");
behaviorZonePtr->addControl(std::move(behaviorTitle));
@@ -338,8 +625,7 @@ int main()
auto overlayZonePtr = overlayZone.get();
overlayZonePtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
overlayZonePtr->setCanvasBkColor(overlayZoneColor);
overlayZonePtr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
overlayZonePtr->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(overlayZonePtr);
auto overlayTitle = std::make_unique<Label>(16, 16, "D 橙:Top+Bottom + 同父 overlay");
overlayTitle->setTextdisap(true);
@@ -348,17 +634,14 @@ int main()
auto lowerLayerPtr = lowerLayer.get();
lowerLayerPtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
lowerLayerPtr->setCanvasBkColor(RGB(255, 245, 231));
lowerLayerPtr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
lowerLayerPtr->setAnchor(StellarX::Anchor::Top, StellarX::Anchor::Bottom);
SxTestSetStretchY(lowerLayerPtr);
auto lowerTitle = std::make_unique<Label>(12, 8, "D-1 下层区");
lowerTitle->setTextdisap(true);
auto lowerBox = std::make_unique<TextBox>(12, 34, 222, 30, "下层区输入框");
lowerBox->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
lowerBox->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(lowerBox.get());
auto lowerBtn = makeTestButton(248, 34, 92, 30, "下层按钮");
lowerBtn->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
lowerBtn->setAnchor(StellarX::Anchor::Right, StellarX::Anchor::NoAnchor);
SxTestSetRightFixed(lowerBtn.get());
configureTooltip(lowerBtn.get(), "下层 Canvas 按钮");
lowerLayerPtr->addControl(std::move(lowerTitle));
@@ -369,22 +652,19 @@ int main()
auto upperLayerPtr = upperLayer.get();
upperLayerPtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
upperLayerPtr->setCanvasBkColor(RGB(255, 224, 206));
upperLayerPtr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
upperLayerPtr->setAnchor(StellarX::Anchor::Right, StellarX::Anchor::NoAnchor);
SxTestSetRightFixed(upperLayerPtr);
auto upperTitle = std::make_unique<Label>(12, 8, "D-2 上层区");
upperTitle->setTextdisap(true);
auto upperBtn = makeTestButton(244, 38, 122, 28, "上层 Tooltip");
upperBtn->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
upperBtn->setAnchor(StellarX::Anchor::Right, StellarX::Anchor::NoAnchor);
SxTestSetRightFixed(upperBtn.get());
configureTooltip(upperBtn.get(), "上层 Canvas 按钮");
upperLayerPtr->addControl(std::move(upperTitle));
upperLayerPtr->addControl(std::move(upperBtn));
auto overlayBottomBtn = makeTestButton(526, 148, 118, 30, "底边固定");
overlayBottomBtn->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
overlayBottomBtn->setAnchor(StellarX::Anchor::Bottom, StellarX::Anchor::NoAnchor);
SxTestSetBottomFixed(overlayBottomBtn.get());
overlayZonePtr->addControl(std::move(overlayTitle));
overlayZonePtr->addControl(std::move(lowerLayer));
@@ -395,8 +675,7 @@ int main()
auto tableZonePtr = tableZone.get();
tableZonePtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
tableZonePtr->setCanvasBkColor(tableZoneColor);
tableZonePtr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
tableZonePtr->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(tableZonePtr);
auto tableTitle = std::make_unique<Label>(16, 12, "E 紫:Table 仅 X Stretch");
tableTitle->setTextdisap(true);
@@ -415,8 +694,7 @@ int main()
tablePtr->setRowsPerPage(2);
tablePtr->setTableBorderWidth(1);
tablePtr->setTableBorder(RGB(86, 88, 132));
tablePtr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
tablePtr->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(tablePtr);
tableZonePtr->addControl(std::move(tableTitle));
tableZonePtr->addControl(std::move(tableHint));
@@ -429,16 +707,14 @@ int main()
auto floatingZonePtr = floatingZone.get();
floatingZonePtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
floatingZonePtr->setCanvasBkColor(floatingColor);
floatingZonePtr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
floatingZonePtr->setAnchor(StellarX::Anchor::Bottom, StellarX::Anchor::NoAnchor);
SxTestSetBottomFixed(floatingZonePtr);
auto floatingTitle = std::make_unique<Label>(16, 12, "F 粉:Bottom only 浮层");
floatingTitle->setTextdisap(true);
auto floatingHint = std::make_unique<Label>(16, 36, "看 Table 下层重绘后的补画。");
floatingHint->setTextdisap(true);
auto floatingBtn = makeTestButton(322, 88, 118, 30, "右固定");
floatingBtn->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
floatingBtn->setAnchor(StellarX::Anchor::Right, StellarX::Anchor::NoAnchor);
SxTestSetRightFixed(floatingBtn.get());
configureTooltip(floatingBtn.get(), "粉色浮层里的按钮");
floatingZonePtr->addControl(std::move(floatingTitle));
@@ -582,8 +858,7 @@ int main()
auto infoPanelPtr = infoPanel.get();
infoPanelPtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
infoPanelPtr->setCanvasBkColor(RGB(225, 234, 244));
infoPanelPtr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
infoPanelPtr->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(infoPanelPtr);
auto infoTitle = std::make_unique<Label>(20, 10, "综合回归测试 4:对话框遮挡、快速 Hover、分页按钮、模态 Resize");
infoTitle->textStyle.nHeight = 26;
@@ -613,8 +888,7 @@ int main()
auto hoverCanvasPtr = hoverCanvas.get();
hoverCanvasPtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
hoverCanvasPtr->setCanvasBkColor(RGB(230, 238, 248));
hoverCanvasPtr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
hoverCanvasPtr->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(hoverCanvasPtr);
auto hoverTitle = std::make_unique<Label>(20, 8, "区域 A:打开非模态对话框后,请在下面 8 个按钮之间快速来回划动鼠标。");
hoverTitle->setTextdisap(true);
@@ -635,8 +909,7 @@ int main()
tabControlPtr->setCanvasfillMode(StellarX::FillMode::Null);
tabControlPtr->setTabPlacement(StellarX::TabPlacement::Top);
tabControlPtr->setTabBarHeight(28);
tabControlPtr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
tabControlPtr->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(tabControlPtr);
auto page1 = std::make_unique<Canvas>(0, 0, 1040, 152);
page1->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
@@ -694,8 +967,7 @@ int main()
tablePtr->setTableBorderWidth(1);
tablePtr->setTableBorder(RGB(60, 90, 120));
tablePtr->setTableFillMode(StellarX::FillMode::Null);
tablePtr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
tablePtr->setAnchor(StellarX::Anchor::Left, StellarX::Anchor::Right);
SxTestSetStretchX(tablePtr);
const std::string asyncText =
"KEY4 非模态回归测试正在进行。\n"
@@ -1289,15 +1561,14 @@ int main()
for (auto& log : logIn_label)
{
log->setTextdisap(true);
log->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
log->textStyle.lpszFace = "华文行楷";
}
logIn_label[0]->textStyle.nHeight = 100;
logIn_label[0]->setAnchor(StellarX::Anchor::Top, StellarX::Anchor::NoAnchor);
SxTestSetTopFixed(logIn_label[0].get());
logIn_label[1]->textStyle.nHeight = 50;
logIn_label[1]->setAnchor(StellarX::Anchor::Bottom, StellarX::Anchor::NoAnchor);
SxTestSetBottomFixed(logIn_label[1].get());
logIn_label[2]->textStyle.nHeight = 50;
logIn_label[2]->setAnchor(StellarX::Anchor::Bottom, StellarX::Anchor::NoAnchor);
SxTestSetBottomFixed(logIn_label[2].get());
//输入框
std::unique_ptr<TextBox> logIn_textBox[2];
@@ -1309,8 +1580,7 @@ int main()
logIn_textBox_ptr[1] = logIn_textBox[1].get();
for (auto& tb : logIn_textBox)
{
tb->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
tb->setAnchor(StellarX::Anchor::Bottom, StellarX::Anchor::NoAnchor);
SxTestSetBottomFixed(tb.get());
tb->setMaxCharLen(15);
}
//按钮
@@ -1322,16 +1592,14 @@ int main()
logIn_Button_ptr[1] = logIn_Button[1].get();
for (auto& b : logIn_Button)
{
b->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
b->setAnchor(StellarX::Anchor::Bottom, StellarX::Anchor::NoAnchor);
SxTestSetBottomFixed(b.get());
}
//log画布
auto log_Canvas = std::make_unique<Canvas>(0, 0, 1300, 800);
Canvas* log_Canvas_ptr = log_Canvas.get();
log_Canvas_ptr->setCanvasfillMode(StellarX::FillMode::Null);
log_Canvas_ptr->setShape(StellarX::ControlShape::B_RECTANGLE);
log_Canvas_ptr->setLayoutMode(StellarX::LayoutMode::AnchorToEdges);
log_Canvas_ptr->setAnchor(StellarX::Anchor::Bottom, StellarX::Anchor::Top);
SxTestSetStretchY(log_Canvas_ptr);
//将log界面控价加入logCanvas统一管理
for (auto& b : logIn_Button)