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