bilder gespiegelt darstellen???



  • Hi Leute,

    ich bastle gerade an einen kleinen Spielchen und hab folgende Frage,
    gibt es eine Möglichkeit die Bilder mit BltBit() oder besser noch mit der transparenten Variante auch gespiegelt(horizental) in ein CDC zu kopieren?
    Somit müsste ich nicht alle Bilderchen der Einheiten doppelt einbinden, einmal nach links schauen und ein mal nach rechts.
    Danke.



  • bitte keinen Vorschlag der mit GetPixel() und SetPixel() in Zusammenhang steht,
    das währe zu langsam. Danke.



  • Guck dir mal GetBitmapBits an



  • // Zeigt das in [hdcSrc] enthaltene Bitmap mit der Breite [width]
    // und der Höhe [height] im Device Context [hdcDest] kopfüber an.
    // Die linke obere Ecke des Bitmaps muss in [hdcSrc] bei (0,0) 
    // sein.
    // ACHTUNG: PlgBlt() ist für die Win9x-Versionen nicht verfügbar.
    BOOL ToppleBitmap(HDC hdcDest, HDC hdcSrc, int width, int height)
    {
       POINT pt[3] = {{0, height-1}, {width, height-1}, {0,-1}};
       return PlgBlt(hdcDest, pt, hdcSrc, 0, 0, width, height, NULL, 0, 0);
    }
    


  • Oder meintest du es anders gespiegelt? Na dann...

    #define RB_HORIZONTAL  0
    #define RB_VERTICAL    1
    
    // Spiegelt das in [hdcSrc] enthaltene Bitmap mit der Breite [width]
    // und der Höhe [height] gemäß der in [wFlags] angegebenen Konstanten.
    // Die linke obere Ecke des Bitmaps muss in [hdcSrc] bei (0,0) 
    // sein. Das gespiegelte Bitmap wird im DeviceContext [hdcDest] bei
    // (0,0) gemalt.
    // ACHTUNG: PlgBlt() ist für die Win9x-Versionen nicht verfügbar.
    BOOL ReflectBitmap(HDC hdcDest, HDC hdcSrc, int width, int height, WORD wFlags)
    {
       POINT pt_h[3] = {{width-1,0}, {-1,0}, {width-1,height}};
       POINT pt_v[3] = {{0,height-1}, {width,height-1}, {0,-1}};
       LPPOINT lppt;
    
       if(wFlags == RB_HORIZONTAL)
          lppt = pt_h;
       else if(wFlags == RB_VERTICAL)
          lppt = pt_v;
       else return FALSE;
    
       return PlgBlt(hdcDest, lppt, hdcSrc, 0, 0, width, height, NULL, 0, 0);
    }
    


  • das mit PlgBlt() sieht vielversprechend aus, das werd ich jetzt mal gleich
    testen. Ist wohl die einfachere Variante gegenüber dem Vorschlag von deus.

    Dank euch beiden.



  • RobRoy schrieb:

    Ist wohl die einfachere Variante gegenüber dem Vorschlag von deus.

    Jo, so siehts aus.



  • Hi,

    ich bin zwar kein ultimativer Fan von Win98 (zum Spielen super, zum Arbeiten total unbrauchbar), aber ich denke es ist noch nicht an der Zeit übermäßig viele "in-Win9x-nicht-verfügbar-Funktionen" zu verwenden, da immer noch einige Win9x verwenden (Microsoft wollte diese User nicht an Linux verlieren und hat deshalb den Support für Win98/... verlängert :p => Win9x ist noch nicht tod) und PlgBlt ist nur in WinXP/2k verfügbar.
    Allerdings hängt das natürlich auch von der Programmart ab.
    Überlegs dir.

    Grüße Rapha



  • Na, dann eben

    #define RB_HORIZONTAL 0
    #define RB_VERTICAL   1
    
    BOOL ReflectBitmap(HDC hdcDest, HDC hdcSrc, int width, int height, WORD wFlags)
    {
       if(wFlags == RB_HORIZONTAL)
          return StretchBlt(hdcDest, 0, 0, width, height,
                            hdcSrc, width-1, 0, -width, height,
                            SRCCOPY);
       else if(wFlags == RB_VERTICAL)
          return StretchBlt(hdcDest, 0, 0, width, height,
                            hdcSrc, 0, height-1, width, -height,
                            SRCCOPY);
       else
          return FALSE;
    }
    

    Ist diesmal mit StretchBlt, was auf jedem System läuft. 😉



  • also PlgBlt() sowie StretchBlt() funzt, ich werde mich aber für die StretchBlt()-Variante entscheiden, da das Programm später auf möglichst jedem System laufen sollte.

    Besten Dank nochmal WebFritzi, auch dir Rapha für die Anmerkung bzl. Windows9x.

    Thanks...



  • Gerngeschehen. Hat mir auch Spaß gemacht, das zusammenzustellen.



  • PlgBlt soll auch dafür dienen drehen zu können. Würde gern 90° ein Bild drehen, kann es bisher nur mit StretchBlt verzerren. Kann mir jemand sagen wie das mit dem drehen bei PlgBlt funktioniert? Ich bin da absolut ahnungslos. 😞


Anmelden zum Antworten