Setting the main window size

All graphical and user interfaces problems

Setting the main window size

Postby Robert » Tue Jan 22, 2019 4:17 pm

I would like to write some code in my System/Mod/Config file that sets the main window to a specified (constant) size. Can anyone help me with some suggestions or examples?
Thanks.
User avatar
Robert
 
Posts: 127
Joined: Sat Sep 28, 2013 11:04 am
Location: Edinburgh, Scotland

Re: Setting the main window size

Postby Ivan Denisov » Tue Jan 22, 2019 7:15 pm

There is one module, which I wrote for internal windows.
Code: Select all
MODULE CpcWindows;

   IMPORT HostWindows, Views, WinApi, Windows;

   PROCEDURE GetWindow (name: ARRAY OF CHAR): Windows.Window;
      VAR win, winTmp: Windows.Window; title: Views.Title;
   BEGIN
      win := Windows.dir.First();
      winTmp := NIL;
      WHILE (win # NIL) & (winTmp = NIL) DO
         win.GetTitle(title);
         IF title$ = name$ THEN
            winTmp := win
         END;
         win := Windows.dir.Next(win)
      END;
      RETURN winTmp
   END GetWindow;

   PROCEDURE SetWindow* (name: ARRAY OF CHAR; x, y: INTEGER);
      VAR win: Windows.Window; ret: WinApi.BOOL;
   BEGIN
      win := GetWindow(name);
      IF win # NIL THEN
         ret := WinApi.SetWindowPos(win(HostWindows.Window).wnd, 0, x, y, 0, 0,
         WinApi.SWP_NOSIZE + WinApi.SWP_NOZORDER + WinApi.SWP_NOACTIVATE)
      END
   END SetWindow;

   PROCEDURE ResizeWindow* (name: ARRAY OF CHAR; w, h: INTEGER);
      VAR win: Windows.Window; ret: WinApi.BOOL;
   BEGIN
      win := GetWindow(name);
      IF win # NIL THEN
         ret := WinApi.SetWindowPos(win(HostWindows.Window).wnd, 0, 0, 0, w, h,
         WinApi.SWP_NOMOVE + WinApi.SWP_NOZORDER + WinApi.SWP_NOACTIVATE)
      END
   END ResizeWindow;

   PROCEDURE Close* (name: ARRAY OF CHAR);
      VAR win: Windows.Window;
   BEGIN
      ASSERT(name$ # "", 20);
      win := GetWindow(name);
      IF win # NIL THEN
         Windows.dir.Select(win, FALSE);
         Windows.dir.Close(win)
      END
   END Close;

END CpcWindows.


Use HostWindows.main instead of win(HostWindows.Window).wnd and you do not need GetWindow for such a case.
User avatar
Ivan Denisov
 
Posts: 255
Joined: Tue Sep 17, 2013 12:21 am
Location: Krasnoyarsk, Russia

Re: Setting the main window size

Postby Ivan Denisov » Tue Jan 22, 2019 7:19 pm

Also this peace of code as an example, how to control window resize behavior and decoration.

Code: Select all
   PROCEDURE TrackWindow* (wnd: Windows.Window);
      VAR res: WinApi.BOOL; hnd: WinApi.HANDLE; style: SET;
   BEGIN
      hnd := wnd(HostWindows.Window).wnd;
      style := BITS(WinApi.GetWindowLongA(hnd, WinApi.GWL_STYLE));
      style := style - WinApi.WS_THICKFRAME - WinApi.WS_CAPTION;
      res := WinApi.SetWindowLongA(hnd, WinApi.GWL_STYLE, ORD(style));
      style := BITS(WinApi.GetWindowLongA(hnd, WinApi.GWL_EXSTYLE));
      style := style - WinApi.WS_EX_DLGMODALFRAME - WinApi.WS_EX_CLIENTEDGE - WinApi.WS_EX_STATICEDGE;
      res := WinApi.SetWindowLongA(hnd, WinApi.GWL_EXSTYLE, ORD(style))
   END TrackWindow;
   
   PROCEDURE UntrackWindow* (wnd: Windows.Window);
      VAR res: WinApi.BOOL; hnd: WinApi.HANDLE; style: SET; wp: WinApi.WINDOWPLACEMENT;
   BEGIN
      hnd := wnd(HostWindows.Window).wnd;
      style := BITS(WinApi.GetWindowLongA(hnd, WinApi.GWL_STYLE));
      style := style + WinApi.WS_THICKFRAME + WinApi.WS_CAPTION;
      res := WinApi.SetWindowLongA(hnd, WinApi.GWL_STYLE, ORD(style));
      style := BITS(WinApi.GetWindowLongA(hnd, WinApi.GWL_EXSTYLE));
      style := style + WinApi.WS_EX_DLGMODALFRAME + WinApi.WS_EX_CLIENTEDGE + WinApi.WS_EX_STATICEDGE;
      res := WinApi.SetWindowLongA(hnd, WinApi.GWL_EXSTYLE, ORD(style));
      res := WinApi.GetWindowPlacement(hnd, wp);
      DEC(wp.rcNormalPosition.right, wp.rcNormalPosition.left); DEC(wp.rcNormalPosition.bottom, wp.rcNormalPosition.top);
      res := WinApi.SetWindowPos(hnd, 0, 0, 0, wp.rcNormalPosition.right, wp.rcNormalPosition.bottom, WinApi.SWP_NOZORDER + WinApi.SWP_FRAMECHANGED + WinApi.SWP_NOACTIVATE)
   END UntrackWindow;
User avatar
Ivan Denisov
 
Posts: 255
Joined: Tue Sep 17, 2013 12:21 am
Location: Krasnoyarsk, Russia

Re: Setting the main window size

Postby Robert » Tue Jan 22, 2019 9:07 pm

Thanks Ivan.

I already knew how to write your GetWindow procedure, but it does not help here as I wanted the main window. But the suggestion to use HostWindows.main was precisely the information I needed.

My code is
Code: Select all
res  :=  WinApi.MoveWindow (HostWindows.main, -8, 0, 2638, 1086, 1)
The position and size parameters were obtained by trial and error. I'm sure there is a more sophisticated solution, but this is adequate for my immediate needs. (It is odd that I need an x-position of -8 pixels to align the window with the left of my (dual) screen!)

Thanks.
User avatar
Robert
 
Posts: 127
Joined: Sat Sep 28, 2013 11:04 am
Location: Edinburgh, Scotland


Return to GUI problems

Who is online

Users browsing this forum: No registered users and 0 guests

cron