Liten Datorhandbok För Målmedvetna

Academic Computer Club, Umeå Universitet, 2000


Macintosh Programmering

Fönster

All information på Macintosh presenteras i fönster. Du kan skapa ett nytt fönster genom NewWindow kommandot. Detta anrop skapar ett nytt dokumentfönster specificerat av rektangeln rect med titeln "Untitled".

windowPtr = NewWindow (0L, &rect, "/pUntitled", true, documentProc, (WindowPtr)-1L, true, 0); documentProc är här en konstant som anger att fönstret ska vara av den vanliga dokumentfönstertypen, med plats för storleksruta och rullningslister. Du kan även använda konstanterna noGrowDocProc, för dokument utan storleksruta, rDocProc, för fönster med runda hörn och dBoxProc för dialogruteliknande fönster.

Det första argumetet som satts till true ovan anger att fönstret skall ritas upp direkt när du skapar det. Annars visas det inte förrän du ger kommandot ShowWindow();. Det andra argumentet som satts till true anger att fönstret skall ha en stängningsruta.

Du kan också skapa ett nytt fönster som intialiseras från en WIND-resurs med ID windowID med anropet:

windowPtr = GetNewWindow (windowID, 0L, (WindowPtr)-1L); För att bli av med fönstret ger du kommandot

DisposeWindow(windowPtr); Du kan flytta fönstret längst fram på skärmen genom att ge kommandot:

SelectWindow(windowPtr); För att ta reda på vilket fönster som är längst fram kan du använda kommandot:

windowPtr=FrontWindow(); För att rita storleksrutan i ett fönster måste du ge kommandot:

DrawGrowIcon(windowPtr); Det finns också rutiner för att hantera klickningar i denna ruta, i stängningsrutan och i titelraden, men dessa används så gott som aldrig utanför händelseslingan och beskrivs i momentet som handlar om denna.

Du kan ge kommandot:

InvalRect(&rect); för att tala om för datorn att en bit av det aktuella fönstret måste ritas om. Då skapar datorn automatiskt en updateEvent för fönstret. När du upptäcker den i din händelseslinga så ska du ge kommandot:

BeginUpdate(windowPtr);

Datorn ser då till att det du ritar bara påverkar den del av skärmen som markerats för uppdatering. Detta gör att ritningen går snabbare än om hela dokumentet skulle ritas om. När du är klar anropar du:

EndUpdate(windowPtr);

För att flytta fönstret till en viss position på skärmen ger du kommandot

MoveWindow(windowPtr, hPos, vPos, bringToFront); Om bringToFront sätts till true så kommer fönstret att läggas längst fram efter flytten (om det inte redan låg där). Storleken på fönstret kan du ändra med anropet:

SizeWindow(windowPtr, width, height, createUpdateEvent); Om createUpdateEvent är satt till true så skapas automatiskt en update event för att rita innehållet i de nya delarna av fönstret.

En vanlig teknik är att först skapa ett fönster från en resurs med intitially visible satt till false. Sedan flyttar du fönstret till en lämplig position på skärmen. Du kan till exempel centrera det med avseende på skärmens rektangel som ges av variablen qd.screenBits.rect. Till sist anropar du ShowWindow för att visa fönstret.

Centreringsfunktionen kan till exempel se ut som:

// Centrerar ett fönster på skärmen. Title skall sättas till true om // fönstret har en titelrad. Procentsatserna anger hur mycket utrymme som skall lämnas // till vänster om och ovanför dokumentet. (50, 50) placerar dokumentet mitt på // skärmen. Boolean centerWindow (WindowPtr theWindow, char percentToLeft, char percentAbove, Boolean title) { short spaceV,spaceH; Boolean tooBig=false; // Beräkna mängden ledigt horisontellt utrymme. spaceH=(qd.screenBits.bounds.right-qd.screenBits.bounds.left)-(theWindow->portRect.right- theWindow->portRect.left); // Beräkna mängden ledigt vertikalt utrymme, antag 20 punkters titelrad för // fönstret. spaceV=(qd.screenBits.bounds.bottom-qd.screenBits.bounds.top-GetMBarHeight()) - (theWindow->portRect.bottom-theWindow->portRect.top+title*20); if (spaceH<0) { spaceH=0; tooBig=true; // Fönstret var för stort horisontellt, lägg // det så att stängningsrutan syns. } if (spaceV<0) { spaceV=0; tooBig=true; // Fönstret var för stort vertikalt, lägg // det så att titelraden syns. } // Placera det på rätt ställe. MoveWindow(theWindow, qd.screenBits.bounds.left+spaceH*(percentToLeft/100.0), qd.screenBits.bounds.top+GetMBarHeight()+20*title+spaceV*(percentAbove/100.0), false); ShowWindow(theWindow); // och visa det. return(tooBig); // Returnera den här informationen. }

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