amiga-news 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: 7716
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: 7716
Nutzer
Zitat:
Eigentlich heisst es
DoDTMethod(object, win, req, msg);


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: 7716
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: 7716
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: 7716
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.
.