![]() |
|
#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), и тогда описанный выше способ будет очень кстати. Зачем кнопке канва, это уже другой вопрос (просто поверьте, бывают случаи когда она необходима). |