Magpie/tools/WindowCase/HungWindow.cpp
Xu d01956e3a7
源窗口位于前台时始终置顶缩放窗口 (#1259)
* feat: 模拟中途置顶的窗口

* fix: 按钮随 DPI 缩放

* fix: 始终置顶

* fix: 修复切换前台窗口

* feat: 删除置顶选项

* refactor: 检查逻辑

* refactor: 用更简单的方式将缩放窗口置于源窗口之前

* fix: 支持源窗口中途置顶

* refactor: 小优化

* fix: 修复特定操作下意外将源窗口置顶

* fix: 提高取消置顶的可靠性

* fix: 调试模式下不置顶

* chore: WindowCase 支持模拟弹窗

* fix: 不要把被禁用的窗口设为前台

* feat: WindowCase 支持模拟“模拟模态弹窗”

* chore: 避免大量错误日志

* fix: 优化 Z 顺序维护

* fix: 不再使用 SWP_NOOWNERZORDER

* fix: 修复消息弹窗可能影响窗口 Z 顺序

* refactor: 小优化

* chore: 添加注释

* chore: 添加注释

* fix: 小优化

* chore: 小优化
2025-08-21 17:49:05 +08:00

94 lines
2 KiB
C++

#include "pch.h"
#include "HungWindow.h"
bool HungWindow::Create(HINSTANCE hInst) noexcept {
static const wchar_t* WINDOW_NAME = L"HungWindow";
WNDCLASSEXW wcex{
.cbSize = sizeof(WNDCLASSEX),
.style = CS_HREDRAW | CS_VREDRAW,
.lpfnWndProc = _WndProc,
.hInstance = hInst,
.hCursor = LoadCursor(nullptr, IDC_ARROW),
.hbrBackground = HBRUSH(COLOR_WINDOW + 1),
.lpszClassName = WINDOW_NAME
};
if (!RegisterClassEx(&wcex)) {
return false;
}
CreateWindow(
WINDOW_NAME,
WINDOW_NAME,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInst,
this
);
if (!Handle()) {
return false;
}
const double dpiScale = _DpiScale();
SetWindowPos(Handle(), NULL, 0, 0,
std::lround(500 * dpiScale), std::lround(400 * dpiScale),
SWP_NOMOVE | SWP_SHOWWINDOW);
return true;
}
LRESULT HungWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) noexcept {
switch (msg) {
case WM_CREATE:
{
const LRESULT ret = base_type::_MessageHandler(msg, wParam, lParam);
const HMODULE hInst = GetModuleHandle(nullptr);
_hwndBtn = CreateWindow(L"BUTTON", L"无响应 10 秒",
WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, Handle(), (HMENU)1, hInst, 0);
_UpdateButtonPos();
SendMessage(_hwndBtn, WM_SETFONT, (WPARAM)_UIFont(), TRUE);
return ret;
}
case WM_SIZE:
{
_UpdateButtonPos();
break;
}
case WM_COMMAND:
{
if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == 1) {
Sleep(10000);
}
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return base_type::_MessageHandler(msg, wParam, lParam);
}
void HungWindow::_UpdateButtonPos() noexcept {
RECT clientRect;
GetClientRect(Handle(), &clientRect);
const double dpiScale = _DpiScale();
SIZE btnSize = { std::lround(120 * dpiScale),std::lround(50 * dpiScale) };
SetWindowPos(
_hwndBtn,
NULL,
((clientRect.right - clientRect.left) - btnSize.cx) / 2,
((clientRect.bottom - clientRect.top) - btnSize.cy) / 2,
btnSize.cx,
btnSize.cy,
SWP_NOACTIVATE
);
}