![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Делаю компонент-кнопку от TCustomControl.
Её канвас создаю так в Create компонента: Код:
FCanvas: TCanvas; ... FCanvas := TControlCanvas.Create; TControlCanvas( FCanvas ).Control := Self; Код:
FCanvas.Draw( 0, 0, _BitMap ); Код:
Parent := nil; |
|
#2
|
||||
|
||||
|
У TCustomControl уже есть работающий Canvas.
|
|
#3
|
|||
|
|||
|
Во-первых у него механизм создания канваса точно такой же. Собственно я оттуда и скопировал. Так вести себя должно абсолютно так же. Во-вторых мне нужен именно свой канвас, так как я в read методе свойства Canvas не всегда его отдаю.
|
|
#4
|
||||
|
||||
|
1. Обычный велосипед - лишнее.
2. Canvas у TCustomControl находится в protected. Изменить его у наследника проблем нет. |
|
#5
|
|||
|
|||
|
Чтобы не было мерцаний при внешней рисовке на компоненте, я придумал такой механизм:
Код:
property Canvas: TCanvas read GetCanvas;
...
function GetCanvas: TCanvas;
begin
Result := FCanvasLink;
end;
procedure DoPaintEvent( _BitMap: TBitmap );
begin
if Assigned( FOnPaint ) then
begin
FCanvasLink := _BitMap.Canvas;
FOnPaint( Self );
FCanvasLink := FCanvas;
end;
FCanvas.Draw( 0, 0, _BitMap );
end; |
|
#6
|
|||
|
|||
|
Всё проблему решил. Рисую на отдельном BitMap и вызываю Invalidate. А в WMPaint уже рисую его на канвасе компонента. В таком случае винда уже сама заботиться о резоне посыла сообщения о перерисовке.
|