Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.222.69.152] |
|
Сообщ.
#1
,
|
|
|
Как программно выдать на печать текстовой файл из MFC-приложения?
|
Сообщ.
#2
,
|
|
|
Сообщ.
#3
,
|
|
|
И ещё у меня вопрос: как осуществить программную печать равноширинным текстом?
|
Сообщ.
#4
,
|
|
|
И ещё вопрос. У меня строки считываются из текстового файла и выводятся на печать (фрагмент кода):
if (StartDoc(hDC,&docinfo)>0) { if (StartPage(hDC)>0) { f = fopen("results.txt","rt"); while (!feof(f)) { fgets(s,256,f); len = strlen(s); pzText = (LPCSTR)s; TextOut(hDC,0,yPos,pzText,len); yPos += cyChar; } fclose(f); EndPage(hDC); } EndDoc(hDC); } Как мне задать шрифт для принтера (например, Courier New) и размер (высоту) шрифта--например, 10 ? |
Сообщ.
#5
,
|
|
|
Цитата erslgoeirjh @ Как мне задать шрифт для принтера (например, Courier New) и размер (высоту) шрифта--например, 10 ? Поскольку ты работаешь с DC, то можно использовать функции GDI. CreateFont, SelectObject, ... О работе с принтером хорошо у Петзольда написано. Том 2, глава 15. А также Том 1, глава 4, "Метафайлы". --- Размер шрифта "10" - это, по всей вероятности, в "полиграфических пунктах" (ПП). Вертикальный размер знакоместа. ПП - это 1/72 дюйма (если я не ошибаюсь) и придётся пересчитывать её либо в пикселы, либо в мм.. Поройся в MSDN, я точно не помню, давно делал. |
Сообщ.
#6
,
|
|
|
У меня осуществляется вывод содержимого текстового файла на принтер.
Вот код: void CPrintSolvedNUDialog::OnBnClickedOk() // если была нажата кнопка "Печать" { // TODO: добавьте свой код обработчика уведомлений int i, n, len, cyChar, cyPage, yPos; char s[256]; CString myString; LPCSTR pzText; LPTSTR lpszText; DWORD size = MAX_PATH; TCHAR temp[MAX_PATH]; TEXTMETRIC txtm; LOGFONT lf; FILE *f; CPrintDialog cp(FALSE); if (cp.DoModal()==IDOK) { CDC printDC; printDC.Attach(cp.GetPrinterDC()); cyPage = printDC.GetDeviceCaps(VERTRES); printDC.GetTextMetrics(&txtm); cyChar = txtm.tmHeight + txtm.tmExternalLeading; yPos = 0; DOCINFO docinfo; ::ZeroMemory(&docinfo,sizeof(DOCINFO)); docinfo.cbSize = sizeof(docinfo); docinfo.lpszDocName = "Simple"; docinfo.lpszOutput = NULL; docinfo.lpszDatatype = "RAW"; docinfo.fwType = 0; CFont *savedFont; savedFont = printDC.GetCurrentFont(); savedFont->GetLogFont(&lf); strcpy(lf.lfFaceName,"Courier New"); lf.lfHeight = 60; // 60 вместо 10 lf.lfWidth = 48; // 48 вместо 8 CFont myFont; myFont.CreateFontIndirectA(&lf); printDC.SelectObject(&myFont); if (printDC.StartDoc(&docinfo)>0) { if (printDC.StartPage()>0) { f = fopen("results.txt","rt"); while (!feof(f)) { fgets(s,256,f); len = strlen(s); pzText = (LPCSTR)s; printDC.TextOutA(0,yPos,pzText,len); yPos += cyChar; } fclose(f); printDC.EndPage(); } printDC.EndDoc(); } printDC.SelectObject(savedFont); printDC.Detach(); } CDialogEx::OnOK(); } Печать на принтер идёт, печатается нужным мне размером. Но есть один вопрос--для указания размеров шрифта (Courier New) я задал размеры 60 в высоту и 48 в ширину, вместо соответственно 10 и 8 . Потому что когда я задавала размеры шрифта 10 x 8 , у меня буквы отображались очень маленькими--где-то миллиметр высотой. В чём причины этого? Я работаю под Window 7 , среда разработки MS Visual Studio 2012, принтер HP LAserJet M1522n . Если программу перенести на другую машину, с другой версией Windows (например, Windows XP) и с другим принтером, то размер выводимого текста на принтере будет таким же, как и у меня, или же он, вообще говоря, будет другим? Как сделать так, чтобы текстовой файл у меня печатался на разных принтерах с одинаковым размером? Шрифт Courier New--равноширинный. |
Сообщ.
#7
,
|
|
|
Цитата erslgoeirjh @ Но есть один вопрос--для указания размеров шрифта (Courier New) я задал размеры 60 в высоту и 48 в ширину, вместо соответственно 10 и 8 . Потому что когда я задавала размеры шрифта 10 x 8 , у меня буквы отображались очень маленькими--где-то миллиметр высотой. В чём причины этого? Это я тебе уже рассказал. "10" - это высота знако-места не в пикселах, а в полиграфических пунктах(ПП). ПП - 1/72 дюйма. Дальше нужно определить характеристику принтера в DPI - сколько точек на дюйм. Скрытый текст xlpPrinter = ::GetDeviceCaps (hdcPrn, LOGPIXELSX); // пикселей на дюйм; ylpPrinter = ::GetDeviceCaps (hdcPrn, LOGPIXELSY); // пикселей на дюйм; xlpDisplay = ::GetDeviceCaps (hscreen, LOGPIXELSX); // пикселей на дюйм; ylpDisplay = ::GetDeviceCaps (hscreen, LOGPIXELSY); // пикселей на дюйм; Это характеристика конкретного устройства, для каждого может быть своя. Значит, можно вывести формулу: h[pix] = (H[pp] / 72) * K[dpi] ; Вот с этой высотой и нужно создавать фонт. Если необходим вывод в другое устройство - напрмер на экран, c целью предварительного просмотра - то тогда в формулу придётся подставлять его К[dpi] и создавать подходящий фонт. Для "правильного" округления формулу лучше модифицировать: h[pix] = ((H[pp] * K[dpi]) + 36) / 72; Попробуй пересчитать и сравнить с характеристиками фонта, которые ты подобрал экспериментально. |
Сообщ.
#8
,
|
|
|
Я бы посмотрел примеры на CodeProject.com. Мне в свое время они очень помогли.
Есть готовые классы. https://www.codeproject.com/Articles/89/Pri...g-Class-Library https://www.codeproject.com/Articles/14023/Quick-Print |