Liten Datorhandbok För Målmedvetna
Academic Computer Club, Umeå Universitet, 2000
Händelseslingan
Macintosh använder ett händelsebaserat system. Det betyder att ett program tillbringar en stor del av sin tid med att vandra omkring i en slinga och fråga datorn om det har hänt någonting. När det väl händer någonting så börjar programmet agera. Händelser kan vara musklickningar, menyval eller uppmaningar från Findern att öppna ett dokument. Nedan följer en typisk händelsehanterare för ett Macintoshprogram:
main()
{
EventRecord event;
long menuChoice;
initMac(); // Anropa våra initieringsrutiner
initAppl();
while (true) // Här loopar datorn, tills kommandot ExitToShell() ges.
{
// Fungerar ej på gamla macar
while (!WaitNextEvent(everyEvent,&event,kWaitTicks,0L))
;
switch (event.what)
{
case mouseDown: // Musklick
doMouseDown(&event);
break;
case keyDown: // Tangenttryckning
case autoKey: // Tangentrepetition - sådan får inte ge menykommandon
// Är det ett meny kommando?
if (event.modifiers&cmdKey && event.what!=autoKey)
{
menuChoice=MenuKey(event.message&charCodeMask); // Tolka kommandot
if (HiWord(menuChoice)!=0)
{
doMenuChoice(menuChoice); // Utför det
HiliteMenu(0);
}
}
else
{
// Hantera vanlig tangentnedtryckning här
}
break;
case activateEvt: // Ett fönster har blivit aktivt.
SetPort((WindowPtr)event.message);
// Är det vårt fönster?
if (((WindowPeek)event.message)->windowKind==userKind)
{
// Aktivera fönstret här.
}
break;
case updateEvt: // Innehållet i ett fönster måste ritas.
whichWindow=(WindowPtr)event.message;
// Är det vårt fönster?
if (((WindowPeek)whichWindow)->windowKind<0)
break;
BeginUpdate(whichWindow); // Vi ritar bara de delar som behövs.
// Rita fönstret här
EndUpdate(whichWindow);
break;
case kHighLevelEvent: // En Apple Event
AEProcessAppleEvent(&event); // Hantera den.
break;
}
}
}
Hanteraren för musklickningar måste i sin tur kunna ta reda på var musklickningen inträffade och reagera på lämpligt sätt.
void doMouseDown(EventRecord *event)
{
long menuChoice;
WindowPtr whichWindow;
ControlHandle ctrl;
short part;
Rect windowBounds;
// I vilket fönster och var inträffade klicket?
switch(FindWindow(event->where,&whichWindow))
{
case inMenuBar: // I menyraden
menuChoice=MenuSelect(event->where); // Vilket kommando motsvarar det?
if (HiWord(menuChoice)!=0)
{
doMenuChoice(menuChoice); // Utför kommandot
HiliteMenu(0);
}
break;
case inSysWindow: // I systemets fönster, låt systemet hantera det.
SystemClick(event, whichWindow);
break;
case inDrag: // I fönsterlisten, hantera fönsterflyttningsoperationen
DragWindow(whichWindow,event->where,&qd.screenBits.bounds);
break;
case inContent: // I innehållet
SetPort(whichWindow);
GlobalToLocal(&event->where);
if (part = FindControl(event->where,whichWindow,&ctrl))
{
// Hantera klick i kontroller här
}
else
{ if (whichWindow!=FrontWindow())
SelectWindow(whichWindow);
// Hantera klick i själva dokumentet här
}
break;
case inGrow: // I storleksrutan
// Sätt storleksbegränsningar
SetRect(&windowBounds,200,250,15000,15000);
// Läs nya storleken
longTemp=GrowWindow(window,loc,&windowBounds);
// Och sätt den
SizeWindow(window,LoWord(longTemp),HiWord(longTemp),false);
break;
case inGoAway: // I stängningsrutan
// Vänta på uppsläpp av musknappen
if (TrackGoAway(whichWindow,event->where))
DisposeWindow(whichWindow); // Stäng fönstret
break;
}
}
Författat av Niklas Frykholm
Bakåt , Framåt , Upp, Huvudsida
Denna sida ändrades sist av
handbok den
26/05 1996 12:37:19.
Last modified Sunday, 26-May-1996 12:37:19 CEST