Contributor: TIM BAKER


{Automatic sizing with taskbar in Win95 and NT-Shell update  }
{Modified by Tim Baker timbaker@mail.infinet.com to use the  }
{TWMGETMINMAXINFO Windows message                            }
{Original procedure for sizing for Win95/NtShell TaskBar from}
{Peter M. Jagielski 73737,1761@compuserve.com.               }

{This is freeware and freely distributable, just include the }
{above five lines just before the procedure in your progam.  }

{After adding this to your program, run it, maximize your     }
{window, and move the task bar around the screen.  Your       }
{program will automatically change its position and size.     }

{Just after your normal procedure definitions in your class(tform) type      }
{and before your private variable declarataions, Add the following two lines }
{Without the comment brackets of course                                      }
{  private                                                                   }
{    procedure mymax(var msg: TWMGETMINMAXINFO);  message wm_getminmaxinfo;  }

procedure Tform1.mymax(var msg : TWMGETMINMAXINFO);
Const
   MyMinimumWidth = 600;
   MyMinimumHeight = 440;
var
  Width1,Height1,Top1,Left1:Integer;
  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,           { Heigth of client area in pixels }
  CyCaption:     Integer; { Height of a window's title bar in pixels }
begin
   {Remove the next two lines if you do not require a minimum width or height}
   msg.minmaxinfo^.ptMinTrackSize.x := MyMinimumWidth;
   msg.minmaxinfo^.ptMinTrackSize.y := MyMinimumHeight;

   if FindWindow('Shell_TrayWnd',Nil)=0 then
      begin
         {Neither Windows 95 nor the NT Shell Update are running}
         msg.minmaxinfo^.ptMaxTrackSize.x := GetSystemMetrics(SM_CXSCREEN);
         msg.minmaxinfo^.ptMaxTrackSize.y := GetSystemMetrics(SM_CYSCREEN);
      end
   else
      begin
         { Get coordinates of Win95 Taskbar }
         GetWindowRect(TaskBarHandle,TaskBarCoord);
         { Get various screen dimensions and set form's width/height }
         CxScreen      := GetSystemMetrics(SM_CXSCREEN);
         CyScreen      := GetSystemMetrics(SM_CYSCREEN);
         CxFullScreen  := GetSystemMetrics(SM_CXFULLSCREEN);
         CyFullScreen  := GetSystemMetrics(SM_CYFULLSCREEN);
         CyCaption     := GetSystemMetrics(SM_CYCAPTION);
         Width1  := CxScreen - (CxScreen - CxFullScreen) + 1;
         Height1 := CyScreen - (CyScreen - CyFullScreen) + CyCaption + 1;
         Top1    := 0;
         Left1   := 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 }
               Top1  := TaskBarCoord.Bottom
            else
               { Taskbar on left }
               Left1 := TaskBarCoord.Right;
         {Set the minimum positions and sizes}
         msg.MinMaxInfo^.ptMaxPosition.x  := left1;
         msg.MinMaxInfo^.ptMaxPosition.y  := top1;
         msg.minmaxinfo^.ptMaxTrackSize.x := Width1;
         msg.minmaxinfo^.ptMaxTrackSize.y := Height1;
      end;
end;