Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите распечатать самописный грид  (Прочитано 12451 раз)
0 Пользователей и 1 Гость смотрят эту тему.
MegaLamer
Гость
« : 18-02-2006 16:19 » 

в общем, есть грид. Нужно отправить на печать. С принтером еще никогда не работал. Начал с того что рисовал в CompatibleDC как на экран, а потом использовал StretchBlt в контекст рисования принтера. То что получилось мне естественно не понравилось. )

Сейчас сделал так: перед отрисовкой задаю трансформацию
Код:
SetGraphicsMode(dc.GetSafeHdc(), GM_ADVANCED);
XFORM xf = {0};
xf.eM11 = 600/90.0;
xf.eM22 = 600/90.0;
SetWorldTransform(dc.GetSafeHdc(), &xf);
здесь 600  - разрешение принтера, 90 - экрана (приблизительно)
получается все терпимо, но... о WYSIWYG'е уже речь не идет.
Текст на бумаге (точнее в пдфе, печатаю в пдф) почему то длинее, чем на экране. Из за этого начинаются глюки, в ячейках не умещается текст, там где ему раньше (при отображении на экране) вполне хватало места.

Почитал в МСДН'е описание "Mapping Modes and Translations", не въехал для чего нужен SetMappingMode. Для чего оно нужно?

Подскажите, плз. Как вообще печатают на принтере в таком случае? В инете нашел несколько примеров, но там вопрос, что текст на бумаге отличается от экранного, не рассматривается вообще.
И нашел статью что WYSIWYG'а в виндах и быть то не может, если самому не печатать по одной буковке с расчетом координат каждой буквы. Неужели все так плохо??? (((
« Последнее редактирование: 16-12-2007 16:32 от Алексей1153++ » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 18-02-2006 18:02 » 

Собственно процесс печати ничем не отличается от процесса рисования на экране. Разница действительно только в DC. И, обычно, проблем с этим не возникает. Поэтому давай-ка подробнее. Какой проект? MFC, SDI, MDI, Dialog? Что у тебя вообще есть? Зачем тебе SetWorldTransform?
Я в последнее время работаю с gdi+, там вообще всё проще пареной репы - устанавливаем шкалу 0,001 мм и всё хокей и на экране и на принтерах и в пдф. С gdi должно быть тоже самое, я ща всего не помню, давно это было, но про подобное первый раз слышу. И что это за статья про WYSIWYG в виндах? А как же тогда все CAD-ы, Photoshop-ы, Corel-ы, FreeHand-ы и тд и тп? Все народ обманывают? Чушь какая-то. Поэтому "не надо нервничать, разберёмся"
« Последнее редактирование: 18-02-2006 18:15 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
MegaLamer
Гость
« Ответ #2 : 19-02-2006 07:32 » 

Проект МFC, но грид сделан на основе СWnd, а не СView, поэтому печатаю без участия MFC.
Скажем так, есть диалог - основное окно, на нем лежит грид. Задача, его распечатать. Показываем диалог настройки принтера, получаем контекст рисования принтера.
в общем у меня есть куда рисовать с разрешением(у принтера 600 на 600) 600/2.54*21см  на 600/2.56*27.5.   Это ля формата А4, без учета полей. И есть что рисовать. Только я не знаю как увеличить рисунок грида, который имеет размер на экране  600 на 800 пикселей. Если печатать прямо так, получается распечатка 2 на 2 см Улыбаюсь
Вот я и использовал StretchBlt. Но это не лучшее решение, качество очень плохое.
Теперь, перед отрисовкой задаю SetWorldTransform, при указанных параметрах, это дает увеличение всего вывода в 600/90.0 раз. (здесь 600  - разрешение принтера, 90 - экрана). Все ок, только похоже что в функциях вывода текста GDI в таком случае, при расчете следующего положения буквы происходит толи округление, толи еще что то.. Но факт тот что на экране цифра в ячейке грида умещается, а на бумаге нет (.

А что за шкала в 0,001 мм?
« Последнее редактирование: 19-02-2006 07:40 от MegaLamer » Записан
MegaLamer
Гость
« Ответ #3 : 19-02-2006 11:48 » 

Еще не вполне понимая, что делаю, заменил код
Код:
SetGraphicsMode(dc.GetSafeHdc(), GM_ADVANCED);
XFORM xf = {0};
xf.eM11 = 600/90.0;
xf.eM22 = 600/90.0;
SetWorldTransform(dc.GetSafeHdc(), &xf);
на этот:
Код:
dc.SetMapMode(MM_ANISOTROPIC);
unsigned pageSizeCX = 21/2.54*600;
unsigned pageSizeCY = 27.5/2.54*600;
unsigned screenPageSizeCX = 21/2.54*90;
unsigned screenPageSizeCY = 27.5/2.54*90;
SetWindowExtEx(dc.GetSafeHdc(), screenPageSizeCX, -screenPageSizeCY, NULL);
SetViewportExtEx(dc.GetSafeHdc(), pageSizeCX, -pageSizeCY, NULL);

и.... получил тоже самое что и в 1 случае =))) Шрифт не влазит! )

Он не то что бы не влазит, он больше по размеру как при использовании SetMapMode так и при масштабировании SetWorldTransform'ом!
Не могу проверить на бумаге, принтера пока нет. Если сравнивать пдф с экранным вариантом (подогнать масштаб грида и той картинки, что получилось в пдф по размеру ячек), то есть сущесвенное различие. А именно шрифт в пдфе побольше на 1 или 2. То есть если в гриде 12, то в пдфе 13 или 14 pt. Или это артефакты масштабирования самого акробата и на бумаге шрифты не будут отличатся... хотя маловероятно. Почему шрифты отличаются???

Что не так? Создается он по структуре
Код:
LOGFONT lf = {0};
lf.lfHeight = 14;
lf.lfWidth = 6;
lf.lfWeight = FW_NORMAL;
lf.lfCharSet = RUSSIAN_CHARSET;
wcscpy(lf.lfFaceName, L"Areal");
« Последнее редактирование: 16-12-2007 16:32 от Алексей1153++ » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 19-02-2006 16:53 » 

Ты пытаешься зачем-то изменить (или повлиять на) размеры отображаемой области. Это я никак не пойму. То что грид сделан на 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); // шкала

Всё, после этого я работаю только с тысячными миллиметра. И на экрание и на принтере всё отображается с необходимой точностью и сколько это в точках на экране/принтере меня не волнует.
« Последнее редактирование: 19-02-2006 16:55 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
MegaLamer
Гость
« Ответ #5 : 21-02-2006 16:02 » 

понял, спасибо. )
попробую. Получится или нет, отпишусь.
Записан
Frankenstein
Гость
« Ответ #6 : 25-02-2006 11:11 » 

Слушай, мне очень нужно грид сотворить... Не можешь кинуть парочку исходников, если не жалко?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 26-02-2006 17:35 » 

Это к разговору про самомисный грид? На Дельфи? Тут увы помочь ничем не могу. Я только на С++. Если нет, то напиши поподробнее, что ты хочешь? Хороший грид штука сложная и лучше воспользоваться готовыми решениями.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Frankenstein
Гость
« Ответ #8 : 26-02-2006 17:40 » 

Если есть исходники на СИ++, но без использования MFC и каких-либо классов (на чистом winapi), то давай - буду признателен.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 27-02-2006 00:31 » new

Нет на чистом C++ исходников у меня нет. ИМХО писать оконный интерфейс на чистом АПИ без объектов могут позволить себе только студенты и богатые программисты-любители.
Я бы рекомендовал тебе MFC, в крайнем случае WTL. А какие задачи вообще для грида? Просто таблица для отображения? Или полнофункциональный с редактором, сортировкой и тд и тп?
Если хочешь - покапайся сам, может чего и найдёшь, два самых мощных ресурса по С++:
http://www.codeguru.com
http://www.codeproject.com

Если всё-таки будешь сам "рисовать", то посмотри библиотеку gdi+ всёж полегче будет.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines