![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отображение графики [D7, XP]
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]Рисуй не по таймеру, а по факту наступления события.