Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)