Корректная печать содержимого экрана в Borland C++ Builder (22.12.2014). Печать
2014 - Декабрь
22.12.2014 20:22
Save & Share

Столкнулся с частой проблемой языка Borland C++ Builder v.6.0, выражаемую в мелкой печати каких-либо графических объектов. Например, распечатка GroupBox делается обычным методом PaintTo; однако изображение на листе получается в 10-20 раз меньше, чем на экране.

Связано это с особенностью взаимосвязи разрешения принтера с разрешением экрана. Разрешение экрана статично и равно 96dpi, в то время как разрешение принтера может меняться. Builder старый язык, шло время - разрешения принтеров становились все больше и больше, а напечатанные изображения - все меньше и меньше.

В интернете решение данной проблемы присутствует всего в одном экземпляре, потому что остальные программисты просто забивали и сдавались. Но и единственный экземпляр решения не такой понятный и приличный по объему (так и не смог заставить его работать).

Мне повезло: удалось написать код, корректно растягивающий графические объекты на весь лист формата A4. При этом теряется качество, однако преобразование разрешения исходного объекта - это уже другая задача. Традиционно выкладываю код в полезных исходниках для программистов.

TRect r(0, 0, Prntr->PageWidth - 20, Prntr->PageHeight - 20); //Область печати, в которую будет помещен объект, с учетом полей печати принтера.

if (iMode == 1) Chart_Graphs->PrintPartial(r); //Особенная функция TChart, позволяющая печатать график на весь лист.

if (iMode == 2)
{
    Graphics::TBitmap *bmBMP = new Graphics::TBitmap(); //Объект растрового рисунка.
    bmBMP->Width = GroupBox_Information_Words->Width;
    bmBMP->Height = GroupBox_Information_Words->Height;


    GroupBox_Information_Words->PaintTo(bmBMP->Canvas, 0, 0); //В растровом рисунке находится объект печати.
    Prntr->Canvas->StretchDraw(r, bmBMP); //Растянуть по области печати принтера растровый рисунок.
}