Форум: "Основная";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
ВнизМожно ли вообще избежать в TCustomControl отрисовки? Найти похожие ветки
← →
vasyaVN (2003-12-23 14:33) [0]Всем привет! Я опять со своим несчастным TCustomControl. Никак не получается избежать мерцания. Я изменяю размеры его только даже на нем ничего не рисую. WM_SIZING не ловит, что бы переделать WMPaint. Как бы избавиться от этих злощастных квадратов при изменении размеров и координат?
← →
TUser (2003-12-23 14:44) [1]
> Можно ли вообще избежать в TCustomControl отрисовки
Перехватить WMPaint и ничего не делать.
← →
vasyaVN (2003-12-23 14:50) [2]Перехватил, все так как мне нужно, но другие контролы теперь тоже не рисуются...
← →
TUser (2003-12-23 15:23) [3]Ничего не делать, только если WMPaint посылается твоему контролу. Мне кажется, что лучше сдулать ему потомка с переопределенным обработчиком.
← →
vasyaVN (2003-12-23 16:44) [4]Сделано вот так, при чем другие контролы, которые не рисуются никакого отношения не имеют к нему. Может я что не так сделал...?
Я уже куда только не помещал эту строчку
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
и в приват и в протектед...
type
TMyControl= class(TCustomControl)
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
...
procedure TMyControl.WMPaint(var Message: TWMPaint);
begin
end;
← →
TUser (2003-12-23 17:30) [5]Ну вот
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMyControl= class(TCustomControl)
private
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
public
Flag:boolean;
constructor Create(AOwner: TComponent); override;
end;
var
Form1: TForm1;
MyControl1:TMyControl;
implementation
{$R *.dfm}
procedure TMyControl.WMPaint(var Msg:TWMPaint);
begin
if Flag then
MyControl1.Canvas.FillRect(MyControl1.Canvas.ClipRect);
form1.Repaint;
end;
constructor TMyControl.Create(AOwner: TComponent);
begin
Flag:=true;
inherited Create(AOwner);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
MyControl1:=TMyControl.Create(Application);
MyControl1.Parent:=form1;
MyControl1.Left:=120;
MyControl1.Top:=120;
MyControl1.Width:=100;
MyControl1.Height:=100;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MyControl1.Flag:=false;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
MyControl1.Canvas.Pen.Color:=clBlack;
MyControl1.Canvas.Ellipse(20,20,50,50);
end;
end.
Ясно - до нажатия Button1 WMPaint все время зарисовывает контрол. А если его нажать, то такой зарисовки не будет, и при нажатии на Button2 увидишь круг. Совершенно аналогично запрещается перерисока нафиг.
← →
MV (2003-12-23 17:53) [6]Это здорово!
А можно ли, отловив в обработчике формы сообщение, скажем WM_PAINT или WM_INVALIDATE, определить, кто его послал?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c