2007. május 18., péntek

Filling the screen with your form


Problem/Question/Abstract:

I'd like to resize a form and have it fill up the screen. But I don't want it to display over the Win95/WinNT taskbar. Is there a way to do this?

Answer:

I put the code in a component wrapper so all you have to do is drop the component onto any form, call the component's execute procedure in FormCreate, and voila! an instantly sized form that fits nicely within your screen, above the Taskbar.

For Non-Windows 95 users, your form will be sized to maximized, but will be still be FormStyle := wsNormal. Select the text below, put it in a file, save the file as SizeTask.pas, add into your component library, drop it into a form, and watch it go!

unit Sizetask;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs;

type
  TSizer = class(TComponent)
  private
    { Private declarations }
  protected
    { Protected declarations }
    procedure SetSize(MyForm: TForm);
  public
    { Public declarations }
    procedure Execute;
  end;

procedure Register;

implementation

procedure TSizer.Execute;
begin
  SetSize(TForm(Owner));
end;

procedure TSizer.SetSize(MyForm: TForm);
var
  TaskBarHandle: HWnd; { Handle to the Win95 Taskbar }
  TaskBarCoord: TRect; { Coordinates of the Win95 Taskbar }
  CxScreen, { Width of screen in pixels }
  CyScreen, { Height of screen in pixels }
  CxFullScreen, { Width of client area in pixels }
  CyFullScreen, { Height of client area in pixels }
  CyCaption: Integer; { Height of a window's title bar in pixels }
begin
  TaskBarHandle := FindWindow('Shell_TrayWnd', nil); { Get Win95 Taskbar handle }
  if TaskBarHandle = 0 then { We're running Win 3.x or WinNT w/o Win95
    shell, so just maximize }
    MyForm.WindowState := wsMaximized
  else { We're running Win95 or WinNT w/Win95 shell }
  begin
    MyForm.WindowState := wsNormal;
    GetWindowRect(TaskBarHandle, TaskBarCoord); { Get coordinates of Win95 Taskbar }
    CxScreen := GetSystemMetrics(SM_CXSCREEN);
      { Get various screen dimensions and set form's width/height }
    CyScreen := GetSystemMetrics(SM_CYSCREEN);
    CxFullScreen := GetSystemMetrics(SM_CXFULLSCREEN);
    CyFullScreen := GetSystemMetrics(SM_CYFULLSCREEN);
    CyCaption := GetSystemMetrics(SM_CYCAPTION);
    MyForm.Width := CxScreen - (CxScreen - CxFullScreen) + 1;
    MyForm.Height := CyScreen - (CyScreen - CyFullScreen) + CyCaption + 1;
    MyForm.Top := 0;
    MyForm.Left := 0;
    if (TaskBarCoord.Top = -2) and (TaskBarCoord.Left = -2) then
      {Taskbar on either top or left }
      if TaskBarCoord.Right > TaskBarCoord.Bottom then { Taskbar on top }
        MyForm.Top := TaskBarCoord.Bottom
      else { Taskbar on left }
        MyForm.Left := TaskBarCoord.Right;
  end;
end;

procedure Register;
begin
  RegisterComponents('Samples', [TSizer]);
end;

end.

Nincsenek megjegyzések:

Megjegyzés küldése