AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Paint-Probleme mit abgeleitetem Panel

Ein Thema von G-Baumstamm · begonnen am 20. Mär 2011 · letzter Beitrag vom 21. Mär 2011
Antwort Antwort
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
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Paint-Probleme mit abgeleitetem Panel

  Alt 20. Mär 2011, 22:18
Ohne genau analysiert zu haben...

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

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

Geändert von Satty67 (20. Mär 2011 um 23:32 Uhr)
  Mit Zitat antworten Zitat
G-Baumstamm

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

AW: Paint-Probleme mit abgeleitetem Panel

  Alt 21. Mär 2011, 10:44
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
Daniel NR
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:06 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