Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Paint-Probleme mit abgeleitetem Panel (https://www.delphipraxis.net/159263-paint-probleme-mit-abgeleitetem-panel.html)

G-Baumstamm 20. Mär 2011 21:00

Paint-Probleme mit abgeleitetem Panel
 
Liste der Anhänge anzeigen (Anzahl: 1)
Heyho,

ich fürchte ich muss etwas weiter ausholen um mein Problem zu beschreiben ... Also: ich benutze das ALPanel aus dem "Alcinoe"-Komponenten-Set, welches ich zusätzlich erweitert habe, sodass ich die Farbe jeder Kante einzeln bestimmen kann, sowie eine Farbe die bei Überlagerung zweier Farben in der Ecke Priorität hat.

Hier der entsprechende Code:
Delphi-Quellcode:
property BorderColorTop: Tcolor read FBorderColor[1] Write SetBorderColorTop default clNone;
property BorderColorLeft: Tcolor read FBorderColor[2] Write SetBorderColorLeft default clNone;
property BorderColorRight: Tcolor read FBorderColor[3] Write SetBorderColorRight default clNone;
property BorderColorBottom: Tcolor read FBorderColor[4] Write SetBorderColorBot default clNone;
property BorderColorPriority: TColor read PriorityColor write SetPriorityBorderColor default clRed;
property BorderWidth: integer read FBorderWidth write SetBorderWidth default 1;

{...}

procedure DrawPanelFace(APanel: TALCustomPanel);

   procedure paintborder;
   var
     DC: HDC;
     OldBrush: HBRUSH;
     OldPen: HPEN;
     i, Pos: integer;
     PaintOrder: array[1..4] of integer;

   begin
     With aPanel do begin
       Pos := 1;
       for i := 1 to 4 do
       begin
         if FBorderColor[i] <> PriorityColor then PaintOrder[Pos] := i;
         if FBorderColor[i] <> PriorityColor then inc(Pos);
       end;
       for i := 1 to 4 do
       begin
         if FBorderColor[i] = PriorityColor then PaintOrder[Pos] := i;
         if FBorderColor[i] = PriorityColor then inc(Pos);
       end;
       for i := 1 to 4 do
       begin
         DC := 0;
         OldBrush := 0;
         OldPen := 0;
         try
           DC := GetWindowDC(Handle);
           Canvas.Brush.Color := FBorderColor[PaintOrder[i]];
           OldBrush := SelectObject(DC, Canvas.Brush.Handle);
           Canvas.Pen.Color := FBorderColor[PaintOrder[i]];
           Canvas.Pen.Width := 1;
           OldPen := SelectObject(DC, Canvas.Pen.Handle);
           if FBorderColor[PaintOrder[i]] <> clNone then
           case PaintOrder[i] of
             1: Rectangle(DC, 0, 0, Width, FBorderWidth);
             2: Rectangle(DC, 0, 0, FBorderWidth, Height);
             3: Rectangle(DC, Width-FBorderWidth, 0, Width, Height);
             4: Rectangle(DC, 0, Height-FBorderWidth, Width, Height);
           end;
         finally
           {freigeben}
         end;
       end;
     end;
   end;

begin
  with aPanel do
  begin
    R := ClientRect;
    Canvas.Brush.Style := BsSolid;
    Canvas.Brush.Color := Color;
    Canvas.FillRect(R);
    with Canvas do begin
      {[...] draw Caption}
    end;
    PaintBorder;
  end;
end;
Habe einiges rausgekürzt damit es nicht sooo lange ist, hoffe das wichtige steht da. DrawPanelFace wird im Paint des Panels aufgerufen.

Nun zum Problem: Das Zeug funktioniert so wie es ist genau so wie es soll. Nun habe ich aber ne ganze Reihe dieser Panels auf einer ScrollBox, welche ich drucken möchte. Um das alles drucken zu können, erstelle ich erst auf einem Image ein "Abbild" der ScrollBox in ihrer kompletten Größe, welches ich dann drucke. Dazu benutze ich mehrere Aufrufe von ScrollBox.PaintTo. Habe diesen Teil mal ausgelagert um es zu verdeutlichen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ScrollBox1.PaintTo(Image1.Canvas,0,0);
end;
Das Problem: Das Abbild des Panels wird auf dem Image richtig gemalt, allerdings ohne Rahmen. Farbe und Caption werden gezeichnet, der Rahmen ist immer ein Ein-Pixle-breiter, schwarzer Rahmen. Normalerweise wird das Panel aber immer mit korrektem Rahmen gemalt (also sowohl Designtime als auch Runtime auf der Form),

Hat jemand ne Ahnung warum? Habe ein kleines Demo-Programm für das Problem angehängt.

Hoffe jmd kann mir helfen, auch wenn das Problem recht speziell ist. Wenn ihr noch weitere Teile des Codes braucht gerne ;)

Liebe Grüße :)

Satty67 20. Mär 2011 21:18

AW: Paint-Probleme mit abgeleitetem Panel
 
Ohne genau analysiert zu haben...

Kann es sein, dass alles nicht aufs Image gezeichnet wird, was Du auf dem selbst geholten DeviceContext ausgibst?

Delphi-Quellcode:
DC := GetWindowDC(Handle);
(Immer das WinControl.Canvas)

G-Baumstamm 21. Mär 2011 09:44

AW: Paint-Probleme mit abgeleitetem Panel
 
Besten Dank! :)

Habe das mit dem Handle einfach ganz rausgeschmissen (wusste sowieso nie was der da soll, das war der Teil des Codes den ich von der Ursprungskomponente übernommen hab ... ^^) und hab das ganze jetzt direkt auf den Canvas gemalt. Allerdings immernoch auf den Canvas des Panels, da soll's ja schließlich auch hin.

Delphi-Quellcode:
Canvas.Brush.Color := FBorderColor[PaintOrder[i]];
Canvas.Pen.Color := FBorderColor[PaintOrder[i]];
Canvas.Pen.Width := 1;
with Canvas do
begin
  if FBorderColor[PaintOrder[i]] <> clNone then
  case PaintOrder[i] of
    1: Rectangle(0,0,Width,FBorderWidth);
    2: Rectangle(0,0,FBorderWidth,Height);
    3: Rectangle(Width-FBorderWidth,0,Width,Height);
    4: Rectangle(0,Height-FBorderWidth,Width,Height);
  end;
end;
So funktionierts prima. Danke ;)

Liebe Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz