![]() |
|
|
Регистрация | << Правила форума >> | 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 уже рисую его на канвасе компонента. В таком случае винда уже сама заботиться о резоне посыла сообщения о перерисовке.
|