我有一个窗口,周围有一个坚固的边框。如何使用 SetWindowLong 和 GetWindowLong 删除边框(所有非客户区域)?
答案 0 :(得分:49)
在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);
答案 1 :(得分:8)
以下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调用在所有语言中看起来都一样。
答案 2 :(得分:6)
下面这行代码删除了任何给定窗口的边框,并且只保留其客户端:
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
或/和WS_OVERLAPPEDWINDOW
或/和WS_SIZEFRAME
。
注意:如果您尝试我的答案,但它不适合您,可以这样做,因为SetWindowLong
和GetWindowLong
这两个函数都有已取代并且不适合您,因为它们与仅 32位版本的Windows兼容。您可能正在使用 64位版本的Windows,然后使用SetWindowLongPtr
和GetWindowLongPtr
代替 32-位和 64位版本的Windows。 MSDN在注意部分中通知了这些功能。只需在该网站中搜索它们即可。以下是他们的链接:
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
希望所有这些都能回答你的问题。
答案 3 :(得分: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;
}