На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Программная печать текстового файла из MFC-приложения
    Как программно выдать на печать текстовой файл из MFC-приложения?
        И ещё у меня вопрос: как осуществить программную печать равноширинным текстом?
          И ещё вопрос. У меня строки считываются из текстового файла и выводятся на печать (фрагмент кода):

          ExpandedWrap disabled
            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 ?
            Цитата erslgoeirjh @
            Как мне задать шрифт для принтера (например, Courier New) и размер (высоту) шрифта--например, 10 ?

            Поскольку ты работаешь с DC, то можно использовать функции GDI.
            CreateFont, SelectObject, ...
            О работе с принтером хорошо у Петзольда написано. Том 2, глава 15. А также Том 1, глава 4, "Метафайлы".
            ---
            Размер шрифта "10" - это, по всей вероятности, в "полиграфических пунктах" (ПП).
            Вертикальный размер знакоместа.
            ПП - это 1/72 дюйма (если я не ошибаюсь) и придётся пересчитывать её либо в пикселы,
            либо в мм.. Поройся в MSDN, я точно не помню, давно делал.
            Сообщение отредактировано: ЫукпШ -
              У меня осуществляется вывод содержимого текстового файла на принтер.
              Вот код:

              ExpandedWrap disabled
                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--равноширинный.
                Цитата erslgoeirjh @
                Но есть один вопрос--для указания размеров шрифта (Courier New) я задал размеры 60 в высоту и 48 в ширину, вместо соответственно 10 и 8 . Потому что когда я задавала размеры шрифта 10 x 8 , у меня буквы отображались очень маленькими--где-то миллиметр высотой.
                В чём причины этого?

                Это я тебе уже рассказал.
                "10" - это высота знако-места не в пикселах, а в полиграфических пунктах(ПП).
                ПП - 1/72 дюйма.
                Дальше нужно определить характеристику принтера в DPI - сколько точек на дюйм.
                Скрытый текст

                ExpandedWrap disabled
                   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;

                Попробуй пересчитать и сравнить с характеристиками фонта, которые ты подобрал
                экспериментально.
                Сообщение отредактировано: ЫукпШ -
                  Я бы посмотрел примеры на CodeProject.com. Мне в свое время они очень помогли.
                  Есть готовые классы.

                  https://www.codeproject.com/Articles/89/Pri...g-Class-Library

                  https://www.codeproject.com/Articles/14023/Quick-Print
                  Сообщение отредактировано: MaIron -
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0306 ]   [ 17 queries used ]   [ Generated: 19.04.24, 15:49 GMT ]