Thema: Delphi Panel.Left > 32,767 ?

Einzelnen Beitrag anzeigen

Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#8

AW: Panel.Left > 32,767 ?

  Alt 10. Mai 2015, 00:24
Hallo Popov, tolles Beispiel! Vielen Dank für die Mühe!
Ein bisschen stört mich was dran, leider, nämlich, dass die Bilder auf der Stelle verharren und jeweils mit neuem Inhalt gefüllt werden.
Wenn sie richtig durch die Leiste wandern, gefällt mir das besser...

Ich habe mich mal daran versucht, ein Panel von TControl abzuleiten. Ich habe dazu eine Vorlage genommen, die auf TCustomPanel beruht und habe schlicht alles rausgenommen, was an Möglichkeiten nicht nötig ist. Die Kenntnisse der genauen Zusammenhänge fehlen mir leider. Natürlich funktioniert es deswegen auch nicht.
Aber vielleicht kann mir jemand sagen, ob es mit ein paar Verbesserungen funktioniert, oder ob das schlicht Blödsinn ist?

Delphi-Quellcode:
unit CtrlPanel;

interface

uses
  Windows, Classes, Controls, Graphics, Messages, Forms;

  type

  TControlPanel = class(TControl)
  private
    FColorFace: TColor;
    FColorLight: TColor;
    FColorDark: TColor;
    FCanvas: TCanvas;
    procedure DrawBevel(Canvas: TCanvas; Rect: TRect; LightColor, DarkColor: TColor);
    procedure DrawFrame(Canvas: TCanvas; Offset, FrameWidth: Integer; LightColor, DarkColor: TColor);
  protected

  public
    constructor Create(AOwner: TComponent); override;
    property Canvas: TCanvas read FCanvas;
    procedure Paint;
  published
    property Visible;
  end;

implementation

constructor TControlPanel.Create(AOwner: TComponent);
begin
  inherited;
  FColorDark:= clBlack;
  FColorLight:= clSilver;
  FColorFace:= clBtnFace;
  FCanvas := TControlCanvas.Create;
  TControlCanvas(FCanvas).Control := Self;
end;


procedure TControlPanel.Paint;
var
  ScrBmp: TBitmap;
begin
  ScrBmp:= TBitmap.Create;
  ScrBmp.Width:= ClientWidth;
  ScrBmp.Height:= ClientHeight;
  ScrBmp.Canvas.Brush.Color := clBtnFace;
  ScrBmp.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));
  ScrBmp.Canvas.Font:= Font;
  ScrBmp.Canvas.Brush.Style:= bsClear;
  DrawFrame(ScrBmp.Canvas, 0, 1, FColorLight, FColorDark);
  Self.Canvas.Draw(0, 0, ScrBmp);
  ScrBmp.Free;
end;

procedure TControlPanel.DrawBevel(Canvas: TCanvas; Rect: TRect; LightColor, DarkColor: TColor);
begin
  Canvas.Pen.Width:= 1;
  Canvas.Pen.Color:= LightColor;
  Canvas.MoveTo(Rect.Left, Rect.Top + Rect.Bottom);
  Canvas.LineTo(Rect.Left, Rect.Top);
  Canvas.LineTo(Rect.Left + Rect.Right, Rect.Top);
  Canvas.Pen.Color:= DarkColor;
  Canvas.LineTo(Rect.Left + Rect.Right, Rect.Top + Rect.Bottom);
  Canvas.LineTo(Rect.Left, Rect.Top + Rect.Bottom);
end;

procedure TControlPanel.DrawFrame(Canvas: TCanvas; Offset, FrameWidth: Integer; LightColor, DarkColor: TColor);
var
  i: integer;
begin
  for i := Offset to Offset + FrameWidth - 1 do
    DrawBevel(Canvas, Rect(i, i, ClientWidth - 2 * i - 1, ClientHeight - 2 * i - 1), LightColor, DarkColor);
end;

end.
  Mit Zitat antworten Zitat