diff --git a/Canvas.cpp b/Canvas.cpp index 757db3d..ad3f911 100644 --- a/Canvas.cpp +++ b/Canvas.cpp @@ -72,7 +72,7 @@ void Canvas::draw() // 如果位置或尺寸变了,或没有有效缓存,则重新抓取 if (!saveBkImage || saveBkX != this->x - margin || saveBkY != this->y - margin || saveWidth != this->width + margin * 2 || saveHeight != this->height + margin * 2) { - discardBackground(); + invalidateBackgroundSnapshot(); saveBackground(this->x - margin, this->y - margin, this->width + margin * 2, this->height + margin * 2); } } @@ -231,7 +231,7 @@ void Canvas::setIsVisible(bool visible) control->setIsVisible(visible); } if (!visible) - this->updateBackground(); + discardBackground(); } void Canvas::setDirty(bool dirty) diff --git a/Control.cpp b/Control.cpp index e4fa405..0d28093 100644 --- a/Control.cpp +++ b/Control.cpp @@ -58,7 +58,7 @@ void Control::setIsVisible(bool show) if (!show) { // 隐藏:擦除自己在屏幕上的内容,并释放快照 - this->updateBackground(); + discardBackground(); return; } @@ -74,7 +74,7 @@ void Control::onWindowResize() << SX_T(" -> 丢背景快照 + 标脏", " -> discardSnap + dirty"); // 自己:丢快照 + 标脏 - discardBackground(); + invalidateBackgroundSnapshot(); setDirty(true); } void Control::setLayoutMode(StellarX::LayoutMode layoutMode_) @@ -200,8 +200,16 @@ void Control::discardBackground() hasSnap = false; saveWidth = saveHeight = 0; } -void Control::updateBackground() +void Control::invalidateBackgroundSnapshot() { - restBackground(); - discardBackground(); + if (saveBkImage) + { + SX_LOGD("Snap") << SX_T("作废背景快照:id=", "invalidateBackgroundSnapshot: id=") << id + << " hasSnap=" << (hasSnap ? 1 : 0); + saveBkImage.reset(); + } + hasSnap = false; + saveBkX = saveBkY = 0; + saveWidth = saveHeight = 0; } + diff --git a/Control.h b/Control.h index f40aaab..c0a8f1e 100644 --- a/Control.h +++ b/Control.h @@ -86,12 +86,12 @@ protected: virtual void saveBackground(int x, int y, int w, int h); // putimage 回屏 virtual void restBackground(); - // 释放快照(窗口重绘/尺寸变化后必须作废) + // 回贴旧背景并释放快照 void discardBackground(); public: - //释放快照重新保存,在尺寸变化时更新背景快照避免尺寸变化导致显示错位 - void updateBackground(); - //窗口变化丢快照 + // 仅作废快照,不回贴旧背景 + void invalidateBackgroundSnapshot(); + //“纯作废快照 + 标脏”,不再在 resize 路径里回贴旧背景 virtual void onWindowResize(); // 获取位置和尺寸 int getX() const { return x; } diff --git a/Dialog.cpp b/Dialog.cpp index 050de99..80049f4 100644 --- a/Dialog.cpp +++ b/Dialog.cpp @@ -247,6 +247,8 @@ void Dialog::setInitialization(bool init) { if (init) { + // 窗口缩放后的重建不能再回贴旧快照;父窗口接下来会做一次完整重绘。 + invalidateBackgroundSnapshot(); invalidateLayout(true); } else @@ -659,7 +661,7 @@ void Dialog::performDelayedCleanup() { restBackground(); FlushBatchDraw(); - discardBackground(); + invalidateBackgroundSnapshot(); } if (!(saveBkImage && hasSnap)) { @@ -701,6 +703,9 @@ std::string Dialog::GetText() const void Dialog::clearControls() { + for (auto& control : controls) + control->invalidateBackgroundSnapshot(); + controls.clear(); // 重置按钮指针 closeButton = nullptr; diff --git a/Label.cpp b/Label.cpp index 73012e7..9e861a9 100644 --- a/Label.cpp +++ b/Label.cpp @@ -56,8 +56,7 @@ void Label::draw() //用于“隐藏提示框”时调用(还原并释放快照) void Label::hide() { - restBackground(); // 还原屏幕像素 - discardBackground(); // 作废快照,防止错贴旧图 + discardBackground(); // 还原并释放快照 dirty = false; } void Label::setTextdisap(bool key) diff --git a/Table.cpp b/Table.cpp index 7d81a2b..5828605 100644 --- a/Table.cpp +++ b/Table.cpp @@ -423,7 +423,7 @@ void Table::draw() // 当尺寸变化或缓存图像无效时,需要重新截图 if (!saveBkImage || saveWidth != this->width || saveHeight != this->height) { - discardBackground(); + invalidateBackgroundSnapshot(); saveBackground(this->x, this->y, this->width, this->height); } } diff --git a/Window.cpp b/Window.cpp index aaa9ee1..1612d76 100644 --- a/Window.cpp +++ b/Window.cpp @@ -273,7 +273,7 @@ void Window::draw() { hWnd = initgraph(width, height, windowMode); } - + // 子类化:让我们的 WndProcThunk 接管窗口消息(仅执行一次) if (!procHooked) { @@ -779,7 +779,6 @@ void Window::pumpResizeIfNeeded() for (auto& c : controls) { adaptiveLayout(c, finalH, finalW); - c->onWindowResize(); } for (auto& d : dialogs) if (auto* dd = dynamic_cast(d.get())) diff --git a/z-testDome.cpp b/z-testDome.cpp index 7bdd2b7..8ba9909 100644 --- a/z-testDome.cpp +++ b/z-testDome.cpp @@ -1,6 +1,6 @@ // 本工具基于 StellarX 构建,轻量级的 Windows GUI 框架。 #include"StellarX.h" -#define KEY 1 +#define KEY 2 #if 1 == KEY int main() @@ -560,6 +560,8 @@ int main() configuration->addControl(std::move(signedToggle)); configuration->addControl(std::move(configurationLabel)); + selectionArea->setAnchor(StellarX::Anchor::Right, StellarX::Anchor::Left); + selectionArea->setLayoutMode(StellarX::LayoutMode::AnchorToEdges); mainWindow.addControl(std::move(selectionArea)); mainWindow.addControl(std::move(function)); mainWindow.addControl(std::move(NumericalDisplayArea)); @@ -580,7 +582,7 @@ int main() { StellarX::SxLogger::setGBK(); StellarX::SxLogger::Get().enableConsole(true); - StellarX::SxLogger::Get().setMinLevel(StellarX::SxLogLevel::Trace); // Info/Debug/Trace 自己切 + StellarX::SxLogger::Get().setMinLevel(StellarX::SxLogLevel::Debug); // Info/Debug/Trace 自己切 StellarX::SxLogger::Get().setLanguage(StellarX::SxLogLanguage::ZhCN); // ZhCN / EnUS Window win(1300, 800, 1, RGB(255, 255, 0), "记账管理系统"); @@ -691,7 +693,7 @@ int main() if ("\0" == logIn_textBox_ptr[0]->getText())logIn_textBox_ptr[0]->setTextBoxBk(RGB(255, 0, 0)); if ("\0" == logIn_textBox_ptr[1]->getText())logIn_textBox_ptr[1]->setTextBoxBk(RGB(255, 0, 0)); std::cout << "\a"; - StellarX::MessageBox::showAsync(win, "账号或密码不能为空!", "提示"); + StellarX::MessageBox::showModal(win, "账号或密码不能为空!", "提示"); } else {