amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Gadget Problem [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

13.11.2003, 08:28 Uhr

Reth
Posts: 1858
Nutzer
Morjen miteinander,

ich habe ein kleines Problem mit Gadgets unter Intuition.

Ich erzeuge mir ne gefüllte Gadget-Struktur und eine gefüllte Image-Struktur (letztere vom Malprogramm) und setze die Adresse der Image-Struktur in das Gadget (GadgetRender), sowie das GADGIMAGE-Flag.

Nun füge ich das Gadget in mein Fenster ein. Das alles klappt völlig problemlos. Wenn ich nun aber den Gadgetrefresh des Fensters aufrufe, friert meine System ein und ich muss rebooten!

Woran kann das liegen? Das Gadget soll mal ein Knopf werden, der bei SelectRender ein zweites Bild bekommt. Muss ich nen bestimmten Gadgettyp setzen (hab zur Zeit Cusom)?

Ich habe das Ganze auch schon mit Boopsi probiert. Wenn ich da die Image-Strukturen mit NewObject vom Typ imageclass erzeuge ((struct image*) image = NewObject(...)), danach die Daten von Hand eintrage (über image->) und nem frbutton-Objekt mit GA_Image übergebe, sehe ich nachher nur das Image auf dem Bildschirm, bekomme aber kein Button-typisches Verhalten (also das sich was ändert, wenn man drauf klickt - auch nicht, wenn ich ein anderes Image als SelectRender setze) aber das System friert auch nicht ein!
Verwende ich für das Image frameiclass bei NewObject bekomme ich nen grauen Button ohne Bild drauf. Ein Bild bekomme ich dann nur, wenn ich LabelImage verwende, dann verhält sich der Button bzw. das Image nicht wie ichs von nem Button erwarte (weil kein Image und kein SelectRender-Iamge erkannt wird, selbst wenn sie angegeben sind!).

Wenn gewollt, kann ich auch noch Code posten!

Ich denke mal, dass der Einfrier-Fehler wieder irgendeine mehr oder weniger simple Dummheit von mir ist, die aber ausserhalb der Compilererkennung liegt.

HAbe aber schon in einigen Beispielen bei den RKRMs und im CMAnual im Aminet geschaut und diesen Code eigentlich übernommen!

Kann mir da jemand weiterhelfen?

Danke schon mal!

Ciao

[ - Antworten - Zitieren - Direktlink - ]

13.11.2003, 15:50 Uhr

thomas
Posts: 7717
Nutzer

Hast du schonmal daran gedacht, die Anleitung zu lesen, bevor du anfängst zu experimentieren ?

Natürlich mußt du dem Gadget einen Typ geben. Für einen Button ist das GTYP_BOOLGADGET. Custom ist ausschließlich für BOOPSI.

Außerdem müssen alle Flags und Pointer korrekt gesetzt werden. Wenn du GFLG_GADGIMAGE setzt, muß GadgetRender auf ein Image zeigen, ansonsten auf eine Border. Das gleiche gilt für GFLG_GADGHIMAGE und SelectRender.

Lies bitte zuerst die RKRMs oder vergleichbare Literatur, bevor du sowas anfängst !

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

13.11.2003, 18:17 Uhr

Reth
Posts: 1858
Nutzer
HAb die Sourcen aus dem CManual ausm Aminet. Das Gadget und die Image-Struktur wurden korrekt initialisiert, nur das Gadget war vom Typ Proportional. Das hab ich in Custom geändert, da es nicht ging.

Die Passage, das Buttons mit GTYP_BOOLGADGET initialisiert werden müssen, hab ich in den RKRMs nicht gesehen sorry.

Ein SelectRender hab ich nicht gesetzt (Wert auf NULL), da ichs erstmal so probieren wollte.

Wie geschrieben hat's mit BOOPSI und dem folgenden Code nicht funktioniert (entweder ich seh nix, oder ein Image ohne Knopffunktion, oder nur nen grauen Knopf ohne Bilder - je nachdem ob ich Imageclass oder frameiclass nehme; die Daten für die Images und die Images funktionieren, hab ich mit DrawImage getestet):

struct Gadget *gad = NULL;
struct Image *normalImage = (struct Image *)NewObject(NULL, "imageclass", TAG_DONE);
struct Image *pressedImage = (struct Image *)NewObject(NULL, "imageclass", TAG_DONE);
if (normalImage && pressedImage)
{
normalImage->LeftEdge = 0x0;
normalImage->TopEdge = 0x0;
normalImage->Width = 0x0017;
normalImage->Height = 0x002E;
normalImage->Depth = 0x0008;
normalImage->ImageData = (UWORD *)tower_button_normal;
normalImage->PlanePick = 0xFF;
normalImage->PlaneOnOff = 0x0;

pressedImage->LeftEdge = 0x0;
pressedImage->TopEdge = 0x0;
pressedImage->Width = 0x0017;
pressedImage->Height = 0x002E;
pressedImage->Depth = 0x0008;
pressedImage->ImageData = (UWORD *)tower_button_pressed;
pressedImage->PlanePick = 0xFF;
pressedImage->PlaneOnOff = 0x0;

gad = (struct Gadget *)NewObject(NULL, "frbuttonclass",
GA_Left, 800,
GA_Top, 600,
GA_Width, 23,
GA_Height, 46,
GA_Image, (APTR)&myimage,
GA_SelectRender, pressedImage,
IA_FrameType, FRAME_BUTTON,
TAG_DONE);
if( gad )
{
SetAttrs(gad, GA_Width, 23, GA_Height, 46, TAG_DONE);
AddGadget(wizardWindow.window(), gad, -1);
RefreshGadgets(gad, wizardWindow.window(), 0);
} else
{
DisposeObject(gad);
DisposeObject(normalImage);
DisposeObject(pressedImage);
}
}

Vielen Dank für den Tip mit GTYP_BOOLGADGET werd ich ausprobieren.

[ - Antworten - Zitieren - Direktlink - ]

13.11.2003, 19:19 Uhr

thomas
Posts: 7717
Nutzer

Äääähm, du weißt aber, daß das "OO" in "BOOPSI" für "Object Oriented" steht ?

Von NewObject bekommst du immer ein Object zurück, kein Image o.ä. Das ist für dich eine Black Box. Da darfst du nicht reinschreiben. Du darfst nur die Methods benutzen, also SetAttrs, GetAttrs etc.

Daß man ein Object in eine Gadget-Liste aufnehmen kann, ist die einzige Ausnahme. Trotzdem darfst du auf die Gadget-Struktur nie zugreifen, nicht lesen und schon gar nicht schreiben. Alle Daten, auf die der Object-Pointer zeigt, sind privat. Der einzige mögliche Zugriff auf die Object-Daten sind die Methods.

Ich würde dir raten, erstmal bei den normalen Gadgets zu bleiben.

Du darfst SelectRender auf NULL setzen, wenn du GFLG_GADGHNONE oder GFLG_GADGHCOMP setzt.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

13.11.2003, 19:53 Uhr

Reth
Posts: 1858
Nutzer
@thomas

Danke für die Hilfe.

Leider hab ich das mit den Zugriffen auf BOOPSI Objekte in den RKRMs und den Webseiten, die ich fand wohl übersehen.

Hihi, kann mir vorstellen, wie Du vorm Schirm rotiert bist, als Du das gesehen hast.

Ich weiss, daß das OO für ObjectOriented steht, bin im OO Bereich auch kein Neuling, nur bei der Amigaprogrammierung fehlt mir sehr wohl die Erfahrung und es ist sehr schwer an aktuelle Doku, Tutorials, Examples etc. ranzukommen. Habe die RKRMs hier wie sie im Web abliegen (wuf einigen Servern/Homepages), einige Beispiele dabei, das NDK3.9 die DeveloperCD noch nicht (bevor Du fragst) und auch schon Kontakt zu einigen Entwicklern gehabt und mit denen die Probleme erörtert.

Wie sieht's eiegentlich mit Deinem Amiga-Programmierung-Background aus? Du scheints sehr viel Erfahrung zu haben. Ich erwerbe mir meine erst noch und habe gelernt, daß das am besten durch Doing geht. Habe schon mal ein Spiel (ein Siedler von Catan Ableger) für den Amiga programmiert in C und dabei soviel über Amigaprogrammierung und v.a. C gelernt wie in keinem Buch/Kurs/Vorlesung/etc. zuvor!

Wenn Du möchtest kann ich Dir gern den aktuellen Stand meines "Projektes" schicken (noch very buggy), falls es Dich interessiert.

Ciao
René

[ - Antworten - Zitieren - Direktlink - ]

13.11.2003, 23:07 Uhr

Georg
Posts: 107
Nutzer
> Von NewObject bekommst du immer ein Object zurück, kein Image o.ä.
> Das ist für dich eine Black Box. Da darfst du nicht reinschreiben.
> Du darfst nur die Methods benutzen, also SetAttrs, GetAttrs etc.

Doch das darf man!

> frbuttonclass.

Versuch's mal mit der buttongclass.

> sehr schwer an aktuelle Doku, Tutorials,
> Examples etc. ranzukommen

Examples gibts tonnenweise in den AROS Sourcen: http://www.aros.org.


In deinem Fall wäre z. B. AROS/compiler/cooolimages/* und
speziell imageclass.c darin interessant. Damit kann man
ein Image (Objekt) aus nem chunky buffer + palette erzeugen,
und dann ganz einfach in nem buttongclass Objekt über GA_Image,
GA_SelectRender/GA_GadgetRender verwenden.



[ - Antworten - Zitieren - Direktlink - ]

14.11.2003, 00:43 Uhr

Georg
Posts: 107
Nutzer
"Ich habe das Ganze auch schon mit Boopsi probiert ...
kein Button-typisches Verhalten ... das sich was ändert, wenn man
drauf klickt"

Hab' grad festgestellt, daß AmigaOS (im Gegensatz zu AROS und wohl
auch MorphOS) die buttongclass/frbuttonclass Klassen das selected
Image (GA_SelectRender) einfach ignorieren. Daher muß man hier
ein wenig tricks (wenn man keine eigene Gadgetklasse machen will).

Hier ein Beispiel mit so nem Trick:


#include <exec/execbase.h>
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <intuition/classes.h>
#include <intuition/classusr.h>
#include <intuition/imageclass.h>
#include <intuition/gadgetclass.h>
#include <graphics/gfx.h>
#include <cybergraphx/cybergraphics.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/cybergraphics.h>
#include <proto/utility.h>
#include <clib/alib_protos.h>

#include <stdio.h>

#ifndef __AROS__
typedef ULONG IPTR;
#endif

struct MyImageData
{
struct Screen *scr;
Object *selimage;
UBYTE *data;
UBYTE *remapdata;
UBYTE *pal;
UBYTE *remappal;
ULONG *cgxpal;
WORD numcols;
BOOL truecolor;
};

struct IClass *myimageclass;
struct Library *CyberGfxBase;

#define IM(o) ((struct Image *)(o))

#define MYIA_Screen SYSIA_DrawInfo
#define MYIA_NumColors IA_FGPen
#define MYIA_ChunkyBuffer IA_Data
#define MYIA_Palette IA_APattern
#define MYIA_SelectedImage GA_UserData

static IPTR myimage_new(Class * cl, Object * o, struct opSet * msg)
{
struct MyImageData *data;

o = (Object *)DoSuperMethodA(cl, o, (Msg)msg);

if (o)
{
data = INST_DATA(cl, o);

data->scr = (struct Screen *)GetTagData(MYIA_Screen, 0, msg->ops_AttrList);
data->data = (UBYTE *)GetTagData(MYIA_ChunkyBuffer, 0, msg->ops_AttrList);
data->pal = (UBYTE *)GetTagData(MYIA_Palette, 0, msg->ops_AttrList);
data->numcols = GetTagData(MYIA_NumColors, 0, msg->ops_AttrList);
data->selimage = (Object *)GetTagData(MYIA_SelectedImage, 0, msg->ops_AttrList);

if (!data->scr || !data->data || !data->pal || !data->numcols)
{
CoerceMethod(cl, o, OM_DISPOSE);
o = NULL;
}
else
{
if (CyberGfxBase && GetBitMapAttr(data->scr->RastPort.BitMap, BMA_DEPTH) >= 15)
{
data->truecolor = TRUE;

if ((data->cgxpal = AllocVec(data->numcols * sizeof(ULONG), MEMF_PUBLIC)))
{
ULONG *p = data->cgxpal;
WORD i;

for(i = 0; i < data->numcols; i++)
{
*p++ = (data->pal[i * 3] << 16) |
(data->pal[i * 3 + 1] << 8) |
(data->pal[i * 3 + 2]);
}

}
else
{
CoerceMethod(cl, o, OM_DISPOSE);
o = NULL;
}
}
else
{
if ((data->remapdata = AllocVec(data->numcols * sizeof(UBYTE) +
IM(o)->Width * IM(o)->Height, MEMF_PUBLIC)))
{
UBYTE *p;
ULONG i;

data->remappal = p = data->remapdata + IM(o)->Width * IM(o)->Height;

for(i = 0; i < data->numcols; i++)
{
*p++ = ObtainBestPen(data->scr->ViewPort.ColorMap,
data->pal[i * 3] * 0x01010101,
data->pal[i * 3 + 1] * 0x01010101,
data->pal[i * 3 + 2] * 0x01010101,
OBP_Precision, PRECISION_IMAGE,
OBP_FailIfBad, FALSE,
TAG_DONE);
}

for(i = 0; i < IM(o)->Width * IM(o)->Height; i++)
{
data->remapdata[i] = data->remappal[data->data[i]];
}
}
else
{
CoerceMethod(cl, o, OM_DISPOSE);
o = NULL;
}

}

}

} /* if (o) */

return (IPTR)o;
}

static IPTR myimage_dispose(Class * cl, Object * o, Msg msg)
{
struct MyImageData *data;

data = INST_DATA(cl, o);

if (data->cgxpal) FreeVec(data->cgxpal);

if (data->remappal)
{
WORD i;

for(i = 0; i < data->numcols; i++)
{
ReleasePen(data->scr->ViewPort.ColorMap, data->remappal[i]);
}
}

if (data->remapdata) FreeVec(data->remapdata);

return DoSuperMethodA(cl, o, msg);
}

static IPTR myimage_draw(Class *cl, Object *o, struct impDraw *msg)
{
struct MyImageData *data;
WORD x, y;

data = INST_DATA(cl, o);

if ((msg->imp_State == IDS_SELECTED) && (data->selimage))
{
DoMethodA(data->selimage, (Msg)msg);
}
else
{
x = IM(o)->LeftEdge + msg->imp_Offset.X;
y = IM(o)->TopEdge + msg->imp_Offset.Y;

if (data->truecolor)
{
WriteLUTPixelArray((APTR)data->data,
0,
0,
IM(o)->Width,
msg->imp_RPort,
data->cgxpal,
x,
y,
IM(o)->Width,
IM(o)->Height,
CTABFMT_XRGB8);

}
else
{
WriteChunkyPixels(msg->imp_RPort,
x,
y,
x + IM(o)->Width - 1,
y + IM(o)->Height - 1,
data->remapdata,
IM(o)->Width);
}
}

return 0;
}

IPTR myimageclass_dispatcher(Class *cl, Object *obj, Msg msg)
{
IPTR retval;

switch (msg->MethodID)
{
case OM_NEW:
retval = myimage_new(cl, obj, (struct opSet *)msg);
break;

case OM_DISPOSE:
retval = myimage_dispose(cl, obj, msg);
break;

case IM_DRAW:
retval = myimage_draw(cl, obj, (struct impDraw *)msg);
break;

default:
retval = DoSuperMethodA(cl, obj, msg);
break;

} /* switch (msg->MethodID) */

return retval;
}


BOOL initmyimageclass(void)
{
BOOL retval = FALSE;

myimageclass = MakeClass(NULL, IMAGECLASS, NULL, sizeof(struct MyImageData), 0UL);
if (myimageclass)
{
myimageclass->cl_Dispatcher.h_Entry = HookEntry;
myimageclass->cl_Dispatcher.h_SubEntry = (HOOKFUNC)myimageclass_dispatcher;
retval = TRUE;
}

return retval;
}

/********************************************************************* *******************/

void freemyimageclass(void)
{
if (myimageclass) FreeClass(myimageclass);
myimageclass = NULL;
}

#define TESTIMAGE_WIDTH 15
#define TESTIMAGE_HEIGHT 16
#define TESTIMAGE_NUMCOLORS 8

static UBYTE testimage_data[] =
{
07,07,07,07,07,07,07,07,07,07,07,07,07,07,03,
07,05,05,05,05,05,05,05,05,05,05,05,05,05,03,
07,05,06,06,06,06,06,06,06,06,06,06,02,05,03,
07,05,06,01,04,01,01,01,01,01,01,01,02,05,03,
07,05,06,04,01,01,01,01,01,01,01,01,02,05,03,
07,05,06,01,01,01,01,01,01,01,01,01,02,05,03,
07,05,06,01,01,01,01,01,01,01,01,01,02,05,03,
07,05,06,01,01,01,01,01,01,01,01,01,02,05,03,
07,05,06,01,01,01,01,01,01,01,01,01,02,05,03,
07,05,06,02,02,02,02,02,02,02,02,02,02,05,03,
07,05,05,05,05,05,05,05,05,05,05,05,05,05,03,
07,05,05,05,05,05,05,05,05,05,03,05,03,05,03,
03,03,03,03,03,03,03,03,03,03,03,03,03,03,03,
00,00,07,07,07,07,07,07,07,07,07,07,03,00,00,
00,00,03,03,03,03,03,03,03,03,03,03,03,00,00,
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
};

static UBYTE testimage_pal[] =
{
0xb3,0xb3,0xb3,0x28,0x14,0x88,
0x3b,0x3b,0xe0,0x00,0x00,0x00,
0xff,0xff,0xff,0xc4,0xc4,0xc4,
0x00,0x00,0x63,0xe0,0xe0,0xe0
};

static UBYTE testimage_pal2[] =
{
0x00,0x00,0xb3,0x00,0x00,0x88,
0x00,0x00,0xe0,0x00,0x00,0x00,
0x00,0x00,0xff,0x00,0x00,0xc4,
0x00,0x00,0x63,0x00,0x00,0xe0
};

int main(void)
{
struct Screen *scr = LockPubScreen(NULL);
Object *image, *image2, *gadget;
struct Window *win;

CyberGfxBase = OpenLibrary("cybergraphics.library", 0);

if (scr)
{
if (initmyimageclass())
{
image = NewObject(myimageclass, NULL,
IA_Width, TESTIMAGE_WIDTH,
IA_Height, TESTIMAGE_HEIGHT,
MYIA_Screen, (IPTR)scr,
MYIA_ChunkyBuffer, (IPTR)testimage_data,
MYIA_Palette, (IPTR)testimage_pal2,
MYIA_NumColors, TESTIMAGE_NUMCOLORS,
TAG_DONE);
if (image)
{
image2 = NewObject(myimageclass, NULL,
IA_Width, TESTIMAGE_WIDTH,
IA_Height, TESTIMAGE_HEIGHT,
MYIA_Screen, (IPTR)scr,
MYIA_ChunkyBuffer, (IPTR)testimage_data,
MYIA_Palette, (IPTR)testimage_pal,
MYIA_NumColors, TESTIMAGE_NUMCOLORS,
MYIA_SelectedImage, (IPTR)image,
TAG_DONE);

if (image2)
{
gadget = NewObject(NULL, BUTTONGCLASS,
GA_Left, 30,
GA_Top, 30,
GA_Image, (IPTR)image2,
GA_Immediate, TRUE,
GA_RelVerify, TRUE,
TAG_DONE);

if (gadget)
{
win = OpenWindowTags(NULL, WA_PubScreen, (IPTR)scr,
WA_CloseGadget, TRUE,
WA_DragBar, TRUE,
WA_DepthGadget, TRUE,
WA_Width, 100,
WA_Height, 100,
WA_Activate, TRUE,
WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_GADGETDOWN | IDCMP_GADGETUP,
WA_Gadgets, (IPTR)gadget,
TAG_DONE);
if (win)
{
struct IntuiMessage *msg;
BOOL quitme = FALSE;

while(!quitme)
{
WaitPort(win->UserPort);
while((msg = (struct IntuiMessage *)GetMsg(win->UserPort)))
{
switch(msg->Class)
{
case IDCMP_GADGETDOWN:
printf("GADGETDOWNn");
break;

case IDCMP_GADGETUP:
printf("GADGETUPn");
break;

case IDCMP_CLOSEWINDOW:
quitme = TRUE;
break;
}
ReplyMsg((struct Message *)msg);
}
}
CloseWindow(win);
}

DisposeObject(gadget);
}

DisposeObject(image2);
}

DisposeObject(image);
}

freemyimageclass();
}
UnlockPubScreen(NULL, scr);
}

if (CyberGfxBase) CloseLibrary(CyberGfxBase);

return 0;
}



[ Dieser Beitrag wurde von Georg am 14.11.2003 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

14.11.2003, 00:47 Uhr

Georg
Posts: 107
Nutzer
Oops ... das ging wohl in die Hose. Also anstelle des
Smilies sollte da ne 8 stehen. Möglicherweise wurde da
noch anderes durcheinandergewürfelt: wenn ja schick mir
ne Mail an georg.steger@rolmail.net und ich schick' dir
den Source per EMail.


[ - Antworten - Zitieren - Direktlink - ]

14.11.2003, 10:53 Uhr

thomas
Posts: 7717
Nutzer
Zitat:
Original von Georg:
Oops ... das ging wohl in die Hose. Also anstelle des
Smilies sollte da ne 8 stehen. Möglicherweise wurde da
noch anderes durcheinandergewürfelt: wenn ja schick mir
ne Mail an georg.steger@rolmail.net und ich schick' dir
den Source per EMail.


Klick einfach auf "Zitatantwort", dann bekommst du den Original-Text mit Einrückungen zu sehen.

Bei solchen Posts sollte man immer den Haken bei "Smilies in diesem Beitrag deaktivieren" anmachen. Kann man auch nachträglich noch machen.

Gruß Thomas
--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Gadget Problem [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.