Wie kann ich Bitmaps drehen?



  • Ich will Bitmas drehen! In meinem Fall würde es schon reichen sie in 90° Schritten zu drehen. Ich will aber nicht 4 Bitmaps zeichnen (immer um 90° gedreht), obwohl es einfacher wäre, da ich es im allgemeinen wissen will und nicht für diesen speziellen Fall.
    Ich dachte man könnte dies mit einer Methode des Gerätokontextes lösen, in welchen man das Bitmap selektiert hat. In der Dokumentation habe ich jedoch keine passende Methode gefunden.

    Vielen Dank schon mal im voraus

    Mr.Perfect



  • Vielleicht CDC::PlgBlt, hab es aber noch nie verwendet, kann dir deswegen nciht mehr sagen.



  • Kann sein, weil der Befehl in ein Parallelogramm "blittet"...



  • Hier wird gleich der ganze Bildschirm um 180° gedreht. Sehr lehrreiches Programm. Ist zwar WinAPI, bei GDI spielt das aber keine große Rolle:

    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    int WINAPI WinMain (HINSTANCE,HINSTANCE,LPSTR,int)
    {
      HDC hdc,hdcMem;
      int cx,cy;
      HBITMAP hBitmap;
      if( LockWindowUpdate( GetDesktopWindow() ) )
      {
           //MessageBox(NULL,"","",0);
           hdc=CreateDC("DISPLAY",0,0,0);
    
           hdcMem=CreateCompatibleDC(hdc);
           cx=GetSystemMetrics(SM_CXSCREEN);
           cy=GetSystemMetrics(SM_CYSCREEN);
           hBitmap=CreateCompatibleBitmap(hdc,cx,cy);
           SelectObject(hdcMem,hBitmap);
           BitBlt(hdcMem,0,0,cx,cy,hdc,0,0,SRCCOPY);
           SetMapMode(hdc,MM_ISOTROPIC);
           SetWindowExtEx(hdc,cx,cy,0);
           SetViewportExtEx(hdc,-cx,-cy,0);
           SetViewportOrgEx(hdc,cx,cy,0);
           BitBlt(hdc,0,0,cx,cy,hdcMem,0,0,SRCCOPY);
           Sleep(5000); //Solange steht der Screen Kopf!
           SetViewportExtEx(hdc,cx,cy,0);
           SetViewportOrgEx(hdc,0,0,0);
           BitBlt(hdc,0,0,cx,cy,hdcMem,0,0,SRCCOPY);
           DeleteDC (hdcMem) ;
           DeleteDC (hdc) ;
           DeleteObject (hBitmap) ;
           LockWindowUpdate(0);
           InvalidateRect(NULL,NULL,TRUE);
           UpdateWindow(NULL);
      }
    return 0 ;
    }
    


  • Ja ich denke mit PlgBlt müsste es funktionieren, aber bei mir erscheint nichts auf dem Bilschirm was, ich glaube, am ersten Parameter POINT lpPoint liegt. In diesen Prameter kommt, der Dokumentation nach, ein POINT Array über 3 Werte herein, welche für 3 Eckkoordinaten stehen. Der Letze wird dann aus deren Werten berechnet.
    Ich habe folgenden Code benutzt:

    POINT drehPunkt[3]; 
        drehPunkt[0].x=point.x;
        drehPunkt[0].y=point.y;
        temp.x=point.x+bm.bmWidth;
        temp.y=point.y;
        drehPunkt[1]=temp;
        temp.x=point.x;
        temp.y=point.y+bm.bmHeight;
        drehPunkt[2]=temp;  
            dc.PlgBlt(drehPunkt,&dcMem,0,0,bm.bmWidth,bm.bmHeight,nix,0,0);
    

    (nix bezieht sich auf ein weisses Bitmap)
    Es wird jedoch nichts angezeigt. Komischerweise kann man für lpPoint die Aresse und das Objekt angeben. Aber in beiden Fällen geschieht gar nix. Kann mir jemand helfen? Danke!

    Mr. Perfect

    PS: Und ach ja: Bei dem Code von Erhard ist mit meinem Screen gar nichts passiert, der har sich nicht gedreht.

    [ Dieser Beitrag wurde am 30.12.2002 um 00:15 Uhr von Mr.Perfect editiert. ]


Anmelden zum Antworten