123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- {
- $Id$
- Opening a window with optional custom screen, and
- basic event-driven drawing into the window
- Free Pascal for MorphOS example
- Copyright (C) 2004 by Karoly Balogh
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- { * 2004.12.10 * }
- program window;
- uses exec, intuition, graphics, utility;
- { * Enable this to run on custom screen. If it's not * }
- { * enabled, window will open on default pubscreen * }
- { DEFINE CUSTOMSCREEN}
- var
- {$IFDEF CUSTOMSCREEN}
- myScreen : PScreen;
- {$ENDIF}
- myWindow : PWindow;
- IMesg : PIntuiMessage;
- Quit : Boolean;
- LeftButton: Boolean;
- msg_Class : Cardinal;
- msg_Code : Word;
-
- X_Pos : Integer;
- Y_Pos : Integer;
- const
- ERRMSG_NOINTUI = 'Unable to open intuition.library V50!';
- ERRMSG_NOGFX = 'Unable to open graphics.library V50!';
- ERRMSG_NOSCREEN= 'Can''t open screen!';
- ERRMSG_NOWINDOW= 'Can''t open window!';
- procedure ShutDown(exitString: String; code: LongInt);
- begin
- if assigned(myWindow) then CloseWindow(myWindow);
- {$IFDEF CUSTOMSCREEN}
- if assigned(myScreen) then CloseScreen(myScreen);
- {$ENDIF}
- { * We're using library functions built into units, so it's * }
- { * not needed to close libs here. If you're using additional * }
- { * libs, add code to close them here. * }
- if exitString<>'' then writeln(exitString);
- Halt(code);
- end;
- procedure Init;
- begin
- { * Opening the needed libs with builtin functions. * }
- if Not InitIntuitionLibrary then ShutDown(ERRMSG_NOINTUI,20);
- if Not InitGraphicsLibrary then ShutDown(ERRMSG_NOGFX,20);
- {$IFDEF CUSTOMSCREEN}
- myScreen:=NIL;
- { * Opening our custom screen * }
- myScreen:=OpenScreenTags(NIL,[SA_Width,640,SA_Height,480,
- SA_Depth,24,
- SA_Title,DWord(PChar('Free Pascal Rules!')),
- TAG_DONE]);
- if myScreen=NIL then ShutDown(ERRMSG_NOSCREEN,20);
- {$ENDIF}
- myWindow:=NIL;
- { * We open our window here. * }
- myWindow:=OpenWindowTags(NIL,[WA_Left,0,WA_Top,0,
- WA_Width,400,WA_Height,300,
- WA_Title,DWord(PChar('Free Pascal Test')),
- WA_IDCMP,(IDCMP_CLOSEWINDOW or IDCMP_MOUSEBUTTONS or
- IDCMP_MOUSEMOVE),
- WA_Flags,(WFLG_SIMPLE_REFRESH or WFLG_NOCAREREFRESH or
- WFLG_ACTIVATE or WFLG_REPORTMOUSE or
- WFLG_CLOSEGADGET or WFLG_SIZEGADGET or
- WFLG_SIZEBBOTTOM or WFLG_GIMMEZEROZERO or
- WFLG_DRAGBAR),
- {$IFDEF CUSTOMSCREEN}
- WA_CustomScreen,DWord(myScreen),
- {$ENDIF}
- TAG_END]);
- if myWindow=NIL then ShutDown(ERRMSG_NOWINDOW,20);
- SetAPen(myWindow^.RPort,1);
- end;
- begin
- Init;
- Quit:=False;
- LeftButton:=False;
- repeat
- WaitPort(myWindow^.UserPort);
- IMesg:=PIntuiMessage(GetMsg(myWindow^.UserPort));
- if IMesg<>NIL then Begin
- { * It's recommended to copy contents of incoming * }
- { * message, and reply it as soon as possible. * }
- msg_Class:=IMesg^.IClass;
- msg_Code :=IMesg^.Code;
- X_Pos :=IMesg^.MouseX - myWindow^.BorderLeft;
- Y_Pos :=IMesg^.MouseY - myWindow^.BorderTop;
- ReplyMsg(Pointer(IMesg));
- { * Handle different kind of messages here. * }
- case msg_Class of
- IDCMP_CLOSEWINDOW:
- quit:=True;
- IDCMP_MOUSEBUTTONS:
- case msg_Code of
- SELECTDOWN:
- LeftButton:=True;
- SELECTUP:
- LeftButton:=False;
- end;
- IDCMP_MOUSEMOVE:
- begin
- { * Draw when left button is pressed, and mouse is moved. * }
- if LeftButton then WritePixel(myWindow^.RPort,X_Pos,Y_Pos);
- end;
- end;
- end;
- until Quit;
- ShutDown('',0);
- end.
- {
- $Log$
- Revision 1.1 2004-12-14 22:07:02 karoly
- * initial revision
- }
|