使用固定的顶部坐标创建可调整大小的 window
Create resizable window with fixed top coordinate
我想实现一个 window,它的顶部坐标始终是 X(为简单起见,假设为 0)。意思是,window 的顶部固定在屏幕顶部的 0 上。
我已经实现了 window,使用 SetWindowPos 设置了它的位置,但我正在努力维护它的顶部坐标值。
您可以创建一个没有标题栏的window,例如
CreateWindow(className, title, WS_THICKFRAME | WS_POPUP, ...)
然后覆盖 WM_NCHITTEST
以更改上下移动 window 的请求。
如果window有标题栏,例如:
CreateWindow(className, title, WS_OVERLAPPEDWINDOW, ...)
然后也为 WM_WINDOWPOSCHANGING
添加覆盖:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_NCHITTEST:
{
LRESULT lresult = DefWindowProc(hwnd, msg, wParam, lParam);
switch (lresult)
{
case HTTOP: lresult = HTCLIENT; break;
case HTTOPLEFT: lresult = HTLEFT; break;
case HTTOPRIGHT: lresult = HTRIGHT; break;
}
return lresult;
}
case WM_WINDOWPOSCHANGING:
{
WINDOWPOS* wndpos = (WINDOWPOS*)lParam;
wndpos->y = 100;//choose a fixed position
break;
}
...
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
我想实现一个 window,它的顶部坐标始终是 X(为简单起见,假设为 0)。意思是,window 的顶部固定在屏幕顶部的 0 上。
我已经实现了 window,使用 SetWindowPos 设置了它的位置,但我正在努力维护它的顶部坐标值。
您可以创建一个没有标题栏的window,例如
CreateWindow(className, title, WS_THICKFRAME | WS_POPUP, ...)
然后覆盖 WM_NCHITTEST
以更改上下移动 window 的请求。
如果window有标题栏,例如:
CreateWindow(className, title, WS_OVERLAPPEDWINDOW, ...)
然后也为 WM_WINDOWPOSCHANGING
添加覆盖:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_NCHITTEST:
{
LRESULT lresult = DefWindowProc(hwnd, msg, wParam, lParam);
switch (lresult)
{
case HTTOP: lresult = HTCLIENT; break;
case HTTOPLEFT: lresult = HTLEFT; break;
case HTTOPRIGHT: lresult = HTRIGHT; break;
}
return lresult;
}
case WM_WINDOWPOSCHANGING:
{
WINDOWPOS* wndpos = (WINDOWPOS*)lParam;
wndpos->y = 100;//choose a fixed position
break;
}
...
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}