Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отображение графики [D7, XP]


Страницы:   1 2

bestolkov ©   (2011-12-09 12:40:00) 

Всем привет! Делаю следующее:
interface
uses
 Windows,GDIPAPI,GDIPOBJ, SysUtils,jps_msg;
type
 TViewer = class(TObject)
private
//ïåðåìåííûå GDI+
 graphics : TGPGraphics;
 Bitmap : TGpBitmap;
 MplayBack : TGPGraphics;
 cBitmap: TGPCachedBitmap;
 Pen: TGPPen;
 FontFamily: TGPFontFamily;
 Font: TGPFont;
 FontBold: TGPFont;
 SolidBrush:TGPSolidBrush;
 // protected

public
 constructor Create (Playback : HDC);
 destructor  Destroy; override;
 procedure ViewParam ();

end;

implementation

constructor TViewer.Create (Playback : HDC);
begin
  Bitmap:= TGpBitmap.Create(1000 ,1000,2498570);//áèòîâàÿ êàðòà(ïàìÿòü)
  graphics := TGPGraphics.Create(Bitmap);
  graphics.Clear(aclBlack);
  MplayBack :=TGPGraphics.Create(Playback);
  Pen := TGPPen.Create(MakeColor(55, 55, 55));
  Pen.SetDashStyle(DashStyleDot);
  FontFamily := TGPFontFamily.Create('Lucida Console');
  Font       := TGPFont.Create(FontFamily, 14, FontStyleRegular, UnitPixel);
  FontBold   := TGPFont.Create(FontFamily, 16, FontStyleBold, UnitPixel);

  SolidBrush := TGPSolidBrush.Create(MakeColor(0, 255, 0));

  inherited Create;
end;

destructor  TViewer.Destroy;
begin
           Pen.Free;
      Font.Free;
    Bitmap.Free;
  graphics.Free;
 MplayBack.Free;
FontFamily.Free;
SolidBrush.Free;
FontBold.Free;
inherited Destroy;
end;

procedure TViewer.ViewParam ();

begin
 DrawSTR('Hello world');
 cBitmap:= TGPCachedBitmap.Create(bitmap,MplayBack);
 MplayBack.DrawCachedBitmap(cBitmap, 0, 0);
 cBitmap.Free;
end;

end.


Затем в коде отображающей пограммы:

procedure TForm1.Button1Click(Sender: TObject);
var Viewer: TViewer;

begin
Viewer:=TViewer.Create(PaintBox1.Canvas.Handle);
Viewer.ViewParam()

GyroHorizon.Free;

end;

Все работает. А вот если экзмепляр объекта создавать в OnCreate формы, а отображать в Button1Click, то ничего не видно.. В чем проблема? и как задачи вывода на экран графики и текста правильно решать?


Сергей М.   (2011-12-09 15:11:00) [1]


> хотелось бы один раз создать объект и один раз его освободить


А зачем ему при конструировании передавать именно хендл канвы пейнтвокса ? Создай битмап и передай его хендл - пусть туда рисует, а при OnPaint канву битмапа копируй на канву пейнтбокса.


bestolkov   (2011-12-09 14:53:00) [2]

Я понял Вас. Тем не менее хотелось бы один раз создать объект и один раз его освободить.. Или это совсем не  обязательно?


Сергей М.   (2011-12-09 14:47:00) [3]


> Пробывал, не помогает


Значит что-то еще криво или несуразно делаешь.


> когда же все таки создется paintbox.canvas.handle?


Да не важно когда он создается.
Твое дело - рисовать на его канве не иначе как в его обработчике OnPaint, остальное тебя вообще заботить не должно.


bestolkov   (2011-12-09 14:31:00) [4]

Пробывал, не помогает((( и крайний вопрос: когда же все таки создется paintbox.canvas.handle?


Anatoly Podgoretsky   (2011-12-09 14:31:00) [5]


> Я ошибся, 4 герца, конечно же. Всё страшно мерцает при изменении
> размеров окна, как бороться, если не секрет?

4 гц <> 0,25 'nj d 16! раз выше


Сергей М.   (2011-12-09 14:13:00) [6]

в обработчик OnCreate формы помести
DoubleBuffered = True


bestolkov   (2011-12-09 14:03:00) [7]

Я ошибся, 4 герца, конечно же. Всё страшно мерцает при изменении размеров окна, как бороться, если не секрет?


Сергей М.   (2011-12-09 13:42:00) [8]

> отображаю в таймере 0.25 ГЦ

Стандартный TTimer не поддерживает разрешение в 25 гц.


bestolkov   (2011-12-09 13:23:00) [9]

в том-то и дело, что отображаю в таймере 0.25 ГЦ, а не по факту изменения состояния


Сергей М.   (2011-12-09 13:21:00) [10]


> девайс передает 100 гц


А человеческий глаз способен реагировать на частоту в 4 раза меньшую ...


bestolkov   (2011-12-09 13:21:00) [11]

и как избавиться от мерцания, если не секрет?))


bestolkov   (2011-12-09 13:20:00) [12]

Главное после Вашего ответа забыл спросить)) : когда же создается PaintBox.canvas. handle?


bestolkov   (2011-12-09 13:18:00) [13]

девайс передает 100 гц


Сергей М.   (2011-12-09 13:16:00) [14]


> Опрос ком-порта


и накой шиш нужно его дрючить с такой бешеной скоростью, если он сам может сообщить о поступлении новых данных от подключенного к нему дивайса ?)


bestolkov   (2011-12-09 13:11:00) [15]


> Сергей М. ©   (09.12.11 13:11) [7]

Опрос ком-порта


bestolkov   (2011-12-09 13:11:00) [16]


> Сергей М. ©   (09.12.11 13:09) [6]

Пытаюсь так делать, однако все страшно мигает)))


Сергей М.   (2011-12-09 13:11:00) [17]


> События возникают очень часто (100 гц)


Прелюбопытно)
И что же это за события ?


Сергей М.   (2011-12-09 13:09:00) [18]


> концепция верная?


Неверная.
У пейнтбокса есть событие OnPaint - в нем и следует рисовать на его канве.
При необходимости срочной перерисовки (например, по наступлению события таймера) следует вызвать один из методов Refresh, Repaint или Invalidate, в зависимости от контекста.


bestolkov   (2011-12-09 13:02:00) [19]

События возникают очень часто (100 гц), поэтому не хотелось бы так быстро


Ega23   (2011-12-09 13:01:00) [20]

Рисуй не по таймеру, а по факту наступления события.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо