Snapshot before repaint phase 2

This commit is contained in:
Codex
2026-04-07 21:37:49 +08:00
parent b07a4ec370
commit 77a8fe568a
10 changed files with 395 additions and 131 deletions
+193 -2
View File
@@ -1,6 +1,6 @@
// 本工具基于 StellarX 构建,轻量级的 Windows GUI 框架
// StellarX 星垣GUI框架 - 测试用例
#include"StellarX.h"
#define KEY 2
#define KEY 4
#if 1 == KEY
int main()
@@ -106,6 +106,197 @@ int main()
}
#endif
#if 4 == KEY
#include"StellarX.h"
#include <vector>
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(1280, 780, 1, RGB(242, 246, 250), "StellarX 综合回归测试用例 4");
auto infoPanel = std::make_unique<Canvas>(20, 20, 1240, 90);
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);
auto infoTitle = std::make_unique<Label>(20, 10, "综合回归测试 4:对话框遮挡、快速 Hover、分页按钮、模态 Resize");
infoTitle->textStyle.nHeight = 26;
infoTitle->setTextdisap(true);
auto infoLine1 = std::make_unique<Label>(20, 42, "1. 点击右侧按钮打开非模态/模态对话框;2. 在顶部按钮、页签、分页按钮附近快速划动光标。");
infoLine1->setTextdisap(true);
auto infoLine2 = std::make_unique<Label>(20, 62, "3. 模态对话框打开后拖动窗口大小;4. 关闭对话框后观察底层按钮 Hover 是否立即恢复。");
infoLine2->setTextdisap(true);
auto openAsyncButton = std::make_unique<Button>(930, 22, 130, 42, "打开非模态");
auto openAsyncButtonPtr = openAsyncButton.get();
openAsyncButtonPtr->enableTooltip(true);
openAsyncButtonPtr->setTooltipText("打开长文本非模态对话框,覆盖顶部按钮 / 页签 / 分页区");
auto openModalButton = std::make_unique<Button>(1080, 22, 130, 42, "打开模态");
auto openModalButtonPtr = openModalButton.get();
openModalButtonPtr->enableTooltip(true);
openModalButtonPtr->setTooltipText("打开模态对话框并测试拖拽窗口后的重绘与关闭");
infoPanelPtr->addControl(std::move(infoTitle));
infoPanelPtr->addControl(std::move(infoLine1));
infoPanelPtr->addControl(std::move(infoLine2));
infoPanelPtr->addControl(std::move(openAsyncButton));
infoPanelPtr->addControl(std::move(openModalButton));
auto hoverCanvas = std::make_unique<Canvas>(20, 140, 1240, 100);
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);
auto hoverTitle = std::make_unique<Label>(20, 8, "区域 A:打开非模态对话框后,请在下面 8 个按钮之间快速来回划动鼠标。");
hoverTitle->setTextdisap(true);
hoverCanvasPtr->addControl(std::move(hoverTitle));
for (int i = 0; i < 8; ++i)
{
auto hoverButton = std::make_unique<Button>(250 + i * 92, 38, 72, 38, "B" + std::to_string(i + 1));
hoverButton->enableTooltip(true);
hoverButton->setTooltipText("顶部 Hover 按钮 " + std::to_string(i + 1));
hoverButton->setButtonShape(StellarX::ControlShape::B_RECTANGLE);
hoverCanvasPtr->addControl(std::move(hoverButton));
}
auto tabControl = std::make_unique<TabControl>(120, 260, 1040, 180);
auto tabControlPtr = tabControl.get();
tabControlPtr->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
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);
auto page1 = std::make_unique<Canvas>(0, 0, 1040, 152);
page1->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
page1->setCanvasBkColor(RGB(246, 250, 255));
auto page2 = std::make_unique<Canvas>(0, 0, 1040, 152);
page2->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
page2->setCanvasBkColor(RGB(250, 248, 242));
auto page3 = std::make_unique<Canvas>(0, 0, 1040, 152);
page3->setShape(StellarX::ControlShape::ROUND_RECTANGLE);
page3->setCanvasBkColor(RGB(243, 250, 244));
auto tabPage1Ptr = page1.get();
auto tabPage2Ptr = page2.get();
auto tabPage3Ptr = page3.get();
tabControlPtr->add(std::make_pair(std::make_unique<Button>(0, 0, 120, 28, "页签-事件区"), std::move(page1)));
tabControlPtr->add(std::make_pair(std::make_unique<Button>(0, 0, 120, 28, "页签-空白区"), std::move(page2)));
tabControlPtr->add(std::make_pair(std::make_unique<Button>(0, 0, 120, 28, "页签-辅助区"), std::move(page3)));
tabControlPtr->setActiveIndex(0);
auto page1Label = std::make_unique<Label>(20, 10, "区域 B:打开非模态对话框后,切换页签并在页内按钮上快速 Hover。");
page1Label->setTextdisap(true);
tabPage1Ptr->addControl(std::move(page1Label));
for (int i = 0; i < 4; ++i)
{
auto pageButton = std::make_unique<Button>(190 + i * 150, 55, 110, 38, "页内按钮" + std::to_string(i + 1));
pageButton->enableTooltip(true);
pageButton->setTooltipText("页签区按钮 " + std::to_string(i + 1));
tabPage1Ptr->addControl(std::move(pageButton));
}
auto page2Label = std::make_unique<Label>(30, 55, "区域 B-2:此页保留较大空白区,用来观察 Hover 离开空白区域时的恢复。");
page2Label->setTextdisap(true);
tabPage2Ptr->addControl(std::move(page2Label));
auto page3Label = std::make_unique<Label>(20, 18, "区域 B-3:辅助页,用来测试页签切换本身的重绘是否稳定。");
page3Label->setTextdisap(true);
auto page3Button = std::make_unique<Button>(420, 65, 180, 40, "辅助按钮");
page3Button->enableTooltip(true);
page3Button->setTooltipText("辅助页按钮 Tooltip");
tabPage3Ptr->addControl(std::move(page3Label));
tabPage3Ptr->addControl(std::move(page3Button));
auto table = std::make_unique<Table>(240, 470);
auto tablePtr = table.get();
tablePtr->setHeaders({ "编号", "名称", "状态", "备注" });
tablePtr->setData({
{"01", "顶部按钮覆盖测试", "待验证", "快速 Hover 后不能残留高亮"},
{"02", "页签切换测试", "待验证", "页签按钮与页内容不应穿透"},
{"03", "分页按钮测试", "待验证", "被非模态部分覆盖时仍应稳定"},
{"04", "模态 Resize 测试", "待验证", "拖窗后标题、关闭按钮不应残影"},
{"05", "关闭后 Hover 恢复", "待验证", "模态关闭后底层按钮 Hover 应恢复"}
});
tablePtr->setRowsPerPage(2);
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);
const std::string asyncText =
"KEY4 非模态回归测试正在进行。\n"
"请依次检查以下场景:\n"
"1. 在顶部按钮之间快速来回移动鼠标。\n"
"2. 切换页签,并在页签按钮与页内按钮上快速 Hover。\n"
"3. 将鼠标移动到表格分页按钮附近,观察是否闪烁或穿透。\n"
"4. 将鼠标移出窗口后再移回窗口。\n"
"5. 保持本对话框打开,确认它始终位于最上层。\n"
"6. 若需要重复测试,可直接再次点击右上角按钮。\n"
"7. 本对话框故意较高,以覆盖顶部按钮、页签区与部分分页区。\n"
"8. 顶部按钮区域用于检测快速 Hover 残留。\n"
"9. 页签区域用于检测被遮挡时的切换与 Hover。\n"
"10. 表格分页区用于检测分页按钮被部分覆盖时的重绘。\n"
"11. 若关闭本对话框,请观察底层 Hover 是否立即恢复。\n"
"12. 本消息框保留较多行,是为了增大对遮挡场景的覆盖范围。";
const std::string modalText =
"KEY4 模态回归测试。\n"
"请在本对话框保持打开时执行:\n"
"1. 拖拽窗口大小,观察标题、关闭按钮与功能按钮是否残影。\n"
"2. 拖拽后点击关闭按钮。\n"
"3. 拖拽后点击功能按钮。\n"
"4. 对话框关闭后,将鼠标停在底层顶部按钮上,观察 Hover 是否恢复。";
openAsyncButtonPtr->setOnClickListener([&win, asyncText]()
{
StellarX::MessageBox::showAsync(
win,
asyncText,
"KEY4 非模态综合回归",
StellarX::MessageBoxType::YesNoCancel,
[](StellarX::MessageBoxResult result)
{
SX_LOGI("KEY4") << "非模态对话框结果=" << (int)result;
});
});
openModalButtonPtr->setOnClickListener([&win, modalText]()
{
auto result = StellarX::MessageBox::showModal(
win,
modalText,
"KEY4 模态综合回归",
StellarX::MessageBoxType::OKCancel);
SX_LOGI("KEY4") << "模态对话框结果=" << (int)result;
});
win.addControl(std::move(infoPanel));
win.addControl(std::move(hoverCanvas));
win.addControl(std::move(tabControl));
win.addControl(std::move(table));
win.draw();
return win.runEventLoop();
}
#endif
#if 2 == KEY
// 本工具基于 StellarX 构建,轻量级的 Windows GUI 框架。
#include"StellarX.h"