Run-time помещение TfrPictureView
Вопрос разработчикам.
Делаю следующий код: (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 - тогда при просмотре все отображается верно. Такое ощущение, что размеры картинки перед помещением на поверхность страницы в объект предварительного просмотра пересчитываются. Подскажите - в чем проблема?
Делаю следующий код: (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 - тогда при просмотре все отображается верно. Такое ощущение, что размеры картинки перед помещением на поверхность страницы в объект предварительного просмотра пересчитываются. Подскажите - в чем проблема?
Комментарии
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;