Форум: "Начинающим";
Текущий архив: 2012.03.25;
Скачать: [xml.tar.bz2];
ВнизОтображение графики Найти похожие ветки
← →
bestolkov (2011-12-09 12:40) [0]Всем привет! Делаю следующее:
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 12:53) [1]
> В чем проблема?
В том что в момент выполнения обработчика OnCreate окна формы еще не существует.
← →
bestolkov (2011-12-09 12:56) [2]А в целом концепция верная?
← →
bestolkov (2011-12-09 12:59) [3]Т.е. что я хотел вообще сделать: есть таймер, который следит за некоторыми параметрами и в случае изменения этих параметров, на PaintBoxе рисуются строки. Еесли таймер выключен, то строки рисуются со значениями по умолчанию.
← →
Ega23 © (2011-12-09 13:01) [4]Рисуй не по таймеру, а по факту наступления события.
← →
bestolkov (2011-12-09 13:02) [5]События возникают очень часто (100 гц), поэтому не хотелось бы так быстро
← →
Сергей М. © (2011-12-09 13:09) [6]
> концепция верная?
Неверная.
У пейнтбокса есть событие OnPaint - в нем и следует рисовать на его канве.
При необходимости срочной перерисовки (например, по наступлению события таймера) следует вызвать один из методов Refresh, Repaint или Invalidate, в зависимости от контекста.
← →
Сергей М. © (2011-12-09 13:11) [7]
> События возникают очень часто (100 гц)
Прелюбопытно)
И что же это за события ?
← →
bestolkov (2011-12-09 13:11) [8]
> Сергей М. © (09.12.11 13:09) [6]
Пытаюсь так делать, однако все страшно мигает)))
← →
bestolkov (2011-12-09 13:11) [9]
> Сергей М. © (09.12.11 13:11) [7]
Опрос ком-порта
← →
Сергей М. © (2011-12-09 13:16) [10]
> Опрос ком-порта
и накой шиш нужно его дрючить с такой бешеной скоростью, если он сам может сообщить о поступлении новых данных от подключенного к нему дивайса ?)
← →
bestolkov (2011-12-09 13:18) [11]девайс передает 100 гц
← →
bestolkov (2011-12-09 13:20) [12]Главное после Вашего ответа забыл спросить)) : когда же создается PaintBox.canvas. handle?
← →
bestolkov (2011-12-09 13:21) [13]и как избавиться от мерцания, если не секрет?))
← →
Сергей М. © (2011-12-09 13:21) [14]
> девайс передает 100 гц
А человеческий глаз способен реагировать на частоту в 4 раза меньшую ...
← →
bestolkov (2011-12-09 13:23) [15]в том-то и дело, что отображаю в таймере 0.25 ГЦ, а не по факту изменения состояния
← →
Сергей М. © (2011-12-09 13:42) [16]> отображаю в таймере 0.25 ГЦ
Стандартный TTimer не поддерживает разрешение в 25 гц.
← →
bestolkov (2011-12-09 14:03) [17]Я ошибся, 4 герца, конечно же. Всё страшно мерцает при изменении размеров окна, как бороться, если не секрет?
← →
Сергей М. © (2011-12-09 14:13) [18]в обработчик OnCreate формы помести
DoubleBuffered = True
← →
Anatoly Podgoretsky © (2011-12-09 14:31) [19]
> Я ошибся, 4 герца, конечно же. Всё страшно мерцает при изменении
> размеров окна, как бороться, если не секрет?
4 гц <> 0,25 "nj d 16! раз выше
← →
bestolkov (2011-12-09 14:31) [20]Пробывал, не помогает((( и крайний вопрос: когда же все таки создется paintbox.canvas.handle?
← →
Сергей М. © (2011-12-09 14:47) [21]
> Пробывал, не помогает
Значит что-то еще криво или несуразно делаешь.
> когда же все таки создется paintbox.canvas.handle?
Да не важно когда он создается.
Твое дело - рисовать на его канве не иначе как в его обработчике OnPaint, остальное тебя вообще заботить не должно.
← →
bestolkov (2011-12-09 14:53) [22]Я понял Вас. Тем не менее хотелось бы один раз создать объект и один раз его освободить.. Или это совсем не обязательно?
← →
Сергей М. © (2011-12-09 15:11) [23]
> хотелось бы один раз создать объект и один раз его освободить
А зачем ему при конструировании передавать именно хендл канвы пейнтвокса ? Создай битмап и передай его хендл - пусть туда рисует, а при OnPaint канву битмапа копируй на канву пейнтбокса.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.03.25;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.003 c