delphi – 你能在Windows中创建一个没有WS_POPUP样式的无边界应用程序主窗口吗?

前端之家收集整理的这篇文章主要介绍了delphi – 你能在Windows中创建一个没有WS_POPUP样式的无边界应用程序主窗口吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想创建一个窗口,它将成为主窗口,Windows本身将其识别为主应用程序窗口.但是,当我使窗口无边框,并且根本没有任何非客户区域时,Windows不再认识到该窗口是应用程序主窗口.这有几个副作用:

> WindowsKey M最小化除应用程序主窗口之外的所有窗口.
>在任务栏上单击一次(在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的无边框窗口.

注意:下面的所有答案都很好,但是在生产场景中使用每个答案都是有问题的,而且我尝试这样做会导致遇​​到许多故障,对于专业质量的应用程序,我仍然觉得我无法解决.戴维斯的回答虽然是一个很好的纯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,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,340,220,hInstance,nil);
 SetWindowLong(win,GWL_STYLE,WS_POPUP or WS_MINIMIZEBox);
 SetWindowLong(win,GWL_EXSTYLE,0 );
 ShowWindow(win,SW_SHOW);
 while GetMessage(Msg,0) do
   DispatchMessage(Msg);
end.

解决方法

以下完成工作:
hWnd = CreateWindow(...);
SetWindowLong(hWnd,WS_POPUP | WS_MINIMIZEBox);
SetWindowLong(hWnd,0);
ShowWindow(hWnd,...);

您可能缺少WS_MINIMIZEBox.

猜你在找的Delphi相关文章