Einzelnen Beitrag anzeigen

G-Baumstamm

Registriert seit: 9. Jan 2010
63 Beiträge
 
Delphi 7 Enterprise
 
#1

Paint-Probleme mit abgeleitetem Panel

  Alt 20. Mär 2011, 22:00
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
Angehängte Dateien
Dateityp: zip Project1.zip (206,7 KB, 6x aufgerufen)
Daniel NR
  Mit Zitat antworten Zitat