Announcement

Collapse
No announcement yet.

Canvas.Brush.Color=Transparent

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

  • Canvas.Brush.Color=Transparent

    Canvas.Brush.Color := clred;
    <br>Hallo mit obiger Anweisung wird der Hintergrund rot. Gibt es anstatt clred einen Wert der sowas transparent darstellt. Gruß ph

  • #2
    Das mußt Du schon selbst Programmieren - oder Komponenten verwenden die Transparenz können.

    Die <a href="http://www.lmdinnovative.com/products/lmdelpack/">ElPack-Komponenten</a> bieten bei sehr vielen Komponenten Transparenz an (bzw. benötigen es eh für XP-Themes

    Comment


    • #3
      Hi Peter,<br>
      kommt drauf an, was genau du willst. U.U. reicht es, Canvas.Brush.Style auf bsClear zu setzen.Bsp.:
      <pre class="sourcecode"><code>
      <b>procedure</b> TForm1.FormPaint(Sender: TObject);
      <b>var</b>
      r: TRect;
      <b>begin</b>
      SetRect(r, 300, 200, 500, 300);
      Canvas.Brush.Color := clRed;
      Canvas.Rectangle(r);
      OffsetRect(r, 30, 30);
      Canvas.Brush.Style := bsClear;
      Canvas.Rectangle(r);
      <b>end</b>;
      </code></pre>
      HTH, Uli

      Comment


      • #4
        HAllo

        Ich drucke z.B. Zebrastreifen nach folgendem Code.

        <PRE>
        Begin
        // Zebrastreiffen ++++++++++++++++++++++++++++++++++++++++++++++++
        If ZZ MOD 2 = 0 Then
        Begin
        Canvas.Brush.Color := clYellow;
        Canvas.Pen.Style := psClear;
        Canvas.RectAngle((Round(RAND * HMM)),
        Round(Y * VMM),
        Round((RAND + 170) * HMM),
        Round((Y + ABSTAND) * VMM));
        Canvas.Brush.Color := clWhite;
        SetBKMode(Printer.Handle,TRANSPARENT);
        Canvas.Brush.Style := bsClear;
        End;
        // Tabelle Präsenz +++++++++++++++++++++++++++++++++++++++++++++++
        Canvas.Font.Size := 8;
        {
        Canvas.TextOut(Round((RAND + TAB00) * HMM),
        Round(((Y) * VMM)),
        Table_T_ABSAMB.FieldByName('KW').AsString);
        }
        Canvas.TextOut(Round((RAND + TAB00) * HMM),
        Round(((Y) * VMM)),
        Table_T_ABSAMB.FieldByName('DATUM').AsString);
        Canvas.TextOut(Round((RAND + TAB00 + 20 ) * HMM),
        Round(((Y) * VMM)),
        Table_T_ABSAMB.FieldByName('VORMITTAG').AsString);
        Canvas.TextOut(Round((RAND + TAB00 + 30 ) * HMM),
        Round(((Y) * VMM)),
        Table_T_ABSAMB.FieldByName('NACHMITTAG').AsString) ;
        Canvas.TextOut(Round((RAND + TAB00 + 40 ) * HMM),
        Round(((Y) * VMM)),
        Table_T_ABSAMB.FieldByName('VISPB').AsString);
        Canvas.TextOut(Round((RAND + TAB00 + 50 ) * HMM),
        Round(((Y) * VMM)),
        Table_T_ABSAMB.FieldByName('VISVA').AsString);
        Canvas.TextOut(Round((RAND + TAB00 + 60 ) * HMM),
        Round(((Y) * VMM)),
        Table_T_ABSAMB.FieldByName('BEMERKUNG').AsString);
        Canvas.TextOut(Round((RAND + TAB00 + 135 ) * HMM),
        Round(((Y) * VMM)),
        Table_T_ABSAMB.FieldByName('FEIERTAG').AsString);
        ZEILE := ZEILE + 1;
        Y := Y + 4;
        ZZ := ZZ + 1;
        Table_T_ABSAMB.Next;
        Canvas.Pen.Style := psSolid;
        End;
        </PRE>

        Gruss
        Hanspete

        Comment


        • #5
          Hallo, mein bestreben ist das die Laufschrift nicht das Hintergrundbild an der Stelle verwischt, an der die Laufschrift erscheint. Setze ich Canvas.Brush.Style auf bsClear werden alle Buchstaben verwischt, aber das Hintergrundbild bleibt so wie es soll. Vielleicht geht das aber auch alles nicht. Oder kann man mir sagen wie es funktioniert. Unten der Code der Laufschrift. Gruß ph.
          <br> const
          <br> links=20;
          <br> geschw=500;
          <br> warten=10;
          <br> abstand:integer=10;
          <br> farbe:TColor=clblue;
          <br> weg=#32#32#32#32; // bei 'Courier New' reichen zwei Zeichen
          <br> welches:integer=0; // welches Wort
          <br> wieviel:integer=1; // wieviel Buchstaben werden angezeigt
          <br> farbwechsel:boolean=true;
          <br> var
          <br> txt:string;
          <br> hoch,unten,anzahl:integer;
          <br> sl:Tstringlist;
          <br> procedure set_unten;
          <br> begin
          <br> unten:=anzahl*hoch;
          <br> end;
          <br> procedure TForm1.FormCreate(Sender: TObject);
          <br> var x,lg:integer;
          <br> begin
          <br> sl:=Tstringlist.create;
          <br> txt:='Peter Hennek';
          <br> canvas.brush.color:=clnone;//color;
          <br> canvas.brush.style:=bsSolid;
          <br> canvas.font.color:=farbe;
          <br> canvas.font.name:='Courier New'; // feste Breite empfohlen
          <br> canvas.font.style:=[fsbold];
          <br> canvas.font.size:=20;
          <br> hoch:=canvas.textheight(txt);
          <br> sl.commatext:=txt;
          <br> anzahl:=0;
          <br> for x:=0 to sl.count-1 do begin
          <br> lg:=length(sl[x]);
          <br> if anzahl < lg then anzahl:=lg;
          <br> end;
          <br> set_unten;
          <br> height:=unten + hoch; // nicht unbedingt nötig, aber besser
          <br> Timer1.interval:=geschw;
          <br> end;
          <br>
          <br> procedure TForm1.Timer1Timer(Sender: TObject);
          <br> var x:integer;
          <br> zeit:longword;
          <br> begin
          <br> for x:=0 to wieviel-1 do begin
          <br> canvas.textout(links,unten+x*hoch,sl[welches][x+1]);
          <br> canvas.textout(links-5,unten+x*hoch+hoch,weg);
          <br> end;
          <br> dec(unten,hoch);
          <br> if wieviel = length(sl[welches]) then begin
          <br> if unten >= 0 then exit;
          <br> timer1.interval:=0;
          <br> zeit:=gettickcount+warten;
          <br> repeat
          <br> application.processmessages;
          <br> until gettickcount>=zeit;
          <br> for x:=1 to length(sl[welches])do
          <br> canvas.textout(links-5,unten+x*hoch,weg);
          <br> wieviel:=1;
          <br> set_unten;
          <br> inc(welches);
          <br> if welches = sl.count then begin
          <br> welches:=0;
          <br> zeit:=gettickcount+warten;
          <br> refresh;
          <br> repeat
          <br> application.processmessages;
          <br> until gettickcount>=zeit;
          <br> if farbwechsel then begin
          <br> repeat
          <br> canvas.font.color:=rgb(random(2)*$ff,random(2)*$ff ,random(2)*$ff);
          <br> until canvas.font.color<>farbe;
          <br> farbe:=canvas.font.color;
          <br> end;
          <br> end;
          <br> Timer1.interval:=geschw;
          <br> end else inc(wieviel);
          <br> end;
          <br>end

          Comment


          • #6
            Hi Peter,
            was mir auf die Schnelle so auf- und eingefallen ist:<br><ul>
            <li>Verwende &lt;pre&gt; beim Zitieren von Quelltext (siehe Kommentar neben dem Eingabefeld)!!!
            <li>Zeichne nicht im OnTimer-Ereignis, sondern im OnPaint der Form oder einer PaintBox.
            Merke dir im OnTimer nur die im OnPaint benötigten Infos und löse ein Form1.Invalidate aus.
            (Das gilt ganz unabhängig vom konkreten Problem für (fast?) jedes Zeichnen auf Forms.)
            <li>Sobald du die Laufschrift auf die Form gepinselt hat, ist zumindest der von den Buchstaben
            verdeckte Teil des Hintergrunds weg. Das gilt ganz unabhängig von der Brush, die schlimmstenfalls
            zusätzlich noch den Bereich um die Buchstaben herum "zerstört". Du wirst also nicht drum herumkommen,
            im OnPaint den von der Laufschrift übermalten Teil des Hintergrunds zu zeichnen.
            <li>Alternativ zum letzten Punkt kannst du mal schauen, ob du den Text irgendwie
            in einer Art xor-Modus zeichnen kannst. Da kenne ich mich aber auch nicht weiter aus.
            </li>
            Uli

            Comment


            • #7
              hi Peter

              leg doch zwei Bitmaps an. In die erste speicherst Du den Bereich deines Hintergrundes, der später ständig überschrieben wird.

              Aus dieser BMP kopierst Du ständig den Inhalt in die Zweite BMP und schreibst dann deinen Text, nur eben an die angepaßten Koordinaten. Danach kopierst Du diese "Arbeits"-BMP in Dein Orginal. Dazu benutzt Du BitBlt;

              Gruß,Bernhar

              Comment

              Working...
              X