Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.09;
Скачать: CL | DM;

Вниз

Можно ли вообще избежать в 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
3-25224
akim2
2003-12-11 13:44
2004.01.09
FB1 & FB 1.5


14-25508
Йорген фон Швах
2003-12-16 09:01
2004.01.09
Скоро скоро Новый год!


1-25403
Sirakuz
2003-12-24 18:13
2004.01.09
Поведение OwnerDrawVariable ListBox при докировании


14-25605
NeyroSpace
2003-12-17 13:27
2004.01.09
Можно ли с загрузочного диска сделать образ только


6-25465
Kinder
2003-11-09 00:38
2004.01.09
Как с помощью TIdTime и TIdSNTP синхронизировать время?