删除窗口边框?

问题描述 投票:0回答:5

我有一个窗口,周围有实心边框。如何使用 SetWindowLongGetWindowLong 删除边框(所有非客户区域)?

winapi getwindowlong setwindowlong
5个回答
58
投票

在 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);

11
投票

以下 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 调用在所有语言中看起来都是一样的。


8
投票

下面的这行代码删除了任何给定窗口的边框,只保留其客户端:

SetWindowLong(hWnd /*The handle of the window to remove its borders*/, GWL_STYLE, WS_POPUP);

您可以在

WS_POPUPWINDOW
函数的第三个参数中使用
SetWindowLong
代替。 它还会删除给定窗口的边框并且也可以工作,但不同之处在于它还在窗口的其余客户端上绘制outlined黑色矩形。该轮廓矩形的厚度为 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
或/和
WS_OVERLAPPEDWINDOW
或/和
WS_SIZEFRAME

注意:如果您尝试我的答案,但它对您不起作用,这可能是因为两个功能

SetWindowLong
GetWindowLong
已被取代并且不适合您,因为它们仅与 32 位 版本的 Windows 兼容。可能您使用的是 64 位 版本的 Windows,请改用 SetWindowLongPtr
GetWindowLongPtr
,它们与 
两者32 位64 位 版本的 Windows 兼容。 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

希望这一切能够回答您的问题。


1
投票
这将删除标题栏和垂直滚动条...

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; }
    

0
投票
我正在努力解决这个问题,因为Windows几乎立即重新添加删除的边框,没有人提到我们需要删除循环中的样式或任何东西,所以我不确定这是否已经过时或什么。

© www.soinside.com 2019 - 2024. All rights reserved.