![]() |
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:
Habe einiges rausgekürzt damit es nicht sooo lange ist, hoffe das wichtige steht da. DrawPanelFace wird im Paint des Panels aufgerufen.
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; 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:
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),
procedure TForm1.Button1Click(Sender: TObject);
begin ScrollBox1.PaintTo(Image1.Canvas,0,0); end; 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 :) |
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:
(Immer das WinControl.Canvas)
DC := GetWindowDC(Handle);
|
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:
So funktionierts prima. Danke ;)
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; Liebe Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz