ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Mit Datatypes Bilder zeigen | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
10.10.2004, 16:12 Uhr Timo Posts: 13 Nutzer |
Ein altes aber immernoch ungelöstes Problem von mir bezüglich Datatypes: Ich will nix anderes tun, als nur ein Bild in einem Fenster zu zeigen. Das Ding ist aber, dass Grafiken offensichtlich in einem extra Prozess remapped bzw. überhaupt geladen werden. Wenn ich mein Programm mit niedriger Priorität laufen lasse, dann wird auf das Datatype gewartet und dann klappts auch und das Bild wird angezeigt. Aber mit normaler Priorität kommt nix. Irgendwie muss man wohl extra warten (vielleicht auf eine Message) und dann nochmal refreshen oder so. Ist wahrscheinlich ne Winzigkeit, aber ich raffs nicht. Sach ma jemand was dazu. Danke schonmal. [ - Antworten - Zitieren - Direktlink - ] |
10.10.2004, 18:41 Uhr thomas Posts: 7718 Nutzer |
Ich habe keine Ahnung, wovon du sprichst. So geht's: code:#include <proto/exec.h> #include <proto/dos.h> #include <proto/graphics.h> #include <proto/intuition.h> #include <proto/datatypes.h> #include <datatypes/pictureclass.h> int main (int argc,char **argv) { struct Screen *scr; Object *o; struct BitMap *bm; struct BitMapHeader *bmhd; struct Window *win; struct Message *msg; char *filename; filename = argc > 1 ? argv[1] : "sys:prefs/worldmap"; if (scr = LockPubScreen (NULL)) { if (o = NewDTObject (filename, DTA_GroupID,GID_PICTURE, PDTA_Screen,scr, TAG_END)) { DoDTMethod (o,NULL,NULL,DTM_PROCLAYOUT,NULL,TRUE); GetDTAttrs (o, PDTA_BitMapHeader,&bmhd, PDTA_DestBitMap,&bm, TAG_END); if (win = OpenWindowTags (NULL, WA_Title,filename, WA_InnerWidth,bmhd->bmh_Width, WA_InnerHeight,bmhd->bmh_Height, WA_Flags,WFLG_CLOSEGADGET|WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_ACTIV ATE, WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_MOUSEBUTTONS|IDCMP_VANILLAKEY, TAG_END)) { BltBitMapRastPort (bm,0,0,win->RPort,win->BorderLeft,win->BorderTop,win->GZZWidth,win->G ZZHeight,0xc0); WaitPort (win->UserPort); while (msg = GetMsg (win->UserPort)) ReplyMsg (msg); CloseWindow (win); } DisposeDTObject (o); } UnlockPubScreen (NULL,scr); } PrintFault (IoErr(),NULL); return (0); } Gruß Thomas -- Email: thomas-rapp@web.de Home: home.t-online.de/home/thomas-rapp/ [ Dieser Beitrag wurde von thomas am 10.10.2004 editiert. ] [ - Antworten - Zitieren - Direktlink - ] |
11.10.2004, 01:06 Uhr Timo Posts: 13 Nutzer |
Das mit dem DoDTMethod() ist doch schon mal ne gute Idee. Danke! Wenn ich aber anstelle BlitBitMapRastPort() das DT-Objekt direkt an das Fenster hänge (sodass auch automatisch Refreshs geschehen), dann bleibt mein Problem. Ist aber nicht so schlimm, so komm ich erstmal weiter. So wollte ich es eigentlich machen: (Auszug) <code> if (titeldto = NewDTObject("System/Graphics/Titel.png", PDTA_Screen, scr, PDTA_DestMode, PMODE_V43, TAG_DONE)) { DoDTMethod(titeldto, NULL, NULL, DTM_PROCLAYOUT, NULL, TRUE); GetDTAttrs(titeldto, DTA_NominalHoriz, &breite, DTA_NominalVert, &hoehe, TAG_DONE); SetDTAttrs(titeldto, NULL, NULL, GA_Left, 0, GA_Top, 0, GA_Width, breite, GA_Height, hoehe, TAG_DONE); if (titelfenster = OpenWindowTags(NULL, WA_Left, (scr->Width / 2) - (breite / 2), WA_Top, (scr->Height / 2) - (hoehe / 2), WA_Width, breite, WA_Height, hoehe, WA_Borderless, TRUE, WA_Gadgets, titeldto, // HIER!!! WA_ScreenTitle, "Inutilis Horny", WA_SimpleRefresh, TRUE, WA_IDCMP, IDCMP_INACTIVEWINDOW, TAG_DONE)) { RefreshDTObject(titeldto, titelfenster, NULL, NULL); } } </code> [ - Antworten - Zitieren - Direktlink - ] |
11.10.2004, 09:14 Uhr bubblebobble Posts: 707 Nutzer |
Da habe ich auch mal eine kurze Frage: Und zwar: DoDTMethod(titeldto, NULL, NULL, DTM_PROCLAYOUT, NULL, TRUE); Eigentlich heisst es DoDTMethod(object, win, req, msg); Also wie mache ich aus DTM_PROCLAYOUT, NULL, TRUE eine sog. "Message", von der in den Autodocs die Rede ist ? Ich programmiere nicht in C, deshalb muss ich das von Hand machen. Muss ich irgendwie Speicher allocieren und diese Werte reinschriebne oder wie realisiert der C Compiler das ? -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, UDM, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
11.10.2004, 11:11 Uhr thomas Posts: 7718 Nutzer |
Zitat: Falsch. Es heißt DoDTMethodA(object, win, req, msg); DoDTMethod ist ein Varargs-Stub für DoDTMethodA. Msg ist ein Pointer auf eine methodenabhängige Struktur. Für DTM_PROCLAYOUT ist es eine struct gpLayout. In C hast du zwei Möglichkeiten: entweder DoDTMethod (o,NULL,NULL,DTM_PROCLAYOUT,NULL,1); oder struct gpLayout gpl = {DTM_PROCLAYOUT,NULL,1}; DoDTMethodA (o,NULL,NULL,&gpl); Für Programmiersprachen ohne Varargs mußt du die zweite Variante nehmen. Gruß Thomas -- Email: thomas-rapp@web.de Home: home.t-online.de/home/thomas-rapp/ [ - Antworten - Zitieren - Direktlink - ] |
11.10.2004, 12:01 Uhr bubblebobble Posts: 707 Nutzer |
Super, vielen dank, hat geklappt. Wenn ich schon mal dabei bin dumme Fragen zu stellen: Wie speichere ich denn ein Bild mittels Datatype wieder ab ? (also ich meine nicht die build-in IFF-ILBM Routine). Und wie kann ich ein Datatype Objekt auf ein anderes Datatype übertragen ? (sprich das Fileformat wechseln ?). -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, UDM, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
11.10.2004, 12:37 Uhr thomas Posts: 7718 Nutzer |
Vielleicht solltest du lieber einen eigenen Thread öffnen, du bist doch sehr off-topic hier. Außerdem solltest du erstmal die älteren Threads durchsehen. Das Thema wurde definitiv schon besprochen. Gruß Thomas -- Email: thomas-rapp@web.de Home: home.t-online.de/home/thomas-rapp/ [ - Antworten - Zitieren - Direktlink - ] |
11.10.2004, 14:05 Uhr thomas Posts: 7718 Nutzer |
@Timo: ich habe nochmal ein paar Beispiele gewälzt (warum kannst du das eigentlich nicht selbst ?) und so funktioniert es jetzt: code:#include <proto/exec.h> #include <proto/dos.h> #include <proto/utility.h> #include <proto/graphics.h> #include <proto/intuition.h> #include <proto/datatypes.h> #include <datatypes/pictureclass.h> #include <intuition/icclass.h> int main (int argc,char **argv) { struct Screen *scr; Object *o; struct BitMapHeader *bmhd; long winw,winh; struct Window *win; struct IntuiMessage *mess; BOOL cont; char *filename; struct TagItem *tags,*tag; filename = argc > 1 ? argv[1] : "sys:prefs/worldmap"; if (scr = LockPubScreen (NULL)) { if (o = NewDTObject (filename, DTA_GroupID,GID_PICTURE, PDTA_Screen,scr, TAG_END)) { GetDTAttrs (o, PDTA_BitMapHeader,&bmhd, TAG_END); winw = bmhd->bmh_Width + scr->WBorLeft + scr->WBorRight; if (winw > scr->Width) winw = scr->Width; winh = bmhd->bmh_Height + scr->WBorTop + scr->WBorBottom + scr->RastPort.TxHeight + 1; if (winh > scr->Height) winh = scr->Height; if (win = OpenWindowTags (NULL, WA_Title, filename, WA_Width, winw, WA_Height, winh, WA_Left,(scr->Width - winw) >> 1, WA_Top,(scr->Height - winh) >> 1, WA_Flags, WFLG_CLOSEGADGET | WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_ACTIVATE | WFLG_SIMPLE_REFRESH | WFLG_NOCAREREFRESH, WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_GADGETDOWN | IDCMP_VANILLAKEY | IDCMP_IDCMPUPDATE, TAG_END)) { SetDTAttrs (o, NULL, NULL, GA_Left, win->BorderLeft, GA_Top, win->BorderTop, GA_Width, win->GZZWidth, GA_Height, win->GZZHeight, GA_Immediate, TRUE, ICA_TARGET, ICTARGET_IDCMP, TAG_END); AddDTObject (win, NULL, o, -1); cont = TRUE; do { WaitPort (win->UserPort); while (mess = (struct IntuiMessage *) GetMsg (win->UserPort)) { switch (mess->Class) { case IDCMP_IDCMPUPDATE: tags = mess->IAddress; while (tag = NextTagItem (&tags)) { switch (tag->ti_Tag) { case DTA_Sync: RefreshDTObjects(o, win, NULL, NULL); break; } } break; case IDCMP_CLOSEWINDOW: cont = FALSE; break; case IDCMP_VANILLAKEY: if (mess->Code == 0x1b) cont = FALSE; break; case IDCMP_GADGETDOWN: if (mess->IAddress == o) cont = FALSE; break; } ReplyMsg ((struct Message *)mess); } } while (cont); CloseWindow (win); } DisposeDTObject ((Object *)o); } UnlockPubScreen (NULL, scr); } PrintFault (IoErr(), NULL); return (0); } Gruß Thomas -- Email: thomas-rapp@web.de Home: home.t-online.de/home/thomas-rapp/ [ - Antworten - Zitieren - Direktlink - ] |
11.10.2004, 15:00 Uhr Timo Posts: 13 Nutzer |
Aha, also doch auf Messages warten und refreshen. Dat is mir zu umständlich, also mach ich es doch einfach mit Blit... Ein bisschen Quellen durchwühlt habe ich auch, aber die sind immer gleich so umfangreich, dass man nicht sehen kann, was nun eigentlich das Wesentliche ist. Und irgendwie kriege ich die Beispiele von der Developer-CD nicht kompiliert, sodass ich selbst rumprobieren könnte. Und wieder alles selbst machen... bin zu faul. Kann ja immer sein, dass jemand ganz schnell ne Lösung weiß. Ich bin aber jetzt zufrieden, danke für die Antworten! [ - Antworten - Zitieren - Direktlink - ] |
11.10.2004, 17:08 Uhr thomas Posts: 7718 Nutzer |
Daraus kann man dann wohl auch auf die Qualität deiner Software schließen... 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 > Mit Datatypes Bilder zeigen | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |