Run-time помещение TfrPictureView

отредактировано 09:31 Раздел: FastReport 2.xx VCL
Вопрос разработчикам.
Делаю следующий код: (FastReport 2.51, CBuilder 6)

TfrReport = new TfrReport(NULL)
frReport->Preview = frPreview;

...
...

frReport->Pages->Add();
TfrPage *page = frReport->Pages->Pages[frReport->Pages->Count - 1];
TfrPictureView *pic = new TfrPictureView();

page->Objects->Add(pic);

pic->x = page->LeftMargin();
pic->y = page->TopMargin();
pic->dx = page->RightMargin();
pic->dy = Page->BottomMargin();

TMetafile *mf = new TMetafile();
TMetafileCanvas *mfc = new TMetafileCanvas(mf, 0);

mf->Width = pic->dx;
mf->Height = pic->dy;

mfc->Pen->Width = 0;
mfc->Brush->Color = clYellow;

mfc->Rectangle(TRect(0, 0, mf->Width, mf->Height)); //Вся видимая область
mfc->Ellipse(TRect(0, 0, mf->Width, mf->Height)); //Проверка на правильность отрисовки

mfc->Font->Size = 10;
mfc->Font->Name = "Arial";
mfc->TextOut(10, 10, "1234567890"); //Сравнение размера шрифта
delete mfc; mfc = NULL;

pic->Picture->Metafile->Assign(mf); //Назначение картинки

delete mf; mf = NULL;

frReport->ShowReport();

Итог - картинка рисуется положенная (какая и хотелась - по форме и содержимому), границы эллипса - гладкие (что доказывает работу wmf/emf), однако размер рисуемой области НЕСКОЛЬКО МЕНЬШЕ отображаемой поверхности страницы в объекте frPreview, хотя по всем признакам (на момент отрисовки) они должны быть идентичны.

Пробовал брать разные константы из page->PageInfo - не помогло. Пробовал вычислять размеры через WinAPI - не помогло. Для правильного отображения (на моем принтере) нужен коэффициент увеличения приблизительно 1,21. Например - ширина поверхности страницы на экране при разрешении 96 пикселей на дюйм при 100% увеличении должна быть 793 пикселя. В реальности картинке надо присваивать значение ширины в пикселях 983 - тогда при просмотре все отображается верно. Такое ощущение, что размеры картинки перед помещением на поверхность страницы в объект предварительного просмотра пересчитываются. Подскажите - в чем проблема?

Комментарии

  • отредактировано 09:31
    Решается так:

    TMetafile *mf = new TMetafile();
    TMetafileCanvas *mfc = new TMetafileCanvas(mf, 0);

    mf->Assign(pic->Picture->Metafile);

    mf->Width = pic->dx;
    mf->Height = pic->dy;

    mfc->Pen->Color = clRed;
    mfc->Pen->Width = 0;
    mfc->Brush->Color = clWhite;

    mfc->Ellipse(TRect(0, 0, pic->dx, pic->dy));

    mfc->Font->Size = 12;
    mfc->Font->Name = "Arial";
    mfc->TextOut(72, 72, "1234567890");


    delete mfc; mfc = NULL;

    mfc = new TMetafileCanvas(pic->Picture->Metafile, 0);
    mfc->Draw(0, 0, mf);
    delete mfc;

    delete mf; mf = NULL;

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.