RasterOperation - Codes



  • Hallo!

    Ich bin gerade an einem Schachprojekt, und gebe die Figuren mit Transparenten Bitmaps (Mit Bitmasken, -> SRCAND, -> SRCPAINT) aus.

    Ich gebe das Brett immer so aus, dass es auf das ganze Fenster passt. Der Benutzer kann das Fenster groesser oder kleiner machen, und ich passe das Brett dann an die gegebenheiten an.

    Ich habe im Speicher immer die 12 Hauptbitmaps der Figuren mit 128*128 Pixel gespeicher. Von diesen erzeuge ich jedes Mal, wenn die Groesse des Fensters geendert wird 24 kleinere Bitmaps mit StretchBlt (12 Farbige Bitmaps + 12 Bitmasken).

    Das Problem bei mir ist jetzt das Aufbauem der Bitmasken!!!
    Ich erledige das so (bin sicher ist keine gute Lösung!):
    Ich lasse einfach eine das Brett Pixel für Pixel durchlaufen, wenn der Pixel eine bestimmte Farbe hat, dann Setze das Pixel in der Bitmaske auf Schwarz, sonst Weis. Und das dauert relativ lange(auf meinem Pentium 2 266 dauert das aufbauen der Bitmasken wenn das Fenster über dem ganzen Bildschirm ist ungefähr eine Sekunde!)

    Ich glaube, dass man dieses Erzeugen der Bitmasken vielleicht mit speziellen Raster-Operation-Codes um ein vielfaches Schneller hinbekommt.

    Danke.



  • Hallo! Der folgende Code war ein Teil eines Beispiels vom Mircodoft. Den hdc brauchst du wahrscheinlich nicht, kannst du weglassen (Funktion ändern), oder NULL übergeben. Viel Spaß damit.

    HBITMAP CreateMask(HDC hdc, HBITMAP hBitmap, COLORREF cTransparentColor)
    {
       BITMAP     bm;
       COLORREF   cColor;
       HBITMAP    bmMask;
       HBITMAP    bmMaskOld, bmMemOld;
       HDC        hdcMask, hdcMem;
       POINT      ptSize;
    
       hdcMem = CreateCompatibleDC(hdc);
       bmMemOld = SelectObject(hdcMem, hBitmap);   // Select the bitmap
    
       GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
       ptSize.x = bm.bmWidth;            // Get width of bitmap
       ptSize.y = bm.bmHeight;           // Get height of bitmap
       DPtoLP(hdcMem, &ptSize, 1);       // Convert from device
                                         // to logical points
       // Monochrome DC and Bitmap
       hdcMask = CreateCompatibleDC(hdc);
       bmMask = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);
    
       // Each DC must select a bitmap object to store pixel data.
       bmMaskOld = SelectObject(hdcMask, bmMask);
    
       // Set proper mapping mode.
       SetMapMode(hdcMask, GetMapMode(hdc));
    
       // Set the background color of the source DC to the color.
       // contained in the parts of the bitmap that should be transparent
       cColor = SetBkColor(hdcMem, cTransparentColor);
    
       // Create the object mask for the bitmap by performing a BitBlt
       // from the source bitmap to a monochrome bitmap.
       BitBlt(hdcMask, 0, 0, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY);
    
       // Free the memory bitmaps.
       SelectObject(hdcMem, bmMemOld);
       SelectObject(hdcMask, bmMaskOld);
    
       // Delete the memory DCs.
       DeleteDC(hdcMem);
       DeleteDC(hdcMask);
    
       return bmMask;
    }
    


  • Danke Joe;

    Du wirst jetz w*****einlich schon schlafen, aber dein Algo funkioniert!

    Ich habe dazu aber noch einen "angenehmeren" und schnelleren Weg für mein Problem gefunden! Ich berechnen Die Bitmasken einemal am Anfang für jede Figur mit deinem Algorithmus für die grossen Figuren. Wenn das Fenster jetzt vergrössert oder verkleinert wird mach ich das so wie mit den Figuren. Ich habe ja für jede Maske eine in voller Groesse und eine in Jetztgroesse. Ich Loesche die alten Bitmasken und erzeuge mit StretchBlt die Bitmasken für die neue Echte Darstellung!
    Das Funktioniert sogar auf meinem 266Mhz PC sehr flüssig, ohne dass man nur den hauch eines Ruckelns merkt!

    Danke!



  • Original erstellt von <Jürgen>:
    Ich Loesche die alten Bitmasken und erzeuge mit StretchBlt die Bitmasken für die neue Echte Darstellung!

    Lösche die alten nicht! Wenn du das Brett ganz klein machst, werden die Figuren verfälscht. Wenn du es dann wieder größer machst, hast du mit Sicherheit keine gute Darstellung mehr. Gehe immer von deinen Original-Masken aus.

    [ Dieser Beitrag wurde am 14.04.2003 um 01:15 Uhr von WebFritzi editiert. ]



  • Original erstellt von <Jürgen>:
    Ich habe ja für jede Maske eine in voller Groesse und eine in Jetztgroesse. Ich Loesche die alten Bitmasken und erzeuge mit StretchBlt die Bitmasken für die neue Echte Darstellung!

    Er hat doch gesagt, dass er seine Bitmasken immer ausgehend vom Orginal berechnet und die zu diesem Zeitpunkt aktuelle "Jetztgroesse" löscht er eben vorher. Das ist schon richtig so



  • Achso. Ich dachte, mit "alte Masken" meint er die Originale.


Anmelden zum Antworten