使Delphi应用程序完全全屏显示的最佳方法是什么?

使Delphi应用程序完全全屏显示的最佳方法是什么?,delphi,delphi-2007,Delphi,Delphi 2007,使delphi应用程序(此处为delphi 2007 for win32)完全全屏运行、删除应用程序边框并覆盖windows任务栏的最佳方法是什么 我正在寻找类似IE在你点击F11时所做的事情 我希望这是用户的运行时选项,而不是我自己的设计时决策 如已接受的答复中所述 BorderStyle := bsNone; 这是做这件事的方法之一。奇怪的是,在使用该行时,我不断得到一个不兼容的E2010类型:“TFormBorderStyle”和“TBackGroundSymbol”错误(另一个类型定

使delphi应用程序(此处为delphi 2007 for win32)完全全屏运行、删除应用程序边框并覆盖windows任务栏的最佳方法是什么

我正在寻找类似IE在你点击F11时所做的事情

我希望这是用户的运行时选项,而不是我自己的设计时决策

如已接受的答复中所述

BorderStyle := bsNone; 
这是做这件事的方法之一。奇怪的是,在使用该行时,我不断得到一个不兼容的E2010类型:“TFormBorderStyle”和“TBackGroundSymbol”错误(另一个类型定义了
bsNone

为了克服这个问题,我必须使用:

BorderStyle := Forms.bsNone;
最大化的形式和效果。最大化行是从内存中完成的,但我非常确定WindowsState是您想要的属性

还有一篇文章,但我觉得太复杂了

procedure TForm1.FormCreate(Sender: TObject) ;
begin
   //maximize the window
   WindowState := wsMaximized;
   //hide the title bar
   SetWindowLong(Handle,GWL_STYLE,GetWindowLong(Handle,GWL_STYLE) and not WS_CAPTION);
   ClientHeight := Height;
end;
编辑:这是一个完整的示例,带有“全屏”和“还原”选项。我已经将不同的部分分解成一些小程序,以获得最大的清晰度,因此可以将这些内容压缩成几行

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    btnGoFullScreen: TButton;
    btnNotFullScreen: TButton;
    btnShowTitleBar: TButton;
    btnHideTitleBar: TButton;
    btnQuit: TButton;
    procedure btnGoFullScreenClick(Sender: TObject);
    procedure btnShowTitleBarClick(Sender: TObject);
    procedure btnHideTitleBarClick(Sender: TObject);
    procedure btnNotFullScreenClick(Sender: TObject);
    procedure btnQuitClick(Sender: TObject);
  private
    SavedLeft : integer;
    SavedTop : integer;
    SavedWidth : integer;
    SavedHeight : integer;
    SavedWindowState : TWindowState;
    procedure FullScreen;
    procedure NotFullScreen;
    procedure SavePosition;
    procedure HideTitleBar;
    procedure ShowTitleBar;
    procedure RestorePosition;
    procedure MaximizeWindow;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnQuitClick(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TForm1.btnGoFullScreenClick(Sender: TObject);
begin
  FullScreen;
end;

procedure TForm1.btnNotFullScreenClick(Sender: TObject);
begin
  NotFullScreen;
end;

procedure TForm1.btnShowTitleBarClick(Sender: TObject);
begin
  ShowTitleBar;
end;

procedure TForm1.btnHideTitleBarClick(Sender: TObject);
begin
  HideTitleBar;
end;

procedure TForm1.FullScreen;
begin
  SavePosition;
  HideTitleBar;
  MaximizeWindow;
end;

procedure TForm1.HideTitleBar;
begin
  SetWindowLong(Handle,GWL_STYLE,GetWindowLong(Handle,GWL_STYLE) and not WS_CAPTION);
  ClientHeight := Height;
end;

procedure TForm1.MaximizeWindow;
begin
  WindowState := wsMaximized;
end;

procedure TForm1.NotFullScreen;
begin
  RestorePosition;
  ShowTitleBar;
end;

procedure TForm1.RestorePosition;
begin
  //this proc uses what we saved in "SavePosition"
  WindowState := SavedWindowState;
  Top := SavedTop;
  Left := SavedLeft;
  Width := SavedWidth;
  Height := SavedHeight;
end;

procedure TForm1.SavePosition;
begin
  SavedLeft := Left;
  SavedHeight := Height;
  SavedTop := Top;
  SavedWidth := Width;
  SavedWindowState := WindowState;
end;

procedure TForm1.ShowTitleBar;
begin
  SetWindowLong(Handle,gwl_Style,GetWindowLong(Handle,gwl_Style) or ws_Caption or ws_border);
  Height := Height + GetSystemMetrics(SM_CYCAPTION);
  Refresh;
end;

end.

嗯,这对我来说一直很有效。看起来有点简单

procedure TForm52.Button1Click(Sender: TObject);
begin
  BorderStyle := bsNone;
  WindowState := wsMaximized;
end;

谷歌搜索发现了以下附加方法:

(尽管我想我还是先试试罗迪的方法)

(发件人:关于德尔福) 罗迪主题变奏曲 (以下由TeamB的Peter提供)
如何在Mainform中约束子表单,就像它是一个MDI应用程序一样,但是没有令人头痛的问题!(注意:本页上的回复帮助我实现了这一点,因此我将我的解决方案发布在此处)

后来

    procedure TForm2.WMWINDOWPOSCHANGING(var Msg: TWMWINDOWPOSCHANGING);
    var
      A, B: Integer;
      iFrameSize: Integer;
      iCaptionHeight: Integer;
      iMenuHeight: Integer;
    begin

      iFrameSize := GetSystemMetrics(SM_CYFIXEDFRAME);
      iCaptionHeight := GetSystemMetrics(SM_CYCAPTION);
      iMenuHeight := GetSystemMetrics(SM_CYMENU);

      // inside the Mainform client area
      A := Application.MainForm.Left + iFrameSize;
      B := Application.MainForm.Top + iFrameSize + iCaptionHeight + iMenuHeight;

      with Msg.WindowPos^ do
      begin

        if x <= A + StickyAt then
          x := A;

        if x + cx >= A + Application.MainForm.ClientWidth - StickyAt then
          x := (A + Application.MainForm.ClientWidth) - cx + 1;

       if y <= B + StickyAt then
         y := B;

       if y + cy >= B + Application.MainForm.ClientHeight - StickyAt then
         y := (B + Application.MainForm.ClientHeight) - cy + 1;

      end;
end;
将以下代码放入《展示》事件中:

  WindowState:=wsMaximized;
对于OnCanResize来说:

  if (newwidth<width) and (newheight<height) then
    Resize:=false;

if(newwidth您需要确保表单位置仅为poDefaultPosOnly

Form1.Position := poDefaultPosOnly;
Form1.FormStyle := fsStayOnTop;
Form1.BorderStyle := bsNone;
Form1.Left := 0;
Form1.Top := 0;
Form1.Width := Screen.Width;
Form1.Height := Screen.Height;
已在Win7 x64上测试并运行。

请尝试:

Align = alClient    
FormStyle = fsStayOnTop

这总是与主监视器对齐;

Hm。看看这些响应,我似乎记得大约8年前我在编写游戏时处理过这个问题。为了使调试更容易,我使用了普通Delphi表单的设备上下文作为全屏显示的源

要点是,DirectX能够全屏运行任何设备上下文,包括表单分配的设备上下文


因此,要使应用程序具有“真正的”全屏功能,请查找适用于Delphi的DirectX库,它可能包含您需要的现成功能。

在我的情况下,唯一可行的解决方案是:

procedure TFormHelper.FullScreenMode;
begin
  BorderStyle := bsNone;
  ShowWindowAsync(Handle, SW_MAXIMIZE);
end;

+1有时人们太努力了:哇,如果不是我自己测试的话,我不会相信。我知道设置
WindowsState:=wsMaximized
不会覆盖任务栏(它只是一个最大化的窗口)。因此,假设删除边框将导致没有边框的最大化窗口并非不合理。但在某些地方(VCL或Windows)存在一些未记录的技巧,即删除最大化窗口的边框将导致其调整大小以填充整个屏幕。(与Raymond的文章中明确根据屏幕尺寸调整窗体大小不同)Windows 7 here(64位)+Delphi XE 7:不起作用。Windows任务栏仍然显示。在Windows 8.1上测试:与W7相同+可以从右侧拖动的操作栏仍然可用。编辑:在Windows 7上可以工作(我忘记删除表单上的Align:=alClient)。但在Windows 8.1上,您可以从右侧拖动的操作栏仍然可用。有解决方案吗?如果您有双监视器怎么办?您编写的内容甚至不接近代码,缺少双点,缺少行分隔符,导致我在需要一分钟加速时额外损失了2分钟。请编写完整的有用代码,或者根本不写。{code}Align:=alClient;FormStyle:=fsStayOnTop;{code}
  WindowState:=wsMaximized;
  if (newwidth<width) and (newheight<height) then
    Resize:=false;
Form1.Position := poDefaultPosOnly;
Form1.FormStyle := fsStayOnTop;
Form1.BorderStyle := bsNone;
Form1.Left := 0;
Form1.Top := 0;
Form1.Width := Screen.Width;
Form1.Height := Screen.Height;
Align = alClient    
FormStyle = fsStayOnTop
procedure TFormHelper.FullScreenMode;
begin
  BorderStyle := bsNone;
  ShowWindowAsync(Handle, SW_MAXIMIZE);
end;