На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Криво играется один метафайл в другой
    Подзадача – скопировать часть документа в буфер обмена в виде метафайла. Документ – несколько наслоенных друг на друга таблиц, в ячейках которых находятся метафайлы. Соответственно, при выводе документа эти метафайлы проигрываются. Каждый метафайл состоит из одной или нескольких линий и/или эллипсов, нарисованных поверх чёрного, прозрачного, или цветного квадрата, нарисованного функций FillRect и не имеющего линии границы, перед рисованием квадрата в контекст метафайла всякий раз выбирается перо, созданное CreatePen с PS_NULL в первом параметре. Квадрат – это фон, остальной контент метафайла – рисунок. В контекст видивого окна, в контекст окна предпечатного предварительного просмотра, или в контекст принтера все эти метафайлы проигрываются правильно. Но при копировании в буфер в виде метафайла получается фигня. Требуется скопировать часть одной таблицы. Создаю контекст ещё одного метафайла, рисую в него линии линовки копируемой части таблицы, потом проигрываю в него те метафайлы, которые должны быть в ячейках, закрываю, потом SetClipboardData, вставляю из буфера в текстовый процессор от мелкософт и рисунки все на месте все, а части фонов может не быть. Причём, если копируемая область маленькая, то фоны на месте все, а если нет, то только левые верхние (у которых и абсциссы, и ординаты меньше). Сохранил этот метафайл на диск, открыл в IrfanView, там та же фигня. Что я делаю не так? Во вложении примеры созданных метафайлов.
    ExpandedWrap disabled
       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)
    Сообщение отредактировано: Ирокез -
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0236 ]   [ 18 queries used ]   [ Generated: 16.04.24, 05:35 GMT ]