Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Visual C++ / MFC / WTL > Программная печать текстового файла из MFC-приложения |
Автор: erslgoeirjh 28.08.17, 08:33 |
Как программно выдать на печать текстовой файл из MFC-приложения? |
Автор: KILLER 28.08.17, 09:36 |
Печать на принтер (VC++ MFC) |
Автор: erslgoeirjh 28.08.17, 14:33 |
И ещё у меня вопрос: как осуществить программную печать равноширинным текстом? |
Автор: erslgoeirjh 29.08.17, 12:13 |
И ещё вопрос. У меня строки считываются из текстового файла и выводятся на печать (фрагмент кода): <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> 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 ? |
Автор: ЫукпШ 29.08.17, 13:18 |
Цитата erslgoeirjh @ Как мне задать шрифт для принтера (например, Courier New) и размер (высоту) шрифта--например, 10 ? Поскольку ты работаешь с DC, то можно использовать функции GDI. CreateFont, SelectObject, ... О работе с принтером хорошо у Петзольда написано. Том 2, глава 15. А также Том 1, глава 4, "Метафайлы". --- Размер шрифта "10" - это, по всей вероятности, в "полиграфических пунктах" (ПП). Вертикальный размер знакоместа. ПП - это 1/72 дюйма (если я не ошибаюсь) и придётся пересчитывать её либо в пикселы, либо в мм.. Поройся в MSDN, я точно не помню, давно делал. |
Автор: erslgoeirjh 30.08.17, 13:16 |
У меня осуществляется вывод содержимого текстового файла на принтер. Вот код: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> 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--равноширинный. |
Автор: ЫукпШ 30.08.17, 18:05 |
Цитата erslgoeirjh @ Но есть один вопрос--для указания размеров шрифта (Courier New) я задал размеры 60 в высоту и 48 в ширину, вместо соответственно 10 и 8 . Потому что когда я задавала размеры шрифта 10 x 8 , у меня буквы отображались очень маленькими--где-то миллиметр высотой. В чём причины этого? Это я тебе уже рассказал. "10" - это высота знако-места не в пикселах, а в полиграфических пунктах(ПП). ПП - 1/72 дюйма. Дальше нужно определить характеристику принтера в DPI - сколько точек на дюйм. Скрытый текст <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> 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; Попробуй пересчитать и сравнить с характеристиками фонта, которые ты подобрал экспериментально. |
Автор: MaIron 27.09.17, 09:46 |
Я бы посмотрел примеры на CodeProject.com. Мне в свое время они очень помогли. Есть готовые классы. https://www.codeproject.com/Articles/89/Pri...g-Class-Library https://www.codeproject.com/Articles/14023/Quick-Print |