mirror of
https://github.com/Blinue/Magpie.git
synced 2026-06-24 02:04:10 +00:00
* 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: 小优化
94 lines
2 KiB
C++
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
|
|
);
|
|
}
|