![]() |
ENGLISH VERSION |
|
![]() |
Links | | | Forum | | | Kommentare | | | News melden |
![]() |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
![]() |
amiga-news.de Forum > Programmierung > Test | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
21.06.2005, 17:40 Uhr Kaesebroetchen Posts: 643 Nutzer |
#include <intuition/intuition.h> #include <intuition/classusr.h> #include <intuition/classes.h> #include <intuition/gadgetclass.h> #include <intuition/cghooks.h> #include <workbench/icon.h> #include <workbench/workbench.h> #include <gadgets/layout.h> #include <libraries/gadtools.h> #include <clib/intuition_protos.h> #include <clib/alib_protos.h> #include <clib/icon_protos.h> #include <clib/layers_protos.h> #include <clib/utility_protos.h> #include <clib/dos_protos.h> #define REG(reg,arg) register __##reg arg #define G(x) ((struct Gadget *)x) //Testkommentar ******************************************************************** extern struct Library *IconBase, *DOSBase, *IntuitionBase, *UtilityBase, *LayersBase, *GfxBase; struct InstanceData{ ULONG secs; /* nur zur Prüfung ... */ ULONG micro; /* ... auf Doppelklick */ struct Hook *backfill; /* siehe butclass_RENDER */ Object *parent; /* siehe butclass_SET */ }; ULONG butclass_DISPATCH( REG( a0, Class *cl ), REG( a2, Object *o ), REG( a1, Msg msg ) ); ULONG butclass_DOMAIN( Class *cl, Object *o, struct gpDomain *gpd ); ULONG butclass_HANDLEINPUT( Class *cl, Object *o, struct gpInput *gpi ); ULONG butclass_RENDER( Class *cl, Object *o, struct gpRender *gpr ); ULONG butclass_SET( Class *cl, Object *o, struct opSet *ops ); IClass *MakeIconClass(){ IClass *cl; if( cl = MakeClass( NULL, "gadgetclass", /* die Basisklasse */ NULL, sizeof( struct InstanceData ), /* Größe unserer Zusatzdaten */ 0L ) ) cl->cl_Dispatcher.h_Entry = (HOOKFUNC) butclass_DISPATCH; /* Einzige Initialisierung: Einsetzen unseres Dispatchers */ return cl; } BOOL RemoveIconClass( IClass *cl ){ if( cl ) return FreeClass(cl); else return FALSE; } ULONG butclass_DISPATCH( REG( a0, Class *cl ), REG( a2, Object *o ), REG( a1, Msg msg ) ){ /* allgemeine Ereignisbehandlungroutine */ ULONG ret = 0L; switch( msg->MethodID ){ case GM_HANDLEINPUT: case GM_GOACTIVE: ret = butclass_HANDLEINPUT( cl, o, (struct gpInput *) msg ); break; case OM_SET: case OM_UPDATE: ret = butclass_SET( cl, o, (struct opSet *) msg ); break; case GM_RENDER: ret = butclass_RENDER( cl, o, (struct gpRender *) msg ); break; case GM_DOMAIN: ret = butclass_DOMAIN( cl, o, (struct gpDomain *) msg ); break; case OM_NEW:{ if( ret = DoSuperMethodA( cl, o, msg ) ){ /* zusätzlich zum Erzeugen des Objekts müssen Eigenschaften gesetzt werden */ butclass_SET( cl, (Object *) ret, (struct opSet *) msg ); } break; } default: ret = DoSuperMethodA( cl, o, msg ); /* in JEDEM Fall alle anderen Methoden an die Mutterklasse übergeben! */ } return ret; } /*********************************************************** *****************/ void butclass_redraw( Object *o, struct GadgetInfo *gi ){ /* siehe butclass_HANDLEINPUT */ struct RastPort *rp; if( rp = ObtainGIRPort( gi ) ){ DoMethod( o, GM_RENDER, (ULONG) gi, (ULONG) rp, GREDRAW_REDRAW ); ReleaseGIRPort( rp ); } } /*********************************************************** *****************/ ULONG butclass_HANDLEINPUT( Class *cl, Object *o, struct gpInput *gpi ){ /* Reaktion auf Eingaben (Mausklicks) des Benutzers */ InputEvent *ie = gpi->gpi_IEvent; ULONG retval = GMR_MEACTIVE; if( ie ){ switch( ie->ie_Class ){ case IECLASS_RAWMOUSE:{ switch( ie->ie_Code ){ case SELECTUP: retval = GMR_NOREUSE; break; case SELECTDOWN:{ InstanceData *id = (InstanceData*)INST_DATA( cl, o ); #ifdef DOUBLECLICK /* Falls das Icon eine GADGETUP-Botschaft nur nach einem */ /* Doppelklick liefern soll, müssen wir den Zeitpunkt des */ /* letzten Klicks prüfen: */ if( DoubleClick( id->secs, id->micro, ie->ie_TimeStamp.tv_secs, ie->ie_TimeStamp.tv_micro ) ){ G(o)->Flags |= GFLG_SELECTED; butclass_redraw( o, gpi->gpi_GInfo ); retval = GMR_NOREUSE | GMR_VERIFY; id->secs = id->micro = 0UL; }else{ id->secs = ie->ie_TimeStamp.tv_secs; id->micro = ie->ie_TimeStamp.tv_micro; G(o)->Flags ^= GFLG_SELECTED; butclass_redraw( o, gpi->gpi_GInfo ); retval = GMR_NOREUSE; } #else /* GADGETUP nach einfachem Klick */ G(o)->Flags |= GFLG_SELECTED; butclass_redraw( o, gpi->gpi_GInfo ); retval = GMR_NOREUSE | GMR_VERIFY; #endif } break; case MENUDOWN: retval = GMR_REUSE; break; } break; } } } return retval; } /*********************************************************** *****************/ BOOL IsIconFrameless( struct DiskObject *icon ){ /* Prüft, ob das Icon ohne Rahmen dargestellt werden muss */ /* siehe butclass_RENDER*/ ULONG frameless; IconControl( icon,ICONCTRLA_GetFrameless, (ULONG) &frameless,TAG_DONE ); if( frameless == FALSE ){ ULONG globalfl; if( IconControl( NULL,ICONCTRLA_GetGlobalFrameless, (ULONG) &globalfl,TAG_DONE ) ) frameless = globalfl; } return frameless; } /*********************************************************** *****************/ ULONG butclass_RENDER( Class *cl, Object *o, struct gpRender *gpr ){ /* Zeichnen des Icons */ RastPort *rp = gpr->gpr_RPort; DiskObject *icon = (struct DiskObject *) G(o)->UserData; Hook *hook; InstanceData *id = (InstanceData*)INST_DATA( cl, o ); Layer *layer = gpr->gpr_GInfo->gi_Layer; WORD x = G(o)->LeftEdge, y = G(o)->TopEdge; /* Unter unserem Icon muss der richtige Hintergrund dargestellt werden: */ hook = InstallLayerHook( layer, id->backfill ); DrawIconState(rp, icon, NULL, x,y, (G(o)->Flags & GFLG_SELECTED) != 0L, ICONDRAWA_DrawInfo, (ULONG) gpr->gpr_GInfo->gi_DrInfo, ICONDRAWA_Frameless, IsIconFrameless( icon ), TAG_DONE ); InstallLayerHook( layer, hook ); return 0L; } /*********************************************************** *****************/ ULONG butclass_SET( Class *cl, Object *o, struct opSet *ops ){ /* Setzen der Eigenschaften */ InstanceData *id = (InstanceData*)INST_DATA( cl, o ); TagItem *ti, *tlist = ops->ops_AttrList; DiskObject *icon = NULL; while( ti = NextTagItem( &tlist ) ){ switch( ti->ti_Tag ){ case GA_BackFill: id->backfill = (Hook*) ti->ti_Data; break; case LAYOUT_Parent: id->parent = (Object *) ti->ti_Data; break; case GA_UserData: icon = (struct DiskObject *) ti->ti_Data; break; } } if( id->parent && icon ){ /* Berechnen der Icongröße und Mitteilung an das Parent-Objekt */ Rectangle rect; UWORD w,h; GetIconRectangle( NULL, icon, NULL, &rect, ICONDRAWA_Borderless, FALSE, TAG_DONE ); /* Wir zählen also den Rand mit */ w = ( rect.MaxX - rect.MinX ) + 1; h = ( rect.MaxY - rect.MinY ) + 1; SetAttrs( id->parent, LAYOUT_ModifyChild, (ULONG) o, CHILD_MinWidth, w, CHILD_MinHeight, h, CHILD_MaxWidth, w, CHILD_MaxHeight, h, TAG_DONE ); /* Dies war die einzige Stelle, für die wir id->Parent brauchten. */ /* Da das Icon nachträglich geändert werden kann, müssen wir es */ /* im Objekt speichern. */ } return (ops->MethodID != OM_NEW) ? DoSuperMethodA( cl, o, (Msg) ops ) : 1L; /* bei OM_NEW wurde die SuperMethod schon in HANDLEINPUT aufgerufen! */ } /*********************************************************** *****************/ ULONG butclass_DOMAIN( Class *cl, Object *o, struct gpDomain *gpd ){ /* Berechnen der Gadget-Ausmaße */ InstanceData *id = (InstanceData*)INST_DATA( cl, o ); DiskObject *icon = (struct DiskObject *) G(o)->UserData; if( icon ){ /* nur wenn das Icon schon geladen wurde, steht die Größe des Buttons fest */ struct Rectangle rect; UWORD w,h; GetIconRectangle( NULL, icon, NULL, &rect, ICONDRAWA_Borderless, FALSE, TAG_DONE ); w = rect.MaxX - rect.MinX + 1; h = rect.MaxY - rect.MinY + 1; switch( gpd->gpd_Which ){ case GDOMAIN_MINIMUM: gpd->gpd_Domain.Width = w; gpd->gpd_Domain.Height = h; break; case GDOMAIN_NOMINAL: case GDOMAIN_MAXIMUM: gpd->gpd_Domain.Width = w; gpd->gpd_Domain.Height = h; break; } return 1L; } return 0L; } [ Dieser Beitrag wurde von Kaesebroetchen am 23.06.2005 um 00:12 Uhr editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Test | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
![]() |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2025 by amiga-news.de - alle Rechte vorbehalten. |
![]() |