删除窗口边框?

时间:2010-03-08 01:10:54

标签: winapi getwindowlong setwindowlong

我有一个窗口,周围有一个坚固的边框。如何使用 SetWindowLong GetWindowLong 删除边框(所有非客户区域)?

4 个答案:

答案 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

注意:如果您尝试我的答案,但它不适合您,可以这样做,因为SetWindowLongGetWindowLong这两个函数都有已取代并且不适合您,因为它们与 32位版本的Windows兼容。您可能正在使用 64位版本的Windows,然后使用SetWindowLongPtrGetWindowLongPtr代替 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;
}