![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Доступ к объектам метафайла. [D6, WinXP]
Jimmy © (2008-04-20 12:01:00)Добрый день! Нашел пример того, как получить доступ к объектам метафайла. Мало что понял в этом примере, но вроде здесь читаются объекты из метафайла и рисуются на канве формы. Есть два вопроса. 1) Как мне получить доступ именно к отрезку (по нажатию на Button3), изменить координаты его правого конца и перерисовать только его на том же MyMetaFile и Image1? 2) Где найти русскоязычное описание всех этих PlayEnhMetaFileRecord, EnumEnhMetaFile и др.? Заранее спасибо!
function MyEnhMetaFileProc(DC: HDC; {handle to device context}
lpHTable: PHANDLETABLE; {pointer to metafile handle table}
lpEMFR: PENHMETARECORD; {pointer to metafile record}
nObj: integer; {count of objects}
TheForm: TForm1): integer; stdcall;
begin
{draw the metafile record}
PlayEnhMetaFileRecord(dc, lpHTable^, lpEMFR^, nObj);
{set to zero to stop metafile enumeration}
result := 1;
end;
procedure TForm1.Button2Click(Sender: TObject);
Var MCanva:TMetaFileCanvas;
begin
MyMetaFile.Width:=250;
MyMetaFile.Height:=250;
MCanva:=TMetafileCanvas.Create(MyMetafile, 0);
MCanva.Brush.Color := clRed;
MCanva.Ellipse(5,5,45,45);
MCanva.MoveTo(10,20);
MCanva.LineTo(60,70);
MCanva.Brush.Color := clBlue;
MCanva.Ellipse(5,55,45,105);
MCanva.Free;
Image1.Picture.Assign(MyMetaFile);
end;
procedure TForm1.Button3Click(Sender: TObject);
Var
lpENHMETAHEADER: PENHMETAHEADER; {extra metafile info}
lpENHMETAHEADERSIZE: DWORD;
NumMetaRecords: DWORD;
begin
{we might as well get some extra metafile info}
lpENHMETAHEADERSIZE := GetEnhMetaFileHeader(MyMetafile.Handle, 0, nil);
NumMetaRecords := 0;
if (lpENHMETAHEADERSIZE > 0) then
begin
GetMem(lpENHMETAHEADER, lpENHMETAHEADERSIZE);
GetEnhMetaFileHeader(MyMetafile.Handle, lpENHMETAHEADERSIZE, lpENHMETAHEADER);
{Here is an example of getting number of metafile records}
NumMetaRecords := lpENHMETAHEADER^.nRecords;
{enumerate the records}
EnumEnhMetaFile(Canvas.Handle, MyMetafile.Handle, @MyEnhMetaFileProc, self,Rect(5, 5, 245,
45));
FreeMem(lpENHMETAHEADER, lpENHMETAHEADERSIZE);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
MyMetafile := TMetafile.Create;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MyMetafile.Free;
end;
Jimmy (2008-04-21 14:26:00) [1]Я вдруг подумал о том, что может мне это все не надо. Изначальная проблема вот в чем: у меня уже есть математическое описание метафайла, который вывожу на экран, а мне нужно чтобы пользователь мышкой мог изменять рисунок. При этом появляется сильное мерцание. Так как осуществить без мерцаний анимацию отдельных фрагментов метафайла?
Jimmy (2008-04-21 13:58:00) [2]На запись отрезка в метафайле. И все же: как изменить например координаты правого конца?
MBo (2008-04-21 13:55:00) [3]>if lpEMFR.iType=EMR_LINETO then
>и как тут получить доступ к свойствам отрезка?
И на что в таком случае указывает lpEMFR?
Jimmy (2008-04-21 13:48:00) [4]В MyEnhMetaFileProc пишу:
if lpEMFR.iType=EMR_LINETO then
и как тут получить доступ к свойствам отрезка?
MBo (2008-04-21 08:02:00) [5]P.S. Кое-что о метафайлах можно почитать в книге Фень Юаня
MBo (2008-04-21 07:59:00) [6]>Как мне получить доступ именно к отрезку
в MyEnhMetaFileProc анализировать lpEMFR.iType на ссответсвие, видимо, EMR_LINETO, и менять нужные поля записи
>Где найти русскоязычное описание всех этих PlayEnhMetaFileRecord, EnumEnhMetaFile и др.?
английский бы выучил только за то, что на нем разговаривал Леннон