-
Добрый день! Нашел пример того, как получить доступ к объектам метафайла. Мало что понял в этом примере, но вроде здесь читаются объекты из метафайла и рисуются на канве формы. Есть два вопроса. 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;
-
>Как мне получить доступ именно к отрезку в MyEnhMetaFileProc анализировать lpEMFR.iType на ссответсвие, видимо, EMR_LINETO, и менять нужные поля записи
>Где найти русскоязычное описание всех этих PlayEnhMetaFileRecord, EnumEnhMetaFile и др.?
английский бы выучил только за то, что на нем разговаривал Леннон
-
P.S. Кое-что о метафайлах можно почитать в книге Фень Юаня
-
В MyEnhMetaFileProc пишу: if lpEMFR.iType=EMR_LINETO then и как тут получить доступ к свойствам отрезка?
-
>if lpEMFR.iType=EMR_LINETO then >и как тут получить доступ к свойствам отрезка?
И на что в таком случае указывает lpEMFR?
-
На запись отрезка в метафайле. И все же: как изменить например координаты правого конца?
-
Я вдруг подумал о том, что может мне это все не надо. Изначальная проблема вот в чем: у меня уже есть математическое описание метафайла, который вывожу на экран, а мне нужно чтобы пользователь мышкой мог изменять рисунок. При этом появляется сильное мерцание. Так как осуществить без мерцаний анимацию отдельных фрагментов метафайла?
|