FC2ブログ
D_DevLog
Delphiに関することを書いてみたりするかもしれない、いわゆるチラシの裏
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
アプリケーションウィンドウに対する対処 (3)
元記事のShowModal以外の対処とアプリケーションウィンドウに対する対処 (2)で書いた対処のうちの(1),(2),(4)はこんなソースを書いてメインフォームの継承クラスをTFormからTCustomMainFormに変更すれば対処できると思います。他は地道にソースを修正する必要がありそうですね。
unit AppWinFix;

interface

uses Windows, Controls, Forms, Dialogs, Messages, Classes, SysUtils;

type
  TCustomMainForm = class(TForm)
  private
    FWindowList: TList;
    procedure RestoreAllForm;
    procedure HideAllForm;
  protected
    procedure WMSize(var Message: TWMSize); message WM_SIZE;
    procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
    procedure CreateParams(var Params: TCreateParams); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    procedure ApplicationMaximize;
    procedure ApplicationMinimize;
    procedure ApplicationRestore;
  end;

implementation

{ TCustomMainForm }

procedure TCustomMainForm.ApplicationMaximize;
begin
  SendMessage(Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0 );
end;

procedure TCustomMainForm.ApplicationMinimize;
begin
  SendMessage(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0 );
end;

procedure TCustomMainForm.ApplicationRestore;
begin
  SendMessage(Handle, WM_SYSCOMMAND, SC_RESTORE, 0 );
end;

procedure TCustomMainForm.HideAllForm;
var
  i: Integer;
begin

  for i := 0 to Screen.FormCount - 1 do
  begin
    if Screen.Forms[i] = Self then
      Continue;

    if Screen.Forms[i].Visible then
    begin
      FWindowList.Add(Screen.Forms[i]);
      Screen.Forms[i].Visible := False;
    end;

  end;

end;

procedure TCustomMainForm.RestoreAllForm;
var
  Form: Pointer;
begin

  for Form in FWindowList do
  begin
    TForm(Form).Visible := True;
  end;

  FWindowList.Clear;
end;

constructor TCustomMainForm.Create(AOwner: TComponent);
begin
  FWindowList := TList.Create;
  inherited;
end;

procedure TCustomMainForm.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle and not WS_EX_TOOLWINDOW or
    WS_EX_APPWINDOW;
end;

destructor TCustomMainForm.Destroy;
begin
  inherited;
  FWindowList.Free;
end;

procedure TCustomMainForm.WMSize(var Message: TWMSize);
begin

  case Message.SizeType of
    SIZE_MINIMIZED: HideAllForm;
    SIZE_RESTORED,
    SIZE_MAXIMIZED: RestoreAllForm;
  end;

  inherited;

end;

procedure TCustomMainForm.WMSysCommand(var Message: TWmSysCommand);
begin

  case (Message.CmdType and $FFF0) of
    SC_MINIMIZE:
    begin
      ShowWindow(Handle, SW_MINIMIZE);

      if Assigned(Application.OnMinimize) then
        Application.OnMinimize(Self);

      Message.Result := 0;
    end;
    SC_RESTORE:
    begin
      ShowWindow(Handle, SW_RESTORE);

      if Assigned(Application.OnRestore) then
        Application.OnRestore(Self);

      Message.Result := 0;
    end;
  else
    inherited;
  end;

end;

initialization
  ShowWindow(Application.Handle, SW_HIDE);
  SetWindowLong(Application.Handle, GWL_EXSTYLE,
    GetWindowLong(Application.Handle, GWL_EXSTYLE) and not WS_EX_APPWINDOW
    or WS_EX_TOOLWINDOW);
  ShowWindow(Application.Handle, SW_SHOW);

  Application.ModalPopupMode := pmExplicit;

end.
スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。