Liten Datorhandbok För Målmedvetna
Academic Computer Club, Umeå Universitet, 2000
Rullningslister
Hur rullningslisterna i ett program fungerar verkar ganska självklart och man tänker sig gärna att det inte skulle vara speciellt svårt att programmera dem. Det är dock inte lika lätt som det ser ut.
Till att börja med måste du skapa rullningslisten som en kontroll i ditt fönster. Det gör du med ett anrop av typen:
scrollBarHandle=NewControl(windowPtr,&rect,"\p",true,0,0,0,scrollBarProc,0L);
Sedan måste du ställa in min-, max- och nuvarande värde på rullningslisten, så att de matchar den faktiska längden på ditt dokument och den nuvarande positionen. Det gör du genom att använda funktionerna:
SetCtlMax(scrollBarHandle, theMaxValue);
SetCtlMin(scrollBarHandle, theMinValue);
SetCtlValue(scrollBarHandle, theValue);
När så ett klick inträffar måste du ta reda på i vilken del av rullningslisten användaren klickade. Om hon klickade i hissen så sköter systemet om det mesta, men om klicket skedde någon annanstans så måste du använda dig av en återanropsfunktion, det vill säga en funktion som du skapar och som systemet anropar då den behövs. Orsaken till detta är att dokumentet behöver rullas och ritas om medan användaren håller nere musknappen över någon av pilarna. Ett kodskal för att hantera klickningar i en rullningslist kan se ut ungefär så här:
void scrollClick(ControlHandle whichControl, short part, Point loc)
{
short oldPos, newPos;
oldPos=GetCtlValue(whichControl);
if (part==inThumb)
{
part=TrackControl(whichControl,loc,0L);
newPos=GetCtlValue(whichControl);
if (newPos!=oldPos)
{
SetCtlValue(whichControl,newPos);
// Rulla dokumentet här
}
}
else
part=TrackControl(whichControl,loc,vScroll); // Ej för PPC-kompilator
}
Här är vScroll vår återanropsrutin. Den kan till exempel definieras som:
static pascal void vScroll (ControlHandle theControl, short part)
{
short oldPos, newPos;
oldPos=GetCtlValue(theControl);
switch(part)
{
case inUpButton:
newPos=oldPos-1;
break;
case inDownButton:
newPos=oldPos+1;
break;
case inPageUp:
// Ge newPos ett värde så att en skärmfull rullas upp
break;
case inPageDown:
// Ge newPos ett värde så att en skärmfull rullas ned
break;
}
// Rulla dokumentet här
SetCtlValue(theControl,newPos);
}
Författat av Niklas Frykholm
Bakåt , Framåt , Upp, Huvudsida
Denna sida ändrades sist av
handbok den
26/05 1996 12:37:22.
Last modified Sunday, 26-May-1996 12:37:22 CEST