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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DoubleBuffer и Refresh, не могу разобраться поясните 
V
    Опции темы
namervasek
Дата 28.12.2009, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 3.12.2007

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



Всем привет!
Вообшем мне нужно реализовать класс который рисовался бы на любом контроле. А имено это "лист бумаги".
Рисую я с помощью GDI вот так(парент передается через конструктор). 

Код


TSheet = class
private  
  ... 
  FParent: TWinControl;
  DoDrawGrid(ADC: HDC; AColWidth, ARowHeight: Integer);
public 
 ...
  procedure Paint;
  ...
end;


procedure TSheet.Paint;
var
  Brush: HBRUSH;
  ADC: HDC; 
begin
  ADC:=GetDc(FParent.Handle);

  Brush:=CreateSolidBrush(clWhite);
  SelectObject(ADC, Brush);

  Rectangle(ADC, FLeft, FTop, FLeft+FWidth, FTop+FHeight);

  if FDrawGrid then
    if FDefFieldSize
    then DoDrawGrid(ADC, BaseColWidth, BaseRowHeight)
    else DoDrawGrid(ADC, FColWidth, FRowHeight);

  DeleteObject(Brush);

  ReleaseDC(FParent.Handle,ADC);

end;

procedure TSheet.DoDrawGrid(ADC: HDC; AColWidth, ARowHeight: Integer);
var
  I: Integer;
  Right, Bottom: Integer;
begin
  SelectObject(ADC,FGridStyle.Handle);

  Right:= FWidth+FLeft;
  Bottom:= FHeight+FTop;

  I:= FLeft+AColWidth;
  while I < Right do
  begin
    Line(ADC, I, FTop, I, Bottom);
    I:= I + AColWidth;
  end;

  I:= FTop+ARowHeight;
  While I < Bottom do
  begin
    Line(ADC, FLeft, I, Right, I);
    I:= I + ARowHeight;
  end;
end;    


Но проблема заключается в том что если TSHeet.Paint вызываь в OnPaint формы, и у формы свойство doublebuffer= true, и перисовку форму делать методами Refresh или RePaint(перерисовка скажем происходит при нажатии клавиши) то изображение не рисуется... Точнеее оно рисуется но сразу затирается фоном формы. Как я понял проблема заключается в refresh так он заливате всю область окна вызовом Invalidate перед рисованием. Поясните как тут быть... 

PS: при таком рисовании естесвено возникает мерцание. я собираюсь избавитсмя от него с помощью  bitblt и других сопуствующих winapi
и вот что хотелось бы спросить а можно ли с помошью свойства парента  doublebuffer избавтсяя от него и как это реализовать?




PM MAIL   Вверх
Alexeis
Дата 28.12.2009, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Код

procedure TSheet.Paint;
var
  Brush: HBRUSH;
  ADC: HDC; 
begin
  ADC:=GetDc(FParent.Handle);


В режиме DoubleBuffer форма рисует не на DC, а на битмапе, который потом рисуется поверх всего и затирает картинку. Отсюда вывод, либо рисовать на том кто не DoubleBuffer, либо включиться в общую схему и пронаследоваться от TGraphicControl, так чтобы родитель сам вызывал твой WMPaint и передавал тебе DC битмапа бэкбуфера. Этот буфер впоследствии будет отрисован  


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
namervasek
Дата 29.12.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 3.12.2007

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



Коротко и ясно smile  спс
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

FAQ раздела лежит здесь!


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

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


 




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


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

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