Ты пытаешься зачем-то изменить (или повлиять на) размеры отображаемой области. Это я никак не пойму. То что грид сделан на CWnd основе - нормально (на чём же его ещё делать?). Вопрос - есть ли у тебя Doc/View архитектура? Если есть, то ты можешь вызывать "рисование" грида из View класса, преимущество в том, что в View есть OnPrint, один из параметров которой CPrintInfo* pInfo. В этом объекте содержится инфа о принтере - например его разрешение, которое ты задаёшь вручную. Если у тебя этого нет, тебе придётся "вытаскивать" эту инфу ручками - опять же зависит от того как ты DC принтера получаешь. Из него (DC) ты можешь получить информацию об используемом шрифте:
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
и проверить - подходит или нет.
А вот кстати - покажи как ты CFont используешь? Как размер указываешь? -
зы Сорри ты как раз привёл пример - попробуй размер не 14, а 140. Тут могу напутать - сначала посмотрю в MSDN
Это в общем. Теперь перейдём к частностям.
Если печатать прямо так, получается распечатка 2 на 2 см
Вот я и использовал StretchBlt. Но это не лучшее решение, качество очень плохое.
Всё понятно. Конечно качество будет плохим. Информация из "ниоткуда" не возникает.Так делать конечно же нельзя. На принтер "выплёвывается" набор точек - матрица. Чтобы получить 100% соответствие ты должен не готовый рисунок (матрицу) изменять-увеличивать, а создавать новую с учётом повышенного разрешения. Те ты должен изменить алгоритм рисования грида, ввести в него фактор масштаба (или разрешения). Там где на отрезок отводилось 100 точек, должно отводится 1000 и тд. Можно сформулировать задачу след. образом:
для отображения отрезка длинной 2,52 см - на экране небходимо 72 точки (при разрешении экрана 72 dpi). Сколько точек понадобится для отображения этого же отрезка при разрешении 300 dpi?
думаю идея ясна? Именно эту поправку ты должен ввести в алгоритм рисования грида. И кстати шрифт тоже надо изменять.
что за шкала в 0,001 мм?
в gdi+ это делается очень просто (если бы он ещё ROP операции поддерживал, я бы забыл о gdi как о кошмарном сне) итак, я сейчас работаю над проектом для печати на принтерах.
Заказчик потребовал точности 0.001 мм хотя сама механика принтерова врёт на пол-миллиметра. Ну это всё фигня. Надо? Сделаем! Вот так это выглядит в gdi+
Graphics *pgr = Graphics::FromHDC(hDC);
pgr->SetSmoothingMode(SmoothingModeNone); // Avoid anti alias
pgr->SetPageUnit(UnitMillimeter); //единица измерений - мм
REAL rScale = 1.0f; // масштаб 100%
pgr->ScaleTransform(rScale, rScale);
pgr->SetPageScale(0.001f); // шкала
Всё, после этого я работаю только с тысячными миллиметра. И на экрание и на принтере всё отображается с необходимой точностью и сколько это в точках на экране/принтере меня не волнует.