如何从Windows win32应用程序中删除标题栏和按钮

nhn9ugyo  于 2023-05-08  发布在  Windows
关注(0)|答案(1)|浏览(439)

我正在Flutter中开发一个跨平台应用程序,我想启动一个没有标题栏和窗口控制按钮的半透明背景应用程序。在屏幕的右下角。
它似乎工作得很好,但当启动应用程序时,它会首先显示边框和标题栏。然后当我开始调整窗口大小时,它看起来就像我想要的那样。
这是我用于效果的代码:

HWND window = CreateWindow(
     window_class, title.c_str(), WS_OVERLAPPEDWINDOW,
     Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
     Scale(size.width, scale_factor), Scale(size.height, scale_factor),
     nullptr, nullptr, GetModuleHandle(nullptr), this);

// Hide the window control buttons (minimize, maximize, close)
SetWindowLong(window, GWL_STYLE, GetWindowLong(window, GWL_STYLE) & ~WS_SYSMENU);

// Hide the window titlebar
SetWindowLong(window, GWL_STYLE, GetWindowLong(window, GWL_STYLE) & ~WS_CAPTION);

这是应用程序启动时的样子:

这是我希望应用程序启动的方式(调整大小后,它看起来像这样):

mkshixfv

mkshixfv1#

你应该在CreateWindow()调用本身中只指定你实际需要的样式,而不是在窗口创建后删除不需要的样式。
例如,您可以执行以下操作:

CreateWindow(..., WS_OVERLAPPEDWINDOW & ~(WS_SYSMENU | WS_CAPTION), ...);

其等同于:

CreateWindow(..., WS_OVERLAPPED | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, ...);

但是,由于没有使用WS_SYSMENU,因此可以省略2个WS_...BOX样式:

CreateWindow(..., WS_OVERLAPPED | WS_THICKFRAME, ...);

而且,由于您无论如何都要禁用标题栏,因此您并不真的需要WS_OVERLAPPED(它有标题栏),因此您可能应该使用WS_POPUP来代替,正如@user20716902所提到的:

CreateWindow(..., WS_POPUP | WS_THICKFRAME, ...);

相关问题