gpt4 book ai didi

delphi - 你能在Windows中制作一个没有WS_POPUP风格的无边界应用程序主窗口吗?

转载 作者:行者123 更新时间:2023-12-03 14:46:41 29 4
gpt4 key购买 nike

我想创建一个将成为主窗口并且 Windows 本身识别为主应用程序窗口的窗口。但是,当我将窗口设置为无边框并且完全没有任何非客户端区域时,Windows 不再识别该窗口是应用程序主窗口。这有几个副作用:

  1. WindowsKey+M 最小化除应用程序主窗口之外的所有窗口。

  2. 在任务栏上单击一次(在 win7 中),然后再次单击,应在正常状态和最小化状态之间切换应用程序主窗口的状态/可见性。这不适用于这样的窗口。

用纯粹的 Win32 编程术语来说,我正在询问 dwStyle 的参数值。就像调用 CreateWindow 时一样(WS_...常量),或CreateWindowEx(WS_EX_...常量)。对于 delphi 用户,这些值将在 CreateParams 方法中设置,您将覆盖该方法,然后设置 Params.Style := WS_xxx;对于 MFC/C++ 用户和 C 用户,框架中的某些内容最终将使用此 dwStyle 值调用 CreateWindow。

用delphi术语来说,设置form.BorderStyle=bsNone,结果是dwStyle=WS_POPUP。但是我想要一个无边框窗口而不使用 dwStyle=WS_POPUP。

注意:下面的所有答案都很好,但是在生产场景中使用每个答案都是有问题的,我的尝试这样做导致遇到了许多故障,对于专业质量的应用程序,我仍然发现我无法解决。 David 的答案是一个很棒的纯 Win32 API 答案,并且符合要求。看起来工业强度的解决方案应该结合多种品质,包括我在上面的问题中所拥有的所有品质。简而言之,使用 BorderStyle=bsNone (dwStyle=WS_POPUP) 的无边框表单会阻止通常应用于应用程序主窗口的所有 Windows 功能,下面的所有解决方案都解决了部分问题。

根据大卫的建议,我写了以下内容,但不起作用:我想要一个没有边框的窗口,对于系统来说,它的所有行为都像Windows应用程序窗口一样,也就是说,可以通过单击任务栏中的窗口来最小化/恢复,并且将通过WindowsKey+M最小化。我开始认为执行此操作的唯一方法是添加非客户端绘制代码并将顶部非客户端区域边界的大小调整为零。这当然不是一个简单的想法。

事实证明,我在编码中犯了一个简单的错误(因此出现了上面的两段),实际上下面的代码现在可以按照我的意愿工作。这是用 pascal 编写的,但应该很容易将其转换为 C++ 或其他语言。

program NoBorderProject;

uses
Windows, Messages;
{the Messages unit contains the windows
Message constants like WM_COMMAND}

{$R *.RES}

var
wClass: TWndClass;
Msg: TMsg;
win:HWND;
function WindowProc(hWnd,Msg,wParam,lParam:Integer):Integer; stdcall;
begin
if Msg = WM_DESTROY then PostQuitMessage(0);
Result := DefWindowProc(hWnd,Msg,wParam,lParam);
end;

begin
wClass.lpszClassName:= 'CN';
wClass.lpfnWndProc := @WindowProc;
wClass.hInstance := hInstance;
wClass.hbrBackground:= 1;
RegisterClass(wClass);
win := CreateWindow(wClass.lpszClassName,'Title Bar',
WS_POPUP,//WS_OVERLAPPEDWINDOW or WS_VISIBLE,
10,10,340,220,0,0,hInstance,nil);
SetWindowLong(win, GWL_STYLE, WS_POPUP or WS_MINIMIZEBOX);
SetWindowLong(win, GWL_EXSTYLE, 0 );
ShowWindow(win,SW_SHOW);
while GetMessage(Msg,0,0,0) do
DispatchMessage(Msg);
end.

最佳答案

以下内容可以完成工作:

hWnd = CreateWindow(...);
SetWindowLong(hWnd, GWL_STYLE, WS_POPUP | WS_MINIMIZEBOX);
SetWindowLong(hWnd, GWL_EXSTYLE, 0);
ShowWindow(hWnd, ...);

您可能缺少WS_MINIMIZEBOX

关于delphi - 你能在Windows中制作一个没有WS_POPUP风格的无边界应用程序主窗口吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4901965/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com