Einzelnen Beitrag anzeigen

I.A

Registriert seit: 14. Jan 2007
83 Beiträge
 
#13

Re: Selektionsrahmen um Komponente zeichnen?

  Alt 8. Mär 2009, 13:26
Hallo,

Den Quelltext der Unit SizeControl muss ich zunächst in Ruhe studieren. Bei dem Testprojekt zur Unit funktioniert das Vergrößern, Verkleinern und Verschieben einwandfrei. Bisher sehe ich, das erstens die Marker als Klasse mit eigenen Ereignissen realisiert sind (TSizeBtn), während meine DrawMarkers-Routine einfach einen Rahmen mit diesen Markern zeichnet.

Weiterhin dürfte die Mehode RegisterControl die Methode sein, welche die Komponente in den Designer einfügt.
Targets sind wahrscheinlich die im Designer befindlichen, also bereits eingefügten Controls. Jetzt brauch ich Zugriff auf das aktuell sekektierte, um dessen Eigenschaften beeinflussen zu können. Ich schätze, Targets[Index] ist mein Freund.

Mich hat dennoch der Ehrgeiz gepackt und daher gibt es erst mal ne kleine Revanche für Routine von Michael Linden. Ich habe die Routine DrawMarkers genannt. Michael Lindens Routine zeichnet einfach einen Rahmen. DrawMarkers zeichnet auch die Handles, die auch im Formdesigner von Delphi bei der selektierten Komponente zu sehen sind. Ich habe dazu Michael Lindens Routine einach erweitert.

Delphi-Quellcode:
procedure DrawMarkers(hdc: HDC; r: TRect; penColor: TColor);
const
  PENWIDTH = 2;

var
  Anchors: TRect;
  VertMid: Integer;
  HorzMid: Integer;
  index: Integer;
begin
  with TCanvas.Create do
  try
    Handle := hdc;
    Pen.Width := PENWIDTH;
    Pen.Color := penColor;
    InflateRect(r, PENWIDTH, PENWIDTH);
    Brush.Style := bsClear;
    //Das Rechteck als Rahmen
    Rectangle(r);
    HorzMid := (r.Right - r.Left) div 2;
    VertMid := (r.Bottom - r.Top) div 2;
    //---------- Hier werden die Marker gezeichnet -------------
    for index:=7 downto 0 do
    case index of
      7: begin
           //Links oben
           Anchors.Left := r.Left - 2;
           Anchors.Right := r.Left + 3;
           Anchors.Top := r.Top - 2;
           Anchors.Bottom := r.Top + 3;
           Rectangle(Anchors);
         end;
      6: begin
           //Mitte oben
           Anchors.Left := Anchors.Left + HorzMid;
           Anchors.Right := Anchors.Left + 4;
           Rectangle(Anchors);
         end;
      5: begin
           //Rechts oben
           Anchors.Left := r.Right - 2;
           Anchors.Right := Anchors.Left + 4;
           Rectangle(Anchors);
         end;
      4: begin
           //Rechts Mitte
           Anchors.Top := Anchors.Top + VertMid;
           Anchors.Bottom := Anchors.Top + 4;
           Rectangle(Anchors);
         end;
      3: begin
           //Links Mitte
           Anchors.Left := r.Left - 2;
           Anchors.Right := Anchors.Left + 4;
           Rectangle(Anchors);
         end;
      2: begin
           //Links unten
           Anchors.Top := r.Bottom - 2;
           Anchors.Bottom := Anchors.Top + 4;
           Rectangle(Anchors);
         end;
      1: begin
           //Unten Mitte
           Anchors.Left := Anchors.Left + HorzMid;
           Anchors.Right := Anchors.Left + 4;
           Rectangle(Anchors);
         end;
      0: begin
           //Unten rechts
           Anchors.Left := r.Right - 2;
           Anchors.Right := Anchors.Left + 4;
           Rectangle(Anchors);
         end;
    end;
    //---------- Hier wurden die Marker gezeichnet -------------
  finally
    Free;
  end;
end;
  Mit Zitat antworten Zitat