[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]

    PROGRAM Bmptblt;
    { Dieser Code beschreibt die Darstellung von Bitmaps mit "durchsichtigen" Bereichen
      (c) 1997 U. Conrad, uconrad1@gwdg.de }

    {$R BMPTBLT.RES}  { see end of document .. XX34 to extract RES file}

    USES OWindows,WinTypes,WinProcs,Strings;

    TYPE TDemoApp=OBJECT(TApplication)
           PROCEDURE InitMainWindow; virtual;
         END;

    TYPE PDemoWin = ^TDemoWin;
         TDemoWin = OBJECT(TWindow)
           PROCEDURE Paint(PaintDC : HDC;var PaintInfo : TPaintStruct); virtual;
           PROCEDURE GetWindowClass(var AWndClass : TWndClass); virtual;
         END;

    { Prozedur fuer die normale Abbildung von Bitmpas }
    PROCEDURE BmpBlt(DC : HDC;x,y : integer;hbmp : HBitmap);
    VAR MemDC        : HDC;
        OldBmp       : HBitmap;
        Bitmap       : TBitmap;
    BEGIN
      MemDC:=CreateCompatibleDC(DC);
      OldBmp:=SelectObject(MemDC,hbmp);
      GetObject(hBmp,Sizeof(Bitmap),@Bitmap);
      BitBlt(DC,10,10,Bitmap.bmWidth,Bitmap.bmHeight,MemDC,0,0,SrcCopy);
      SelectObject(MemDC,OldBmp);
      DeleteDC(MemDC);
    END;

    { Prozedur fuer die durchsichtige Darstellung }
    PROCEDURE BmpTransparentBlt(hDCDest : HDC;x,y : integer;hbmp : HBitmap;rgbTransparent : TColorRef);
    { hDCDest bezeichnet den Zielkontext, x und y die obere linke Ecke der Bitmap;
      hBmp ist ein Handle zu der Bitmap und rgbTransparent bezeichnet die Farbe,
      die bei der Darstellung "durchsichtig" dargestellt werden soll }
    VAR hDCSrc            : HDC;
        hDCMask           : HDC;
        Bitmap            : TBitmap;
        hbmTransMask      : HBitmap;
        OldBk             : TColorRef;
        OldCol            : TColorRef;
    BEGIN
      GetObject(hBmp,SizeOf(TBitmap),@Bitmap);           { Informationen ueber Bitmap speichern }
      hDCSrc:=CreateCompatibleDC(hDCDest);               { Quellkontext erzeugen }
      hDCMask:=CreateCompatibleDC(hDCDest);              { Kontext fuer MAske erzeugen }
      hbmTransMask:=CreateBitmap(Bitmap.bmWidth,Bitmap.bmHeight,1,1,nil);
      SelectObject(hDCSrc,hbmp);                         { Bitmap im Quellkontext abbilden }
      SelectObject(hDCMask,hbmTransMask);                { }
      SetBkColor(hDCSrc,rgbTransparent);                 { Maske erzeugen }
      BitBlt(hdcMask,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hDCSrc,0,0,SrcCopy);
      { mit Maske kombinieren }
      OldBk:=SetBkColor(hDCDest,RGB(255,255,255));
      OldCol:=SetTextColor(hDCDest,RGB(0,0,0));
      BitBlt(hDCDest,x,y,Bitmap.bmWidth,Bitmap.bmHeight,hDCSrc,0,0,SRCInvert);
      BitBlt(hDCDest,x,y,Bitmap.bmWidth,Bitmap.bmHeight,hDCMask,0,0,SRCAnd);
      BitBlt(hDCDest,x,y,Bitmap.bmWidth,Bitmap.bmHeight,hDCSrc,0,0,SRCInvert);
      SetBkColor(hDCDest,OldBk);
      SetTextColor(hDCDest,OldCol);
      { Kontexte freigeben }
      DeleteDC(hDCSrc);
      DeleteDC(hDCMask);
      DeleteDC(hDCDest);
      { Objekte loeschen }
      DeleteObject(hbmTransMask);
    END;

    { ================== Methoden des Fensters ===================== }
    PROCEDURE TDemoWin.Paint(PaintDC : HDC;var PaintInfo : TPaintStruct);
    VAR BmpTransparent   : HBitmap;
        BmpNormal        : HBitmap;
        OldMode          : integer;
    BEGIN
      BmpTransparent:=LoadBitmap(hInstance,'BMP_TRANSPARENT');
      BmpNormal:=LoadBitmap(hInstance,'BMP_Normal');
      BmpBlt(PaintDC,10,10,BmpNormal);
      TextOut(PaintDC,50,15,'Normale Darstellung',StrLen('Normale Darstellung'));
      { bildet die Bitmap ganz normal ab }
      BmpTransparentBlt(PaintDC,10,60,BmpTransparent,RGB(0,0,255));
      { bildet die Bitmap ab, ohne Pixel der Farbe RGB(0,0,255) darzustellen }
      OldMode:=SetBkMode(PaintDC,transparent);
      { fuer die Textausgabe wird erst jetzt der Transparent-Modus gesetzt }
      TextOut(PaintDC,50,65,'Transparente Darstellung',StrLen('Transparente Darstellung'));
      SetBkMode(PaintDC,OldMode);
      DeleteObject(BmpTransparent);
      DeleteObject(BmpNormal);
    END;

    PROCEDURE TDemoWin.GetWindowClass(var AWndClass : TWndClass);
    BEGIN
      inherited GetWindowClass(AWndClass);
      AWndClass.hbrBackground:=GetStockObject(LtGray_Brush);
      { fuer dieses Fenster nehmen wir einen grauen HIntergrund, um den
        Effekt sichtbar zu machen }
    END;

    { ================== Methoden der Applikation ===================== }
    PROCEDURE TDemoApp.InitMainWindow;
    BEGIN
      MainWindow:=New(PDemoWin,Init(nil,'Durchsichtige Darstellung von Bitmaps'));
    END;

    { *****************   Programm ******************* }

    VAR DemoApp  : TDemoApp;

    BEGIN
      DemoApp.Init('DemoApp');
      DemoApp.Run;
      DemoApp.Done;
    END.

    END.
    { the following contains additional files that should be included with this
      file.  To extract, you need XX3402 available with the SWAG distribution.

      1.     Cut the text below out, and save to a file  ..  filename.xx
      2.     Use XX3402  :   xx3402 d filename.xx
      3.     The decoded file should be created in the same directory.
      4.     If the file is a archive file, use the proper archive program to
             extract the members.

    { ------------------            CUT              ----------------------}

    *XX3402-001337-200697--72--85-48751-----BMPTBLT.RES--1-OF--1
    zk6+EYpELotDIYp-H++k+4U0+++c++++6++++0+++++-++E++++++++0++++++++++++++++
    +++E++++++++++++U+++U++++60++6++++0++6++U6+++60+U+1+kA++++1z++1z++++zzw+
    zk+++Dw+zk1zzk++zzzz+Dzzzzzzzzzzzzzzzzzzzzzzzz++++zzzzzzzzzzzzzzzz+5W6W+
    zzzzzzzzzzzzzzw5RrRrQDzzzzzzzzzzzzzkRrTzzs++++++++++++++-r1zzzzkW6W6W6W6
    W6W6U+QDzzzz1zzzzzzzzzzzzz+5+++++5Q5Q5Q5Q5Q5Q5wD+DwDzkTkTkTkTkTkTkTkzz++
    ++-z-z-z-z-z-z-z1zw5RrW6-s-s-s-s-s-s-kzz-rRsW6W6W6W6W6W6W6wDzkRrTzzzzzzz
    zzzzzzzz1zw5RsW6W6W6W6W6W6W6UDzz-rVr+++++++++++5W+zzzkS5Q5W6W6W6W6W6U61z
    zzzk++RsXzzzzzzzy6+Dzzzzzzw5SD++++++++S+zzzzzzzz-rXkNqRbNqQ5UDzzzzzzzkRs
    w4NaNaNa-s1zzzzzzzw5SD-bNqRbNkS+zzzzzzzz-rXkNaNaNaM5UDzzzzzzzkRsw4XsxqRb
    -s1zzzzzzzw5SD-jXsNaNUS+zzzzzzzz-rXkNqRbNqQ5UDzzzzzzzkRsw+++++++-s1zzzzz
    zzw5S6RrRrRrRrW+zzzzzzzz-rW6W6W6W6W6UDzzzzzzzkRzzzzzzzzzzkzzzzzzzzw5W6W6
    W6W6W61zzzzzzzzzw++++++++++Dzzzzzzzzzzzzzzzzzzzzzzzzzzzzzk6+EYpELpFGEItH
    I23GFItI+1++O+6++0U++++U++++6+++++2+-+++++++++6++++++++++++++++++-++++++
    ++++++0+++0+++++U6++U++++6++U+0+U+++U60++A1+k++++Dw++Dw+++1zzk1z++++zk1z
    +Dzz++1zzzw+nAnAnAnAnAnAnAnAnAnAnAnAk+++1AnAnAnAnAnAnAnAk+S6W61AnAnAnAnA
    nAnAn+RrRrRknAnAnAnAnAnAnA-rRzzzU+++++++++++++k5QDzzzz06W6W6W6W6W6W+-kzz
    zzwDzzzzzzzzzzzzw+Q+++++RkRkRkRkRkRkTkk+zkzz-z-z-z-z-z-z-z1Ak++++5w5w5w5
    w5w5w5wAn+RrS6U5U5U5U5U5U5U51Ak5RrW6W6W6W6W6W6W6XknA-rRzzzzzzzzzzzzzzzwA
    n+RrW6W6W6W6W6W6W6W+nAk5S5Q+++++++++++S61AnA-sRkS6W6W6W6W6W+UAnAnA++-rWD
    zzzzzzzsU+nAnAnAn+Rsw+++++++-s1AnAnAnAk5SD-bNqRbNkS+nAnAnAnA-rXkNaNaNaM5
    UAnAnAnAn+Rsw4RbNqRb-s1AnAnAnAk5SD-aNaNaNUS+nAnAnAnA-rXkODXrNqQ5UAnAnAnA
    n+Rsw4yDVaNa-s1AnAnAnAk5SD-bNqRbNkS+nAnAnAnA-rXk+++++++5UAnAnAnAn+RsVrRr
    RrRrS61AnAnAnAk5S6W6W6W6W6W+nAnAnAnA-rzzzzzzzzzz1AnAnAnAn+S6W6W6W6W6UAnA
    nAnAnAn+++++++++++nAnAnAnAnAnAnAnAnAnAnAnAnAnAnz1k1z+E+k51+++++G++6++M++
    EYpELotDIYp-H++L++6++c++EYpELpFGEItHI23GFItI++++++++++++
    ***** END OF BLOCK 1 *****

[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]