home *** CD-ROM | disk | FTP | other *** search
- {--------------------------------------------------------------------------
-
- HighSpeed Pascal for the Amiga
-
- WINDOW DEMO
-
- Programmed by Martin Eskildsen 1991
-
- Copyright (c) 1991 by D-House I ApS
- All rights reserved
-
-
- Version : Date (dd.mm.yy) : Comment
- -----------------------------------
- 1.00 : 20.07.91 : First version
- 1.01 : 17.09.91 : Modified for new libraries
- 1.02 : 06.11.91 : Final for first release
- 1.10 : 20.05.92 : Modified for new units
-
- --------------------------------------------------------------------------}
-
- program WindowDemo;
-
- uses Init, Intuition, Graphics;
-
- label
- 1; { Disaster branch-out }
-
- const
- MaxWindows = 7; { Can't do more because of screen size }
-
- var
- w1def : tNewWindow; { Defs for window 1 }
- wdef : tNewWindow; { Defs for other windows }
- w : array [1..MaxWindows] of pWindow; { Window records }
- i, j : integer; { Index }
- s : string; { For text string }
-
- begin
- if PrepareEnvironment('Window') then begin { Init Demo environment }
-
- Message('First, a simple window with borders only');
- with w1def do begin { Set up window: }
- LeftEdge := 20;
- TopEdge := Init.TopOffset; { Start below info window }
- Width := 210;
- Height := 75;
- DetailPen := 0; { Color to use for details }
- BlockPen := 1; { and blocks }
- Title := NIL; { Window has no title bar, so NIL }
- Flags := SMART_REFRESH or { Save parts in RAM }
- NOCAREREFRESH; { Don't want no refresh messages }
- IDCMPflags := 0; { Don't want any messages at all! }
- Type_ := CUSTOMSCREEN; { Put it on the CUSTOMSCREEN }
- FirstGadget := NIL; { No gadgets attached }
- CheckMark := NIL; { Usual check mark }
- Screen := Init.BaseScreen; { The custom screen to use }
- BitMap := NIL; { No special bitmap for window }
- MinWidth := Width; { Values for user's resizing of }
- MinHeight := Height; { window. Aren't used here as the }
- MaxWidth := MinWidth; { window can't be resized }
- MaxHeight := MaxHeight
- end;
- w[1] := OpenWindow(@w1def); { Open the window }
- if Panic(w[1] = NIL, 'Could not open window 1!') { Couldn't! }
- then goto 1; { Let's get out of here! }
-
- s := 'Window with borders only';
- with w[1]^ do begin { Put some text in the window: }
- Move_(RPort, 10,20); { (x,y) for lower left corner }
- Text_(RPort, @s[1], Ord(s[0])) { The string and length to write }
- end;
-
- Message('Then with the usual gadgets');
- wdef := w1def; { Use same def as w[1] }
- with wdef do begin { but change it a bit: }
- inc(TopEdge, 15); { Move a bit down and }
- inc(LeftEdge, 15); { to the right }
- MinWidth := 40; { Make it resizable }
- MinHeight := 20;
- MaxWidth := Init.ScrWidth;
- MaxHeight := Init.ScrHeight;
- flags := flags or WINDOWCLOSE or { Want the Close gadget, }
- WINDOWDRAG or { drag gadget, }
- WINDOWDEPTH or { depth arrangement gadgets, }
- WINDOWSIZING; { size gadget, too }
- IDCMPflags := CLOSEWINDOW_; { Want to know if user }
- { clicked the Close gadget. }
- { Note the underscore '_' }
- Title := CStrConstPtr('Window 2'#0)
- end;
- w[2] := OpenWindow(@wdef); { Open window 2 }
- if Panic(w[2] = NIL, 'Could not open window 2!') then goto 1;
-
- DisableClose(w[2]);
- { This is funny! Now, if I want to be able to sense the Close gadget I have
- to have the IDCMPflags set when opening the window. But I don't want to
- sense this message right now, so I clear the CLOSEWINDOW_ flag immediately
- upon creating the window.
- This makes the program behave properly if the user clicks the "wrong"
- Close gadget (i.e. in the wrong window) when there are two windows on the
- screen. Try to remove DisableClose and play around with the Close clicks }
-
- Message('Nice name, right? Let''s call it something else');
- SetWindowTitles(w[2],
- CStrConstPtr('Forty-two!'),
- ptr(-1)); { Don't change screen title }
-
- Inform('Say good-bye to window 2 by clicking its Close gadget');
- WaitClose(w[2]); { Wait for user to click Close gadget }
- CloseWindow(w[2]); { Close window 2 }
-
- Message('The application can resize the window (now six times)');
- for i := 1 to 6 do SizeWindow(w[1], 20, 10); { Delta x and y }
-
- Message('And change its position ten times 20 pixels');
- for i := 1 to 10 do MoveWindow(w[1], 20, 0); { Delta x and y }
-
- Message('Seen enough of that window, right? Let''s throw it away!');
- CloseWindow(w[1]);
-
- Message('We shall now create a "stack" of windows');
- wdef := w1def;
- wdef.flags := wdef.flags or WINDOWDRAG or WINDOWDEPTH;
- for i := 1 to MaxWindows do begin
- with wdef do begin
- inc(TopEdge, 10);
- inc(LeftEdge, 20);
- Title := CStrConstPtr('Window ' + chr(i + ord('@')) + #0)
- end;
- w[i] := OpenWindow(@wdef);
- if Panic(w[i] = NIL, 'Error while opening a window!') then goto 1;
- with w[i]^ do begin { Put text in window }
- Move_(RPort, 3, 20); { at (3,20) }
- for j := 1 to 24 do begin { 24 letters: Window 1 = AAAAA... }
- s[1] := chr(i + ord('@')); { Window 2 = BBBBB... etc. }
- Text_(RPort, @s[1], 1)
- end
- end
- end;
-
- Message('Now the application will "cycle" the stack');
- for i := MaxWindows downto 1 do WindowToFront(w[i]);
-
- Message('Phew! Let''s close those windows again');
- for i := MaxWindows downto 1 do CloseWindow(w[i]);
-
- 1: { Where to go if the world gets "funny" }
- CloseDown { Deinit Demo environment }
-
- end
- end.
-