SetWindowPos hwnd, 0, 0, 0, 0, 0, SWP_NOZORDER Or SWP_NOSIZE Or SWP_NOMOVE Or SWP_DRAWFRAME Or SWP_NOREDRAW给窗口画边框时顶部的白边要怎么去掉,实际是要实现无边框窗体的缩放
时间: 2024-06-08 08:08:22 浏览: 207
要实现无边框窗体的缩放,可以使用以下方法:
1. 在窗口创建时,设置窗口样式为 WS_POPUP,同时设置 WS_THICKFRAME 样式来启用窗口缩放功能。
2. 在窗口消息处理函数中,对 WM_NCCALCSIZE 消息进行处理,以便在窗口缩放时正确调整客户区和非客户区的大小。
3. 在 WM_NCHITTEST 消息处理函数中,检测鼠标是否在窗口的边框区域内,并根据鼠标位置返回相应的窗口大小调整标记。
4. 在 WM_GETMINMAXINFO 消息处理函数中,设置窗口的最小和最大尺寸,以便在窗口缩放时限制窗口的大小。
以下是实现无边框窗体缩放的示例代码:
```
// 设置 WS_POPUP 和 WS_THICKFRAME 样式
DWORD dwStyle = WS_POPUP | WS_THICKFRAME;
DWORD dwExStyle = WS_EX_APPWINDOW;
// 创建窗口
HWND hWnd = CreateWindowEx(dwExStyle, szClassName, szTitle, dwStyle, x, y, cx, cy, NULL, NULL, hInstance, NULL);
// 处理 WM_NCCALCSIZE 消息
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_NCCALCSIZE:
{
// 调整客户区和非客户区的大小
if (wParam)
{
NCCALCSIZE_PARAMS* pncsp = reinterpret_cast<NCCALCSIZE_PARAMS*>(lParam);
pncsp->rgrc[0].left += BORDER_SIZE;
pncsp->rgrc[0].top += BORDER_SIZE;
pncsp->rgrc[0].right -= BORDER_SIZE;
pncsp->rgrc[0].bottom -= BORDER_SIZE;
}
return 0;
}
case WM_NCHITTEST:
{
// 检测鼠标是否在窗口的边框区域内
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
RECT rc;
GetWindowRect(hWnd, &rc);
if (pt.x >= rc.left && pt.x < rc.left + BORDER_SIZE && pt.y >= rc.top && pt.y < rc.top + BORDER_SIZE)
return HTTOPLEFT;
if (pt.x >= rc.right - BORDER_SIZE && pt.x < rc.right && pt.y >= rc.top && pt.y < rc.top + BORDER_SIZE)
return HTTOPRIGHT;
if (pt.x >= rc.left && pt.x < rc.left + BORDER_SIZE && pt.y >= rc.bottom - BORDER_SIZE && pt.y < rc.bottom)
return HTBOTTOMLEFT;
if (pt.x >= rc.right - BORDER_SIZE && pt.x < rc.right && pt.y >= rc.bottom - BORDER_SIZE && pt.y < rc.bottom)
return HTBOTTOMRIGHT;
if (pt.x >= rc.left && pt.x < rc.left + BORDER_SIZE)
return HTLEFT;
if (pt.x >= rc.right - BORDER_SIZE && pt.x < rc.right)
return HTRIGHT;
if (pt.y >= rc.top && pt.y < rc.top + BORDER_SIZE)
return HTTOP;
if (pt.y >= rc.bottom - BORDER_SIZE && pt.y < rc.bottom)
return HTBOTTOM;
return HTCLIENT;
}
case WM_GETMINMAXINFO:
{
// 设置窗口的最小和最大尺寸
MINMAXINFO* pmmi = reinterpret_cast<MINMAXINFO*>(lParam);
pmmi->ptMinTrackSize.x = MIN_WIDTH;
pmmi->ptMinTrackSize.y = MIN_HEIGHT;
pmmi->ptMaxTrackSize.x = MAX_WIDTH;
pmmi->ptMaxTrackSize.y = MAX_HEIGHT;
return 0;
}
// 处理其它消息
...
}
```
阅读全文