![]() |
|
|
#1
|
|||
|
|||
|
Здравствуйте! Когда Image или PaintBox кладется на форму, то вокруг их чертится пунктирная рамка, соединяющая голубые кружочки (в режиме проектирования). Я сделал компонент типа PaintBox и хочу, чтобы вокруг него появлялась такая пунктирная рамка. Кто подскажет, как получить такую рамку?
|
|
#2
|
||||
|
||||
|
Стиль у Pen := psDash;
Далее Rectangle() |
|
#3
|
|||
|
|||
|
Здравствуйте! Во-первых, спасибо за ответ. А во-вторых, может знаете, как рисовать на TPanel? Дело в том, что я работаю на Дельфи 2009, и на нем ни один пример не работает. Я пробовал создать дочерний класс и поместить property Canvas в раздел public - не вышло. Canvas виден среди свойств новой панели, но не работает, как будто для красоты там находится. Пробовал TControlCanvas, так его даже в Хелпе нет. Не исключено, что я что-то не так делаю; может, более опытные товарищи подскажут?
|
|
#4
|
||||
|
||||
|
Так надо процедуру отрисовки переопределить.
|
|
#5
|
||||
|
||||
|
если еще актуально (да и, мало ли, может кому пригодится)...
Как рисовать на компоненте, не имеющем свойства Canvas Код:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TPanel = class({Vcl.}ExtCtrls.TPanel)
public
Canvas: TCanvas;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Panel1.Canvas.MoveTo(10, 10);
Panel1.Canvas.LineTo(50, 50);
end;
{ TPanel }
constructor TPanel.Create(AOwner: TComponent);
begin
inherited;
Canvas := TCanvas.Create;
Canvas.Handle := GetDC(Self.Handle);
end;
destructor TPanel.Destroy;
begin
Canvas.Free;
inherited;
end;
end.Последний раз редактировалось Decoding, 11.05.2017 в 17:25. |
|
#6
|
||||
|
||||
|
Цитата:
Ой как неправильно. Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TPanel = class(ExtCtrls.TPanel)
protected
procedure Paint; override;
public
property Canvas;
end;
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TPanel }
procedure TPanel.Paint;
begin
inherited Paint;
Canvas.Pen.Style:=psDash;
Canvas.Rectangle(10, 10, ClientWidth-10, ClientHeight-10);
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
Panel1.Canvas.MoveTo(10, 10);
Panel1.Canvas.LineTo(ClientWidth-10, ClientHeight-10);
end;
end. |
|
#7
|
||||
|
||||
|
Возможно с TPanel пример не совсем корректный, но в общем случае он правильный, например для TButton.
Канвой обладают все графические компоненты (наследники от TGraphicControl), но не все оконные компоненты. Те компоненты, которые наследуются от TCustomControl, имеют канву, к таким компонентам относится и панель. Код:
TCustomControl = class(TWinControl)
private
FCanvas: TCanvas;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
{ TCustomControl }
constructor TCustomControl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCanvas := TControlCanvas.Create;
TControlCanvas(FCanvas).Control := Self;
end;
destructor TCustomControl.Destroy;
begin
FCanvas.Free;
inherited Destroy;
end;А вот к примеру кнопки (TButton) канвы не имеют (они наследуются от TButtonControl), и тогда описанный выше способ будет очень кстати. Зачем кнопке канва, это уже другой вопрос (просто поверьте, бывают случаи когда она необходима). |