Форум: "Media";
Текущий архив: 2010.12.26;
Скачать: [xml.tar.bz2];
ВнизДоступ к объектам метафайла. Найти похожие ветки
← →
Jimmy (2008-04-20 12:01) [0]Добрый день! Нашел пример того, как получить доступ к объектам метафайла. Мало что понял в этом примере, но вроде здесь читаются объекты из метафайла и рисуются на канве формы. Есть два вопроса. 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;
← →
MBo © (2008-04-21 07:59) [1]>Как мне получить доступ именно к отрезку
в MyEnhMetaFileProc анализировать lpEMFR.iType на ссответсвие, видимо, EMR_LINETO, и менять нужные поля записи
>Где найти русскоязычное описание всех этих PlayEnhMetaFileRecord, EnumEnhMetaFile и др.?
английский бы выучил только за то, что на нем разговаривал Леннон
← →
MBo © (2008-04-21 08:02) [2]P.S. Кое-что о метафайлах можно почитать в книге Фень Юаня
← →
Jimmy (2008-04-21 13:48) [3]В MyEnhMetaFileProc пишу:
if lpEMFR.iType=EMR_LINETO then
и как тут получить доступ к свойствам отрезка?
← →
MBo © (2008-04-21 13:55) [4]>if lpEMFR.iType=EMR_LINETO then
>и как тут получить доступ к свойствам отрезка?
И на что в таком случае указывает lpEMFR?
← →
Jimmy (2008-04-21 13:58) [5]На запись отрезка в метафайле. И все же: как изменить например координаты правого конца?
← →
Jimmy (2008-04-21 14:26) [6]Я вдруг подумал о том, что может мне это все не надо. Изначальная проблема вот в чем: у меня уже есть математическое описание метафайла, который вывожу на экран, а мне нужно чтобы пользователь мышкой мог изменять рисунок. При этом появляется сильное мерцание. Так как осуществить без мерцаний анимацию отдельных фрагментов метафайла?
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2010.12.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c