Liten Datorhandbok För Målmedvetna

Academic Computer Club, Umeå Universitet, 2000


Macintosh Programmering

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