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;