Вопрос по Metafile в буфере обмена
 Добавлено: 03.01.2022 22:05:41
Добавлено: 03.01.2022 22:05:41Всех с новым годом.
Excel при копировании ячеек в буфер обмена создает там набор различных представлений этой информации. Одним из них он пишет "METAFILE PICTURE".
В статьях в интернетевезде написано, что для передачи метафайла через буфер обмена надо использовать структуру METAFILEPICT, которая указывает на область памяти где размещен метафайл. Если делаю код, то файл сам физически у меня создается правильно.
Но когда пишется эта структура в буфер обмена, то это крошечный набор байт. В случае же с Excel там 66 строк данных при просмотре содержимого буфера. Получается, что Excel пишет не пакет, а сам метафайл в буфер?
Если так, то не могу понять как то что создается WinAPI загнать в память для записи.
Конечная задача записать в буфер обмена таблицу аналогично тому, как это делает Excel чтобы ее смог прочитать AutoCAD. Последний без записи метафайла и OBJECTDESCRIPTOR не хочет видеть данные в нужном мне виде.
			Excel при копировании ячеек в буфер обмена создает там набор различных представлений этой информации. Одним из них он пишет "METAFILE PICTURE".
В статьях в интернетевезде написано, что для передачи метафайла через буфер обмена надо использовать структуру METAFILEPICT, которая указывает на область памяти где размещен метафайл. Если делаю код, то файл сам физически у меня создается правильно.
Но когда пишется эта структура в буфер обмена, то это крошечный набор байт. В случае же с Excel там 66 строк данных при просмотре содержимого буфера. Получается, что Excel пишет не пакет, а сам метафайл в буфер?
Если так, то не могу понять как то что создается WinAPI загнать в память для записи.
Конечная задача записать в буфер обмена таблицу аналогично тому, как это делает Excel чтобы ее смог прочитать AutoCAD. Последний без записи метафайла и OBJECTDESCRIPTOR не хочет видеть данные в нужном мне виде.
- Код: Выделить всё
- procedure SetAsMetafile(TextData: String);
 var
 Stream: TStream;
 hMeta:HGLOBAL;
 hdcMeta:HDC;
 hMF:HMETAFILE;
 lpMETA:LPMETAFILEPICT;
 hwnd1:hwnd;
 hMetaGreenPen:HPEN;
 hMetaVioletBrush:HBRUSH;
 PointMeta:LPPoint;
 begin
 if CF_MetaFilePict = 0 then
 exit;
 try
 hdcMeta := CreateMetaFile(nil); //'test.met'
 SetWindowOrgEx(hdcMeta, 0, 0, nil);
 SetWindowExtEx(hdcMeta, 100, 100, nil);
 hMetaGreenPen := CreatePen(0, 0, $0000FF00);
 SelectObject(hDCMeta, hMetaGreenPen);
 hMetaVioletBrush := CreateSolidBrush($00FF00FF);
 SelectObject(hDCMeta, hMetaVioletBrush);
 GetCurrentPositionEx(hdcMeta, PointMeta);
 MoveToEx(hdcMeta, 0, 0, PointMeta);
 TextOut(hdcMeta, 10, 10, 'Hello People', 12);
 LineTo(hdcMeta, 10, 10);
 hMF := CloseMetaFile(hdcMeta);
 //Вариант пакета для буфера обмена, согласно статьи
 {
 hMeta := GlobalAlloc(GHND, sizeof(METAFILEPICT));
 lpMeta :=GlobalLock(hMeta);
 lpmeta^.mm :=MM_ANISOTROPIC;
 lpmeta^.hMF :=hMF;
 lpmeta^.xExt :=0;
 lpmeta^.yExt :=0;
 GlobalUnlock(hMeta);
 }
 //if(hMeta<>0)then
 //begin
 // Вариант записи пакета в память буфера обмена, но тогда теряется другая записанная ранее информация
 //OpenClipboard(Application.MainForm.Handle);
 //EmptyClipboard;
 //SetClipboardData(CF_METAFILEPICT, hMeta);
 //CloseClipboard;
 Stream.Size := 0;
 Stream.Position := 0;
 Stream.WriteBuffer(lpMeta, SizeOf(lpMeta)); //Also write terminating zero
 Stream.Position := 0;
 //end;
 ClipBoard.AddFormat(CF_METAFILEPICTURE, Stream);
 finally
 Stream.Free;
 end;
 end;