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

amiga-news.de Forum > Programmierung > Bild laden und anzeigen [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

14.04.2008, 17:40 Uhr

GMKai
Posts: 155
Nutzer
Mit folgendem Code bekomme ich Screen und Fenster auf, der Versuch ein Bild zu laden scheitert aber, schaut mal drauf und gebt Hinweise.
Danke.
C code:
#include <exec/types.h>
#include <intuition/intuition.h>
#include <proto/intuition.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/graphics.h>
#include <proto/datatypes.h>
#include <datatypes/pictureclass.h>

struct IntuitionBase  *IntuitionBase = NULL;
struct Screen         *Bildschirm = NULL;         // Zeiger auf Screen Struktur
struct RastPort       *rp=NULL;
struct Window         *MyWindow = NULL;

Object *dto;
struct BitMapHeader *bmhd;
struct BitMap *bm;
struct IntuiMessage *imsg;

void init(void);
void cleanup(void);
void action(void);
void drawpic(void);

int main(void)
{
   init();
   if (IntuitionBase != NULL)
   {
     action();
     cleanup();
   } 
   return 0;
}

void init(void)
{
    // Öffne Intuition Library
   IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 37L);
   /* Öffne neuen Screen */
   Bildschirm = OpenScreenTags(NULL,
                               SA_LikeWorkbench, FALSE,        
                               SA_Width,640,
                               SA_Height,480,
                               SA_Exclusive,TRUE,
                               SA_Title,NULL,  
                               TAG_DONE);
   if(Bildschirm!=NULL)
   {
    MyWindow=(struct Window*)OpenWindowTags(NULL,
                                            WA_Left,0,
                                            WA_Top,0,
                                            WA_Width,640,
                                            WA_Height,480,
                                            WA_DepthGadget,FALSE,
                                            WA_CloseGadget,TRUE,
                                            WA_SizeGadget,FALSE,
                                            WA_DragBar,FALSE,
                                            WA_GimmeZeroZero,TRUE,
                                            WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_MOUSEBUTTONS,
                                            WA_CustomScreen,Bildschirm,
                                            WA_Activate,TRUE,
                                            TAG_END);

    if(MyWindow!=NULL)
    {
    rp=MyWindow->RPort;
    dto = NewDTObject ("gfx/1.jpeg",DTA_GroupID,GID_PICTURE,PDTA_Remap,TRUE,PDTA_Screen,Bildschirm,PDTA_DestMode,PMODE_V43,TAG_END);
    }
   }
}

void cleanup(void)
{
   if(MyWindow!=NULL)
   {CloseWindow(MyWindow);
   }
   if(dto!=NULL)
   {DisposeDTObject(dto);
   }
   if(Bildschirm != NULL)   // Falls der Screen geöffnet werden konnte...
   {CloseScreen(Bildschirm);  // Schließe Screen
   }
   if(IntuitionBase!=NULL)
   {CloseLibrary((struct Library *) IntuitionBase);  // Schließe Intuition Library
   }
}

void action(void)
{
   ULONG signals;
   struct IntuiMessage *message;
   UWORD msg_code;
   ULONG msg_class;
   BOOL end = FALSE;
   while(!end&&MyWindow)
      {
        signals = SetSignal(0L,0L);
        if(signals & (1L<<MyWindow->UserPort->mp_SigBit))
        {
         while(message = (struct IntuiMessage*)GetMsg(MyWindow->UserPort))
         {
           drawpic();
          msg_class = message->Class;
          msg_code  = message->Code;
          ReplyMsg((struct Message*)message);
          switch(msg_class)
          {
           case IDCMP_CLOSEWINDOW:
                end = TRUE;
                break;
           case IDCMP_MOUSEBUTTONS:
                end = TRUE;
                break;
           default:
                break;
          }
         }
        }
       }
}

void drawpic(void)
{
   if(dto!=NULL)
   {
    DoDTMethod (dto,NULL,NULL,DTM_PROCLAYOUT,NULL,TRUE);
    GetDTAttrs (dto,PDTA_BitMapHeader,&bmhd,PDTA_BitMap,&bm,TAG_END);
    BltBitMapRastPort(bm,0,0,rp,MyWindow->BorderLeft,MyWindow->BorderTop,MyWindow->GZZWidth,MyWindow->GZZHeight,0xc0);
   }
}


[ - Antworten - Zitieren - Direktlink - ]

14.04.2008, 17:51 Uhr

Holger
Posts: 8116
Nutzer
@GMKai:
Guck mal, wann Du Deine drawpic() Funktion aufrufst. Das ist ein ungünstiger Zeitpunkt, weil Du nur wenige Nanosekunden später Dein Fenster wieder zu machst. So schnell kann kein User gucken. Abgesehen davon ist Dein "Message-Handling", das muss einfach mal gesagt werden, haarsträubend. Ich möchte Dir wärmstens die Funktionen Wait() und WaitPort() ans Herz legen. Und wenn Du das geschafft hast, versuch bei Deinem Fenster auf GZZ zu verzichten.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

15.04.2008, 11:17 Uhr

GMKai
Posts: 155
Nutzer
danke für die Ansätze,
den Aufruf von drawpic() hab ich nach vorn verlegt, das Bild wird jetzt angezeigt und danach auf den User gewartet.
Was ich vorhabe ist ein Demo, also selbstlaufend aber bei Mausklick soll es beendet werden, daher das Messagehandling wie oben...

Den Aufruf von
BltBitMapRastPort()
habe ich aus einem Beispielprogramm von Thomas Rapp.

Welche Koordinaten sind denn empfehlenswerter,bzw. wo kann ich nachschlagen welche es gibt?
Wo sind die angesprochenen Wait()-Funktionen dokumentiert?


[ - Antworten - Zitieren - Direktlink - ]

15.04.2008, 11:37 Uhr

Chritoph
Posts: 549
Nutzer
@GMKai:

Amiga NDK3.9 Autodocs/Includes
oder Amiga Rom Kernel Manuals
oder http://amiga.sourceforge.net/amigadevhelp/ (wenn die wieder online sind *HEUL*)
oder Amiga Guru Book (glaub ich)
--
A4000T-128MB-233MHz 604e-50MHz 68060-SCSI Platten-Voodoo 3 3000/Mediator/SB4.1 digital/Highway/Norway/RLT8029/Arxon Scandoubler/interner Monitorswitch<-voll KRANK!

A1200-32MB-50MHz 68030&68882-IDE Platten-Fiberline Netzwerkkarte

[ - Antworten - Zitieren - Direktlink - ]

15.04.2008, 11:54 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von GMKai:
Was ich vorhabe ist ein Demo, also selbstlaufend aber bei Mausklick soll es beendet werden, daher das Messagehandling wie oben...

Dazu gibt es ja die Messages mit der Information, was passiert ist. Auf die sollte man aber warten, statt das Signal zu pollen.
Wenn es gleichzeitig weiterlaufen soll, kannst Du IDCMP_INTUITICKS verwenden. Die senden alle 1/10 Sekunden ein TICK, solange das Fenster aktiv ist. Damit kann die Demo weiter laufen, ohne dass Du das Signal pollen musst. Wenn das Fenster deaktiviert wird, bleibt die Demo dann stehen, was nicht verkehrt ist. Alternativ kann man auch zusätzlich auf die Deaktivierung-Nachricht hören und die Demo dann beenden.
Zitat:
Den Aufruf von
BltBitMapRastPort()
habe ich aus einem Beispielprogramm von Thomas Rapp.

Welche Koordinaten sind denn empfehlenswerter,bzw. wo kann ich nachschlagen welche es gibt?

Wenn Du die Beispiele von Thomas Rapp kennst, dann sieh doch z.B. bei
http://thomas-rapp.homepage.t-online.de/examples/dtwin.c
nach, wie man auf ein Signal wartet.
Was die Koordinaten angeht, falls Du damit die GZZ-Problematik meinst: wenn Du ohnehin bildschirmfüllend Bilder anzeigen willst, setze einfach das BORDERLESS-Flag und lasse GZZ weg. Dann bekommst Du genauso Koordinaten von (0,0)-(Bildschirmbreite,Bildschirmhöhe), aber ohne den Overhead eines zusätzlichen Layers.
Zitat:
Original von Chritoph:
@GMKai:
Amiga NDK3.9 Autodocs/Includes
oder Amiga Rom Kernel Manuals

Ganz genau. Bzw. AmigaDevCD (2.1 war glaub ich die aktuellste bzw. letzte). Stichworte exec.library/Message-Handling und Signale, sowie intuition.library/IDCMP...

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

23.04.2008, 14:45 Uhr

GMKai
Posts: 155
Nutzer
danke für die Hilfe soweit,
Bilder lassen sich nun anzeigen,
allerdings nicht in 24Bit, wenn ich das richtig sehe...;-)

Noch eine Verständnisfrage:
Was macht folgende Zeile:

Wait ((1L << MyWindow->UserPort->mp_SigBit) | SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C)

bzw, was bedeutet 1L?
Muß ich CTRL_C nicht noch als VANILLAKEY im Messagehandling abfangen und entspr. reagieren?

Und für die Zukunft:
Was muß ich wie tun um einen regulären 24-Screen öffnen zu können?

[ - Antworten - Zitieren - Direktlink - ]

23.04.2008, 14:56 Uhr

thomas
Posts: 7716
Nutzer
Zitat:
Was macht folgende Zeile:

Wait ((1L << MyWindow->UserPort->mp_SigBit) | SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C)


1L bedeutet 1 als Langwort (32 bit). Eigentlich kann man das L weglassen, da heutige Compiler sowieso long als Default haben.

window->UserPort ist der IDCMP-Port des Fensters.
port->mp_SigBit ist die Signalnummer des Ports
1 << sigbit erzeugt eine Signalmaske, in der genau ein Bit gesetzt ist.

Also wenn sigbit = 15 ist, dann kommt da binär 00000000000000001000000000000000 raus.

SIGBREAKF_CTRL_C ist eine Konstante, die das sigbit für Ctrl-C gesetzt hat.

sigmask | SIGBREAKF_CTRL_C kombiniert die beiden.

Wait(sigmask | SIGBREAKF_CTRL_C) wartet auf beide Signale. Wenn eins von beiden eintrifft (also wenn jemand Ctrl-C drückt oder wenn eine IDCMP-Message ankommt), kommt die Funktion zurück.

Wait() gibt dabei das Signal zurück, das eingetroffen ist.

Wait() & SIGBREAKF_CTRL_C prüft, ob das eingetroffene Signal das für Ctrl-C ist.

Etwas ausführlicher könnte man das so schreiben:

code:
window_signal = 1 << win->UserPort->mp_SigBit;

signals_received = Wait (window_signal | SIGBREAKF_CTRL_C);

if (signals_received & SIGBREAKF_CTRL_C)
{
	/* Ctrl-C empfangen */
}

if (signals_received & window_signal)
{
	/* IDCMP-Message empfangen */
}


Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

23.04.2008, 15:43 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von GMKai:
Und für die Zukunft:
Was muß ich wie tun um einen regulären 24-Screen öffnen zu können?

Es gibt keinen "regulären 24-Screen". True-Color Screens gibt es sowieso nur, wenn Picasso96 oder Cybergraphics im System vorhanden sind, und auch dann gibt es natürlich eine ganze Reihe von True-Color Modi, die sich in Punkto Auflösung und Pixelformat unterscheiden.

Wenn es Dir nur darum geht, das Bild optimal darzustellen, kannst Du das Datatypes Objekt nach einem bevorzugten Bildschirmmodus befragen.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

19.05.2008, 17:39 Uhr

GMKai
Posts: 155
Nutzer
Das mit den 24-Bit-Screens lässt mich nicht los...
Im Aminet
http://aminet.net/dev/misc/CGraphX-DevKit.lha
gibts das entspr. SDK.
Ich habe bei mir CubicIDE installiert, wie kann ich dieses und für die Zukunft auch andere SDKs da einbinden?

[ - Antworten - Zitieren - Direktlink - ]

19.05.2008, 18:19 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von GMKai:
Das mit den 24-Bit-Screens lässt mich nicht los...
Im Aminet
http://aminet.net/dev/misc/CGraphX-DevKit.lha
gibts das entspr. SDK.
Ich habe bei mir CubicIDE installiert, wie kann ich dieses und für die Zukunft auch andere SDKs da einbinden?


Einfach die Includes in die passenden Verzeichnisse ziehen.
Eventuell musst Du noch einige Includes (z.B. pragma und protos) per fd2pragma selbst erstellen.



--
http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 19.05.2008 um 18:21 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Bild laden und anzeigen [ - Suche - Neue Beiträge - Registrieren - Login - ]


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