Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прорисовка компонента, не помню 
V
    Опции темы
NewDima
Дата 12.5.2009, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Давнехонько не писал графические компоненты, да и вообще на дельфях редко очень.
В общем прорисовка компонента иде по сообщению WM_PAINT, есстественно. Сначала вызываю родительскую функцию (inherited), дальше рисую на битмапе (TBitmap) который создал в конструкторе объекта. А потом просто копирую область функцией BitBlt на канву своего компонента. Но вот незадача, вроде все сделано для того, чтобы компонент не мигал при частой перерисовке, а что-то видимо упустил, все-равно мигает (он у меня интерактивный, управляется мышью). Вот скелет компонента, что касается графики:
Код

TMapViewer = class(TWinControl)
  private
    FBitmap: Graphics.TBitmap;
...
    procedure WMPaint(var msg: TWMPaint); message WM_PAINT;
    procedure WMSize(var msg:  TWMSize); message WM_SIZE;
  public
   ...
    constructor Create(Owner: TComponent);
  published
...
  end;

implementation
...
constructor TMapViewer.Create(Owner: TComponent);
begin
inherited;
FBitmap := TBitmap.Create;
...
end;

procedure TMapViewer.WMPaint(var msg: TWMPaint);
begin
inherited;
With FBitmap.Canvas do
  begin
//рисую на канве битмапа
  end;
BitBlt(GetDC(Handle), 0, 0, Width, Height, FBitmap.Canvas.Handle, 0, 0, SRCCOPY); // копирую участок
end;

procedure TMapViewer.WMSize(var msg: TWMSize);
begin
FBitmap.Width := msg.Width;
FBitmap.Height := msg.Height;
end;

PM ICQ   Вверх
NewDima
Дата 12.5.2009, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Неужели никто не пишет графические компоненты?! Ну не правда...
PM ICQ   Вверх
Frees
Дата 12.5.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



Цитата(NewDima @  12.5.2009,  08:54 Найти цитируемый пост)
Сначала вызываю родительскую функцию (inherited)

может inherited тебе и рисует что ты потом закрашиваеш поверх, может без него попробывать

хотя не уверен smile


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
NewDima
Дата 12.5.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



без него вообще к сожалению крышу срывает =(, уже пробовал
PM ICQ   Вверх
NewDima
Дата 12.5.2009, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Да как так, неужели никто не знает?  smile 
PM ICQ   Вверх
Frees
Дата 13.5.2009, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 16
Всего: 54



попробуй у VCL списать
например TCustomControl вот так рисуется
Код

procedure TCustomControl.WMPaint(var Message: TWMPaint);
begin
  Include(FControlState, csCustomPaint);
  inherited;
  Exclude(FControlState, csCustomPaint);
end;

можно еще наверно с DoubleBuffer поиграть

в ДРКБ по твоему вопросу вот такой совет есть

Цитата
Если добавить флаг csOpaque (непрозрачный) к свойству ControlStyle компонента
- то фон компонента перерисовываться не будет.
Код

constructor TMyControl.Create;
begin
inherited
ControlStyle := ControlStyle + [csOpaque];
end;






--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
NewDima
Дата 13.5.2009, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Цитата(Frees @ 13.5.2009,  13:42)
в ДРКБ по твоему вопросу вот такой совет есть

Вот за это огромное спасибо, то, что нужно )
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.