Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.217.220.114] |
|
Сообщ.
#1
,
|
|
|
Подзадача – скопировать часть документа в буфер обмена в виде метафайла. Документ – несколько наслоенных друг на друга таблиц, в ячейках которых находятся метафайлы. Соответственно, при выводе документа эти метафайлы проигрываются. Каждый метафайл состоит из одной или нескольких линий и/или эллипсов, нарисованных поверх чёрного, прозрачного, или цветного квадрата, нарисованного функций FillRect и не имеющего линии границы, перед рисованием квадрата в контекст метафайла всякий раз выбирается перо, созданное CreatePen с PS_NULL в первом параметре. Квадрат – это фон, остальной контент метафайла – рисунок. В контекст видивого окна, в контекст окна предпечатного предварительного просмотра, или в контекст принтера все эти метафайлы проигрываются правильно. Но при копировании в буфер в виде метафайла получается фигня. Требуется скопировать часть одной таблицы. Создаю контекст ещё одного метафайла, рисую в него линии линовки копируемой части таблицы, потом проигрываю в него те метафайлы, которые должны быть в ячейках, закрываю, потом SetClipboardData, вставляю из буфера в текстовый процессор от мелкософт и рисунки все на месте все, а части фонов может не быть. Причём, если копируемая область маленькая, то фоны на месте все, а если нет, то только левые верхние (у которых и абсциссы, и ординаты меньше). Сохранил этот метафайл на диск, открыл в IrfanView, там та же фигня. Что я делаю не так? Во вложении примеры созданных метафайлов.
HENHMETAFILE Metafile; HDC DeviceContext; int32_t CellRow; int32_t CellColumn; RECT Rectangle; uint8_t Symbol; uint8_t Cell; uint8_t Color; size_t Index; if ((Width>0)&&(Height>0)) // Width и Height – формальные параметры, размеры копируемой области { DeviceContext=CreateEnhMetaFile(NULL, L"Clip.emf", nullptr, nullptr); // Создаю контекст /*Рисую горизонтальыне линии линовки таблицы*/ for (CellRow=0; CellRow<=((int32_t)Height); ++CellRow) { MoveToEx(DeviceContext, 0 , ((LONG)(CellRow*250)), nullptr); LineTo (DeviceContext, ((LONG)(Width*250)), ((LONG)(CellRow*250)) ); } /*Рисую вертикальные линии линовки таблицы*/ for (CellColumn=0; CellColumn<=((int32_t)Width); ++CellColumn) { MoveToEx(DeviceContext, ((LONG)(CellColumn*250)), 0 , nullptr); LineTo (DeviceContext, ((LONG)(CellColumn*250)), ((LONG)(Height*250)) ); } /*Перебираю ячейки копируемой области*/ for (CellRow=((int32_t)Row); CellRow<(((int32_t)Row)+((int32_t)Height)); ++CellRow) { for (CellColumn=((int32_t)Column); CellColumn<(((int32_t)Column)+((int32_t)Width)); ++CellColumn) { if ((CellRow>=0)&&(CellRow<((int32_t)(this->Height)))&&(CellColumn>=0)&&(CellColumn<((int32_t)(this->Width)))) { /*Rectangle – прямоугольнки, в границах которого я хочу играть метафайлы, которые должны быть в ячейках*/ (Rectangle.left )=((LONG)((CellColumn-((int32_t)Column))*250+ 25)); (Rectangle.right )=((LONG)((CellColumn-((int32_t)Column))*250+225)); (Rectangle.top )=((LONG)((CellRow -((int32_t)Row ))*250+ 25)); (Rectangle.bottom)=((LONG)((CellRow -((int32_t)Row ))*250+225)); Index=((size_t)CellRow)*((size_t)(this->Width))+((size_t)CellColumn); // this->Width – поле, ширина всей таблицы, данные ячеек хранятся в линерализованном массиве, в котором индекс равен (номер строки*ширина таблицы)+номер столбца. При выводе в видовое окно, выводе окно предпечатного предварительного просмотра, выводе на принтер и копировании данных в буфер в собственном формате используется та же формула, а глючит только копирование выделенной области в буфер в виде метафайла. Cell=((this->Data)[Index]); Symbol=(Cell&0x07U); Color =(Cell&0x70U); /*В теле вложенного свича непосредственно играю один метафайл*/ switch (Symbol) { case 0x00U : switch (Color) { case 0x10U : PlayEnhMetaFile(DeviceContext, Metafiles.Empty.Red, &Rectangle); break; case 0x20U : PlayEnhMetaFile(DeviceContext, Metafiles.Empty.Green, &Rectangle); break; case 0x30U : PlayEnhMetaFile(DeviceContext, Metafiles.Empty.Yellow, &Rectangle); break; case 0x40U : PlayEnhMetaFile(DeviceContext, Metafiles.Empty.Blue, &Rectangle); break; case 0x50U : PlayEnhMetaFile(DeviceContext, Metafiles.Empty.Magenta, &Rectangle); break; case 0x60U : PlayEnhMetaFile(DeviceContext, Metafiles.Empty.Sky, &Rectangle); break; case 0x70U : PlayEnhMetaFile(DeviceContext, Metafiles.Empty.White, &Rectangle); break; } break; case 0x01U : switch (Color) { case 0x00U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCross.Black, &Rectangle); break; case 0x10U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCross.Red, &Rectangle); break; case 0x20U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCross.Green, &Rectangle); break; case 0x30U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCross.Yellow, &Rectangle); break; case 0x40U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCross.Blue, &Rectangle); break; case 0x50U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCross.Magenta, &Rectangle); break; case 0x60U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCross.Sky, &Rectangle); break; case 0x70U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCross.White, &Rectangle); break; } break; case 0x02U : switch (Color) { case 0x00U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCross.Black, &Rectangle); break; case 0x10U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCross.Red, &Rectangle); break; case 0x20U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCross.Green, &Rectangle); break; case 0x30U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCross.Yellow, &Rectangle); break; case 0x40U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCross.Blue, &Rectangle); break; case 0x50U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCross.Magenta, &Rectangle); break; case 0x60U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCross.Sky, &Rectangle); break; case 0x70U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCross.White, &Rectangle); break; } break; case 0x03U : switch (Color) { case 0x00U : PlayEnhMetaFile(DeviceContext, Metafiles.Circle.Black, &Rectangle); break; case 0x10U : PlayEnhMetaFile(DeviceContext, Metafiles.Circle.Red, &Rectangle); break; case 0x20U : PlayEnhMetaFile(DeviceContext, Metafiles.Circle.Green, &Rectangle); break; case 0x30U : PlayEnhMetaFile(DeviceContext, Metafiles.Circle.Yellow, &Rectangle); break; case 0x40U : PlayEnhMetaFile(DeviceContext, Metafiles.Circle.Blue, &Rectangle); break; case 0x50U : PlayEnhMetaFile(DeviceContext, Metafiles.Circle.Magenta, &Rectangle); break; case 0x60U : PlayEnhMetaFile(DeviceContext, Metafiles.Circle.Sky, &Rectangle); break; case 0x70U : PlayEnhMetaFile(DeviceContext, Metafiles.Circle.White, &Rectangle); break; } break; case 0x04U : switch (Color) { case 0x00U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrosses.Black, &Rectangle); break; case 0x10U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrosses.Red, &Rectangle); break; case 0x20U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrosses.Green, &Rectangle); break; case 0x30U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrosses.Yellow, &Rectangle); break; case 0x40U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrosses.Blue, &Rectangle); break; case 0x50U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrosses.Magenta, &Rectangle); break; case 0x60U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrosses.Sky, &Rectangle); break; case 0x70U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrosses.White, &Rectangle); break; } break; case 0x05U : switch (Color) { case 0x00U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCrossInCircle.Black, &Rectangle); break; case 0x10U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCrossInCircle.Red, &Rectangle); break; case 0x20U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCrossInCircle.Green, &Rectangle); break; case 0x30U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCrossInCircle.Yellow, &Rectangle); break; case 0x40U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCrossInCircle.Blue, &Rectangle); break; case 0x50U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCrossInCircle.Magenta, &Rectangle); break; case 0x60U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCrossInCircle.Sky, &Rectangle); break; case 0x70U : PlayEnhMetaFile(DeviceContext, Metafiles.ObliqueCrossInCircle.White, &Rectangle); break; } break; case 0x06U : switch (Color) { case 0x00U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCrossInCircle.Black, &Rectangle); break; case 0x10U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCrossInCircle.Red, &Rectangle); break; case 0x20U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCrossInCircle.Green, &Rectangle); break; case 0x30U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCrossInCircle.Yellow, &Rectangle); break; case 0x40U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCrossInCircle.Blue, &Rectangle); break; case 0x50U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCrossInCircle.Magenta, &Rectangle); break; case 0x60U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCrossInCircle.Sky, &Rectangle); break; case 0x70U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightCrossInCircle.White, &Rectangle); break; } break; case 0x07U : switch (Color) { case 0x00U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrossesInCircle.Black, &Rectangle); break; case 0x10U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrossesInCircle.Red, &Rectangle); break; case 0x20U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrossesInCircle.Green, &Rectangle); break; case 0x30U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrossesInCircle.Yellow, &Rectangle); break; case 0x40U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrossesInCircle.Blue, &Rectangle); break; case 0x50U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrossesInCircle.Magenta, &Rectangle); break; case 0x60U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrossesInCircle.Sky, &Rectangle); break; case 0x70U : PlayEnhMetaFile(DeviceContext, Metafiles.StraightAndObliqueCrossesInCircle.White, &Rectangle); break; } break; } } } } Metafile=CloseEnhMetaFile(DeviceContext); // Закрываю контекст и создаю метафайл SetClipboardData(CF_ENHMETAFILE, Metafile); //Копирую его в буфер } Прикреплённый файл__________________.rar (1,04 Кбайт, скачиваний: 180) |