Конференция "Media" » Доступ к объектам метафайла. [D6, WinXP]
 
  • Jimmy (20.04.08 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 © (21.04.08 07:59) [1]
    >Как мне получить доступ именно к отрезку
    в MyEnhMetaFileProc анализировать lpEMFR.iType на ссответсвие, видимо, EMR_LINETO, и менять нужные поля записи

    >Где найти русскоязычное описание всех этих PlayEnhMetaFileRecord, EnumEnhMetaFile и др.?

    английский бы выучил только за то, что на нем разговаривал Леннон
  • MBo © (21.04.08 08:02) [2]
    P.S. Кое-что о метафайлах можно почитать в книге Фень Юаня
  • Jimmy (21.04.08 13:48) [3]
    В MyEnhMetaFileProc пишу:
    if lpEMFR.iType=EMR_LINETO then
    и как тут получить доступ к свойствам отрезка?
  • MBo © (21.04.08 13:55) [4]
    >if lpEMFR.iType=EMR_LINETO then
    >и как тут получить доступ к свойствам отрезка?

    И на что в таком случае указывает lpEMFR?
  • Jimmy (21.04.08 13:58) [5]
    На запись отрезка в метафайле. И все же: как изменить например координаты правого конца?
  • Jimmy (21.04.08 14:26) [6]
    Я вдруг подумал о том, что может мне это все не надо. Изначальная проблема вот в чем: у меня уже есть математическое описание метафайла, который вывожу на экран, а мне нужно чтобы пользователь мышкой мог изменять рисунок. При этом появляется сильное мерцание. Так как осуществить без мерцаний анимацию отдельных фрагментов метафайла?
 
Конференция "Media" » Доступ к объектам метафайла. [D6, WinXP]
Есть новые Нет новых   [133929   +473][b:0][p:0]