Announcement

Collapse
No announcement yet.

Bitmap als Hintergrund

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Bitmap als Hintergrund

    Hallo, alle miteinander,

    ich habe da ein Problem. Irgendwo habe ich mal gelesen, wie man ein Bitmap als Hintergrund in einer Form benutzt. Ich weiß aber nicht mehr, wo das war und wie das geht. Kann mir von euch vielleicht jemand helfen, am besten mit einer Quelltext-Prozedur? Vielen Dank schon mal im vorraus!

    Michael

  • #2
    Abgeschrieben aus <b>Delphi 2-Das Buch</b> (boah, uralt ;o):
    <PRE>
    type
    &nbsp;&nbsp;Form1 = class(TForm)
    &nbsp;&nbsp;&nbsp;&nbsp;...
    &nbsp;&nbsp;private
    &nbsp;&nbsp;&nbsp;&nbsp;BSBrush : HBrush;
    &nbsp;&nbsp;&nbsp;&nbsp;...

    {$R BORSTIL.RES}

    procedure TForm1.FormCreate(Sender: TObject);
    var
    BorBM : TBitmap;
    begin
    &nbsp;&nbsp;BorBM := LoadBitmap(hInstance,pchar(998));
    &nbsp;&nbsp;BSBrush := CreatePatternBrush(BorBM);
    &nbsp;&nbsp;DeleteObject(BorBM);
    &nbsp;&nbsp;Canvas.Brush.Handle := BSBrush;
    end;

    procedure TForm1.FormPaint(Sender: TObject);
    begin
    &nbsp;&nbsp;Canvas.Rectangle(-1,-1,Width,Height);
    end;
    </PRE>
    So, das war die harmlose "Ich mach alles mit Delphi"-Variante. ) Vorausgesetzt wird die besagte RES-Datei, die eine Bitmap enthält; ich nehme mal an der Code dieser Bitmap ist "998". Dann wird diese Bitmap beim Erzeugen des Formulars geladen, zugeordnet und bei "FormPaint" als Hintergrund gemalt.<br><br>
    Im selben Buch gibt´s noch 3 andere Versionen, die mehr Systemfunktionen nutzen. Soll ich die auch posten?<br><br>Mathias

    Comment


    • #3
      Ja, wäre nett, damit ich alles mal ausprobieren kann.

      THX Michae

      Comment


      • #4
        Na gut. Was tut man nicht alles. )<br><br>Numero Uno:
        <pre>
        type
        &nbsp;&nbsp;TForm1 = class(TForm)
        &nbsp;&nbsp;&nbsp;&nbsp;procedure FormCreate(Sender: TObject);
        &nbsp;&nbsp;&nbsp;&nbsp;...
        &nbsp;&nbsp;private
        &nbsp;&nbsp;&nbsp;&nbsp;BSBrush : hBrush;
        &nbsp;&nbsp;&nbsp;&nbsp;procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
        &nbsp;&nbsp;...

        procedure TForm1.FormCreate(Sender: TObject);
        begin
        &nbsp;&nbsp;// wie bei der allersten Lösung; ich spar´s mir deshalb )
        end;

        procedure TForm1.WMPaint(var Message: TWMPaint);
        begin
        &nbsp;&nbsp;Canvas.Rectangle(-1,-1,Width,Height); inherited;
        end;
        </pre>
        Du <b>musst</b> hier die Funktion "TForm1.FormPaint" rausnehmen. Du brauchst nur "FormCreate" und die besagte "WMPaint".<br><font color=#ff0000><b>Nebenbei</b></font>: deswegen sind es insgesamt auch nur 3 Lösungen und nicht 4. Bei einer wurde nur die WM_PAINT abgefangen, mit einem Piepser hörbar gemacht, aber den Rest erledigt auch die "FormPaint"

        Comment


        • #5
          Und die letzte Lösung:
          <pre>
          type
          &nbsp;&nbsp;TForm1 = class(TForm)
          &nbsp;&nbsp;&nbsp;&nbsp;procedure FormCreate(Sender: TObject);
          &nbsp;&nbsp;&nbsp;&nbsp;procedure WndProc(var Message: TMessage); override;
          &nbsp;&nbsp;...<br><br>
          // wie gehabt, "FormCreate" bleibt identisch<br><br>
          procedure TForm1.WndProc(var Message: TMessage);
          begin
          &nbsp;&nbsp;if(Message.Msg = WM_Paint) then Canvas.Rectangle(-1,-1,Width,Height);
          &nbsp;&nbsp;inherited WndProc(Message);
          end;
          </pre>
          Jetzt, nach dem Abschreiben, fällt mir auf, dass die Unterschiede gar nicht so groß sind. )<br>
          Bitte schön.<br><br>Mathias

          Comment


          • #6
            Hallo Mathias,

            dieser Beitrag ist zwar schon etwas her, habe aber trotzdem eine
            Frage zu einer Alternative. Ich möchte ebenfalss ein Bitmap (aus
            .res Datei) in den Hintergrund stellen (mit Delphi 6). Dies
            funktioniert auch wie in dem Beispiel beschrieben prima. Leider
            möchte ich aber das Bitmap bei einer veränderung der Fenster-
            größe an das Fenster anpassen. Der Canvas.StretchDraw(TRect,
            TGraphic) unterstützt diese Möglichkeit.
            Ich weiss allerdings nicht woher ich das TGrapgics Objekt bekomme.

            Wenn Du einen Tip hast würde ich mich freuen.

            Gruß
            Frank

            PS. In Delphi 6 musste ich die Deklaration BorBM : TBitmap in
            BorBM : HBitmap ändern, da ich beim kompilieren einen Fehler
            erhielt (Datentypen stimmen nicht überein)

            Comment


            • #7
              Hallo Frank,

              dieses Problem hatte ich auch in genau dieser Form. Allerdings habe ich da mein Bitmap aus praktischen Gründen im bmp-Format gehabt.
              Du machst einfach

              New(Bitmap);
              Bitmap.LoadFromFile("Hintergrund.bmp");

              und schon hast du dein TGraphics-Objekt.
              Dann machst du noch bei onPaint und onResize ein identisches Ereignis, das aus dem Befehl

              Canvas.StretchDraw(Rect(0,0,Width,Height-25),Bitmap);

              besteht. Die -25 bei der Höhe haben sich als praktisch erwiesen, da ansonsten der untere Teil des Bitmaps (je nach Formgröße) teilweise deutlich abgeschnitten wird.

              Ich hoffe, das ich dir helfen konnte,

              Gruß Michae

              Comment


              • #8
                Hallo Michael,

                ich bin anscheinend nicht in der Lage das korrekt umzusetzten.
                Ich erhalte den Fehler 'inkompatible Typen' wenn ich New(Bitmap)
                einsetze.
                Bei folgender OnCreate Procedur erhalte ich beim kompilieren keine
                Fehler, das Programm bricht aber mit einem Fehler beim Start ab.

                private
                { Private-Deklarationen }
                Bild : ^TGraphic;

                procedure TF_EcoVision.FormCreate(Sender: TObject);
                begin
                new(Bild);
                Bild.LoadFromFile('bild.bmp');
                end;

                procedure TF_EcoVision.OnPaint(Sender: TObject);
                begin
                Canvas.StretchDraw(Rect(0,0,width,Height-25),Bild^);
                end;

                Als was wurde 'Bitmap' bei Dir deklariert ?

                Gruß Fran

                Comment


                • #9
                  Hallo Mathias,<br>
                  was machst Du eigentlich, wenn das Form Scrollbars hat. Beim scrollen<br>
                  flackert das Bild ordentlich. Weißt Du wie man das vermeiden kann ?<br>
                  Jens Schumann<br&gt

                  Comment


                  • #10
                    Ich mache gar nichts. )<br>Ich benutze die Funktionen ja nicht. Ich habe sie nur aus besagtem Buch abgeschrieben, um Michael zu helfen.<br><br>Mathias

                    Comment


                    • #11
                      Hallo Mathias,<br>das ist gut "Ich mache gar nichts"<br>sag ich auch immer, wenn mich jemand fragt was ich mache. Ich sage dann immer: Ich sitze den ganzen Tag auf einem Stuhl.<br>;-) Jens Schuman

                      Comment


                      • #12
                        Ich denke, wir verstehen uns.<br><br>
                        Nicht jedes Problem, das jemand hat, interessiert mich so sehr, dass ich es auch selbst ausprobiere. Manchmal - wie in dem Fall - schreibe ich die Lösung einfach nur ab, und fertig. Deswegen weiß ich auch leider nicht, wie man das Flackern vermeiden kann. Sorry.<br>
                        Oder um es in Neu-Deutsch zu sagen:<br><br>
                        <i><b>offiziell:</b> I wasn´t involved in the project.<br>
                        <b>Slang:</b> It´s not my fucking problem.</i> :-D<br><br>
                        Ähem, du solltest auch mal aufstehen. Den ganzen Tag sitzen, gibt unschöne Druckstellen. :-D<br><br>Mathias

                        Comment

                        Working...
                        X