Difference between revisions of "Intuition window goes OOP(ish)"
(initial setup) |
(→The beginning =: removed typo + added code) |
||
| Line 5: | Line 5: | ||
Do note however, that the code showed herein is not complete, nor does it show good programing practice (even far from that). It is merely shown as a possible solution to the problem. Much more abstraction is required in order to be able to make practical use of these examples. | Do note however, that the code showed herein is not complete, nor does it show good programing practice (even far from that). It is merely shown as a possible solution to the problem. Much more abstraction is required in order to be able to make practical use of these examples. | ||
| − | == The beginning | + | == The beginning == |
Let's start out with a simple intuition window example, this example was taken from Thomas Rapp. | Let's start out with a simple intuition window example, this example was taken from Thomas Rapp. | ||
| − | + | <source lang="pascal"> | |
| + | program SimpleWindow; | ||
| − | [/code | + | {$MODE OBJFPC}{$H+} |
| + | |||
| + | Uses | ||
| + | Exec, AGraphics, Intuition, InputEvent, Utility; | ||
| + | |||
| + | |||
| + | Function AsTag(tag: LongWord): LongInt; inline; | ||
| + | begin | ||
| + | Result := LongInt(tag); | ||
| + | end; | ||
| + | |||
| + | |||
| + | //*-------------------------------------------------------------------------*/ | ||
| + | //* */ | ||
| + | //*-------------------------------------------------------------------------*/ | ||
| + | |||
| + | procedure print_text(rp: PRastPort; x: LongInt; y: LongInt; txt: PChar); | ||
| + | begin | ||
| + | GfxMove(rp, x, y); | ||
| + | SetABPenDrMd(rp, 1, 0, JAM2); | ||
| + | GfxText(rp, txt, strlen(txt)); | ||
| + | ClearEOL(rp); | ||
| + | end; | ||
| + | |||
| + | |||
| + | //*-------------------------------------------------------------------------*/ | ||
| + | //* Main routine */ | ||
| + | //*-------------------------------------------------------------------------*/ | ||
| + | |||
| + | function main: integer; | ||
| + | var | ||
| + | win : PWindow; | ||
| + | cont : Boolean; | ||
| + | msg : PIntuiMessage; | ||
| + | buffer : String[80]; | ||
| + | begin | ||
| + | win := OpenWindowTags( nil, | ||
| + | [ | ||
| + | AsTag(WA_Left) , 100, | ||
| + | AsTag(WA_Top) , 100, | ||
| + | AsTag(WA_Width) , 250, | ||
| + | AsTag(WA_Height) , 150, | ||
| + | AsTag(WA_Flags) , AsTag(WFLG_CLOSEGADGET or WFLG_DRAGBAR or WFLG_DEPTHGADGET or WFLG_ACTIVATE or WFLG_GIMMEZEROZERO or WFLG_NOCAREREFRESH or WFLG_RMBTRAP or WFLG_REPORTMOUSE), | ||
| + | AsTag(WA_IDCMP) , AsTag(IDCMP_CLOSEWINDOW or IDCMP_MOUSEMOVE or IDCMP_MOUSEBUTTONS), | ||
| + | TAG_END | ||
| + | ]); | ||
| + | |||
| + | if Assigned(win) then | ||
| + | begin | ||
| + | cont := TRUE; | ||
| + | |||
| + | while (cont) do | ||
| + | begin | ||
| + | WaitPort(win^.UserPort); | ||
| + | while true do | ||
| + | begin | ||
| + | msg := PIntuiMessage(GetMsg(win^.UserPort)); | ||
| + | if not Assigned(msg) then break; | ||
| + | |||
| + | case (msg^.IClass) of | ||
| + | IDCMP_CLOSEWINDOW: | ||
| + | cont := FALSE; | ||
| + | IDCMP_MOUSEMOVE: | ||
| + | begin | ||
| + | WriteStr(buffer, 'Mouseposition: x=', msg^.MouseX, ' y=', msg^.MouseY, #0); | ||
| + | print_text(win^.RPort, 10, 30, @buffer[1]); | ||
| + | end; | ||
| + | IDCMP_MOUSEBUTTONS: | ||
| + | case (msg^.Code) of | ||
| + | IECODE_LBUTTON : print_text(win^.RPort, 10, 60, 'Left mousebutton pressed'); | ||
| + | IECODE_LBUTTON or IECODE_UP_PREFIX : print_text(win^.RPort, 10, 60, 'Left mousebutton released'); | ||
| + | IECODE_RBUTTON : print_text(win^.RPort, 10, 90, 'Right mousebutton pressed'); | ||
| + | IECODE_RBUTTON or IECODE_UP_PREFIX : print_text(win^.RPort, 10, 90, 'Right mousebutton released'); | ||
| + | end; | ||
| + | end; // case | ||
| + | ReplyMsg(pMessage(msg)); | ||
| + | end; | ||
| + | end; // while | ||
| + | CloseWindow(win); | ||
| + | end; | ||
| + | |||
| + | result := (0); | ||
| + | end; | ||
| + | |||
| + | begin | ||
| + | ExitCode := Main; | ||
| + | end. | ||
| + | </source> | ||
| + | |||
| + | The code itself doesn't do anything difficult to understand. It opens a Intuition Window and reacts to some IDCMP messages and based on those messages give some feedback to the user. | ||
== We need a class == | == We need a class == | ||
Revision as of 19:29, 27 March 2017
A long while ago, someone on the aros-exec forums suggested to use some (more) OOP to create f.i. native Intuition Windows.
Although i already knew it is possible to do, i never managed to create a example for those wanting to have a look. So here we go :-)
Do note however, that the code showed herein is not complete, nor does it show good programing practice (even far from that). It is merely shown as a possible solution to the problem. Much more abstraction is required in order to be able to make practical use of these examples.
The beginning
Let's start out with a simple intuition window example, this example was taken from Thomas Rapp.
program SimpleWindow;
{$MODE OBJFPC}{$H+}
Uses
Exec, AGraphics, Intuition, InputEvent, Utility;
Function AsTag(tag: LongWord): LongInt; inline;
begin
Result := LongInt(tag);
end;
//*-------------------------------------------------------------------------*/
//* */
//*-------------------------------------------------------------------------*/
procedure print_text(rp: PRastPort; x: LongInt; y: LongInt; txt: PChar);
begin
GfxMove(rp, x, y);
SetABPenDrMd(rp, 1, 0, JAM2);
GfxText(rp, txt, strlen(txt));
ClearEOL(rp);
end;
//*-------------------------------------------------------------------------*/
//* Main routine */
//*-------------------------------------------------------------------------*/
function main: integer;
var
win : PWindow;
cont : Boolean;
msg : PIntuiMessage;
buffer : String[80];
begin
win := OpenWindowTags( nil,
[
AsTag(WA_Left) , 100,
AsTag(WA_Top) , 100,
AsTag(WA_Width) , 250,
AsTag(WA_Height) , 150,
AsTag(WA_Flags) , AsTag(WFLG_CLOSEGADGET or WFLG_DRAGBAR or WFLG_DEPTHGADGET or WFLG_ACTIVATE or WFLG_GIMMEZEROZERO or WFLG_NOCAREREFRESH or WFLG_RMBTRAP or WFLG_REPORTMOUSE),
AsTag(WA_IDCMP) , AsTag(IDCMP_CLOSEWINDOW or IDCMP_MOUSEMOVE or IDCMP_MOUSEBUTTONS),
TAG_END
]);
if Assigned(win) then
begin
cont := TRUE;
while (cont) do
begin
WaitPort(win^.UserPort);
while true do
begin
msg := PIntuiMessage(GetMsg(win^.UserPort));
if not Assigned(msg) then break;
case (msg^.IClass) of
IDCMP_CLOSEWINDOW:
cont := FALSE;
IDCMP_MOUSEMOVE:
begin
WriteStr(buffer, 'Mouseposition: x=', msg^.MouseX, ' y=', msg^.MouseY, #0);
print_text(win^.RPort, 10, 30, @buffer[1]);
end;
IDCMP_MOUSEBUTTONS:
case (msg^.Code) of
IECODE_LBUTTON : print_text(win^.RPort, 10, 60, 'Left mousebutton pressed');
IECODE_LBUTTON or IECODE_UP_PREFIX : print_text(win^.RPort, 10, 60, 'Left mousebutton released');
IECODE_RBUTTON : print_text(win^.RPort, 10, 90, 'Right mousebutton pressed');
IECODE_RBUTTON or IECODE_UP_PREFIX : print_text(win^.RPort, 10, 90, 'Right mousebutton released');
end;
end; // case
ReplyMsg(pMessage(msg));
end;
end; // while
CloseWindow(win);
end;
result := (0);
end;
begin
ExitCode := Main;
end.
The code itself doesn't do anything difficult to understand. It opens a Intuition Window and reacts to some IDCMP messages and based on those messages give some feedback to the user.