![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Я имею достаточно простой пример по использованию сообщений Windows:
Код:
unit unGMMain1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
private
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
procedure WMRButtonUp(var Msg: TWMRButtonUp); message WM_RButtonUp;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Procedure TForm1.WMPaint(var Msg: TWMPaint);
var
// R1: TRect;
begin
Panel1.Color := clRed;
Beep;
{R1 := Rect(0,0,200,200);
Brush.Color := clYellow;
Canvas.FrameRect(R1);}
inherited;
end;
Procedure TForm1.WMRButtonUp(var Msg: TWMRButtonUp);
Var
pos: TPoint;
begin
GetCursorPos(pos);
if (pos.X < Left+200) and (pos.Y < Top+200) then
Close else
begin
Panel1.Color := clGreen;
Panel1.Caption := 'X = '+ inttostr(Left)+' Y = '+inttostr(Top);
end;
inherited;
end;При запуске приложения Panel1 закрашивается цветом из Инспектора объектов, а затем при нажатии и отпускании правой кнопки мыши на форме либо панель перекрашивается в зеленый цвет и на ней выводятся координаты нажатия, либо (при попадании в левый верхний квадрат размером 200) форма, а потому и все приложение закрывается. Я хочу начертить этот квадрат (в процедуре WMPaint каким-то цветом - сейчас закомментировано), но не получается. Если заменить Canvas.FrameRect(R1) на Canvas.Rectangle(R1), бесцветный прямоугольник рисуется без проблем. Объясните кто-нибудь, почему не работают методы FrameRect или FillRect экземпляра класса TCanvas? ![]() |
|
#2
|
||||
|
||||
|
Если рисуешь на канве, то свойство Brush.Color применяй для него:
Код:
Canvas.Brush.Color := clYellow; |
|
#3
|
||||
|
||||
|
Благодарю Вас. Еще один маленький вопрос по данному примеру: если канва пересекается с компонентом Panel1, можно ли вывести ее на передний план? Чтобы нарисованный квадрат был виден полностью?
![]() |
|
#4
|
|||
|
|||
|
можно если это Panel2.Canvas
|
|
#5
|
||||
|
||||
|
Я не совсем понял. Ведь компонент TPanel не имеет свойства Canvas. Как же это можно организовать?
|
|
#6
|
|||
|
|||
|
тогда на него можно paintbox положить – у него есть
|
|
#7
|
||||
|
||||
|
Устанавливаем канву для панели
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
CC: TControlCanvas;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
CC := TControlCanvas.Create;
CC.Control := Panel1;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CC.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
CC.Rectangle(10, 10, 50, 50);
end;
end. |
|
#8
|
||||
|
||||
|
А можно еще интереснее - добавить свойство Canvas классу TPanel
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TPanel = class(ExtCtrls.TPanel)
private
FCanvas: TControlCanvas;
function GetCanvas: TCanvas;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property Canvas: TCanvas read GetCanvas;
end;
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{ TPanel }
constructor TPanel.Create(AOwner: TComponent);
begin
inherited;
FCanvas := TControlCanvas.Create;
FCanvas.Control := Self;
end;
destructor TPanel.Destroy;
begin
FCanvas.Free;
inherited;
end;
function TPanel.GetCanvas: TCanvas;
begin
Result := FCanvas;
end;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Panel1.Canvas.Rectangle(10, 10, 50, 50);
end;
end. |
|
#9
|
||||
|
||||
|
тогда уж так:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TPanel = class(ExtCtrls.TPanel)
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}
procedure TForm1.Button1Click(Sender: TObject);
begin
Panel1.Canvas.Brush.Color:=clYellow;
Panel1.Canvas.FillRect(Rect(10, 10, 100, 100));
end;
end.TPanel - TCustomPanel - TCustomControl Код:
TCustomControl = class(TWinControl)
private
FCanvas: TCanvas;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
protected
procedure Paint; virtual;
procedure PaintWindow(DC: HDC); override;
property Canvas: TCanvas read FCanvas;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;Последний раз редактировалось NumLock, 02.03.2012 в 09:13. |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
dr. F.I.N. (02.03.2012)
| ||
|
#10
|
||||
|
||||
|
Цитата:
|
|
#11
|
||||
|
||||
|
А вы когда Canvas ищете? В дизайн-моде? Так там ее и не будет. Тут рассматривается вариант добавления нового свойства в рантайм-моде. Можно конечно сделать, что-бы и в дизайн-моде появилось такое свойство, но это уже делается несколько иначе.
|
|
#12
|
||||
|
||||
|
Цитата:
|