我有一个窗口,它周围有一个实心边框。如何使用SetWindowLong和GetWindowLong删除边框(所有非客户区) ?
4 回答
在 C/C++ 中
LONG lStyle = GetWindowLong(hwnd, GWL_STYLE);
lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU);
SetWindowLong(hwnd, GWL_STYLE, lStyle);
WS_CAPTION 定义为 (WS_BORDER | WS_DLGFRAME)。您可以只删除这两种样式,因为当标题消失时,最小化最大化和系统菜单也会消失,但最好也删除它们。
最好删除扩展的边框样式。
LONG lExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
lExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
SetWindowLong(hwnd, GWL_EXSTYLE, lExStyle);
最后,要使用更改后的样式重新绘制窗口,可以使用 SetWindowPos。
SetWindowPos(hwnd, NULL, 0,0,0,0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
下面的 Delphi 代码可以做到这一点:
SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) and not WS_BORDER and not WS_SIZEBOX and not WS_DLGFRAME );
SetWindowPos(Handle, HWND_TOP, Left, Top, Width, Height, SWP_FRAMECHANGED);
当然,这些 API 调用在所有语言中看起来都是一样的。
下面的这行代码删除了任何给定窗口的边框,并且只保留了它的客户端:
SetWindowLong(hWnd /*The handle of the window to remove its borders*/, GWL_STYLE, WS_POPUP);
您可以WS_POPUPWINDOW
在函数的第三个参数中SetWindowLong
使用。它还删除了给定窗口的边框并且也可以工作,但不同之处在于它还在窗口的剩余客户端上绘制了轮廓黑色矩形。该轮廓矩形的厚度为 1 像素。WS_POPUP
不绘制那个矩形,实际上它不绘制任何东西,只是删除窗口的边框。
如果您要返回窗口的边框,在使用我上面发布的那行代码之前,请先调用下面的那行代码:
GetWindowLong(hWnd /*The handle of the window that you want to remove its borders and later return them back to it*/, GWL_STYLE);
但是当然这个函数会重新调整窗口的样式,所以创建一个新的变量来保留这些样式,即将这个变量设置为那个函数的返回值。
然后你用SetWindowLong
我上面显示的来删除它的边框,当你以后想恢复它的边框时,再回忆一下SetWindowLong
,前两个参数是相同的(hWnd和GWL_STYLE),但是第三个参数是窗口的样式从返回GetWindowLong
。如果您不想调用GetWindowLong
,但仍返回窗口的边框,则可以使用SetWindowLong
相同的前两个参数,在第三个参数中,可以使用以下之一:WS_OVERLAPPED
or/and WS_OVERLAPPEDWINDOW
or/and WS_SIZEFRAME
。
注意:如果您尝试我的回答,但它对您不起作用,这可能是因为这两个功能都已被取代SetWindowLong
并且GetWindowLong
对您不起作用,并且因为它们仅与 32 位版本兼容的窗户。可能您使用的是64 位版本的 Windows,然后改用SetWindowLongPtr
与32 位和64 位GetWindowLongPtr
版本的 Windows兼容的 and 。MSDN 在Note部分中告知了这些功能。只需在该站点中搜索它们即可。以下是它们的链接:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633591(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ ms633584(v=vs.85).aspx
希望这一切都能回答你的问题。
这将删除标题栏和垂直滚动条...
int main()
{
HWND hwnd = GetConsoleWindow();
// remove title bar
LONG lStyle = GetWindowLong(hwnd, GWL_STYLE);
lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU);
SetWindowLong(hwnd, GWL_STYLE, lStyle);
//remove vertical scrollbar
ShowScrollBar(hwnd, SB_VERT, FALSE);
cout << "Hello World! \n";
system("pause");
return 0;
}