Программная печать из MFC-приложения
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 20.07.17 09:19
Оценка:
Есть диалоговое интерфейсное MFC-приложение.
Как правильно организовать из него программную печать информации на принтер?
Re: Программная печать из MFC-приложения
От: MasterZiv СССР  
Дата: 20.07.17 13:54
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Есть диалоговое интерфейсное MFC-приложение.

RF>Как правильно организовать из него программную печать информации на принтер?

Ну там есть функционал весь, но он сосредоточен в CDocument.
По идее, можно создать документ и вызвать его печать.
Re[2]: Программная печать из MFC-приложения
От: VladFein США www.FeinSoftware.com
Дата: 20.07.17 18:28
Оценка:
Здравствуйте, MasterZiv, Вы писали:

RF>>Есть диалоговое интерфейсное MFC-приложение.

RF>>Как правильно организовать из него программную печать информации на принтер?

MZ>Ну там есть функционал весь, но он сосредоточен в CDocument.

MZ>По идее, можно создать документ и вызвать его печать.

А следующий вопрос будет про Print Preview...
Поддержка печати сделана в Document/View модели.
Самый простой способ будет переделать "диалоговое" MFC-приложение в Document/View.

Я вообще не представляю себе для чего нужны эти диалоговые проложения, кроме простейших случаев.
Re[2]: Программная печать из MFC-приложения
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 21.07.17 07:05
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Ну там есть функционал весь, но он сосредоточен в CDocument.

MZ>По идее, можно создать документ и вызвать его печать.

А структура CPrintInfo?
Re[3]: Программная печать из MFC-приложения
От: VladFein США www.FeinSoftware.com
Дата: 24.07.17 17:14
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>А структура CPrintInfo?


Самый простой способ будет переделать "диалоговое" MFC-приложение в Document/View.

Re[4]: Программная печать из MFC-приложения
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 26.07.17 09:49
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>Здравствуйте, RussianFellow, Вы писали:


RF>>А структура CPrintInfo?


VF>

VF>Самый простой способ будет переделать "диалоговое" MFC-приложение в Document/View.


В связи с этим у меня два вопроса:

1) Можно ли вывести на принтер из программы текстовую информацию без использования Document/View?
То есть имеются три строки "строка1", "строка2", "строка3" типа char* (или, допустим, типа char[80], или типа std::string). Можно ли их вывести из программы на принтер без использования Document/View ?
2) В диалоговом приложении создаётся одно из диалоговых окон (которое активизируется при нажатии кнопки в другом окне) и в котором находится многострочное текстовое поле (типа CEdit, CRichEdit или CListCtrl), в котором находится текстовая информация. Можно ли к этому диалоговому окну как-то привязать объект класса CView (или его потомка), чтобы работала печать через Document/View только для этого диалогового окна (не применяя Document/View для всего диалогового приложения)?
Re[5]: Программная печать из MFC-приложения
От: Evgeniy Skvortsov Россия  
Дата: 26.07.17 10:06
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>1) Можно ли вывести на принтер из программы текстовую информацию без использования Document/View?


Да можно всё руками отправить на печать
Примерно так:
DWORD size = MAX_PATH;
TCHAR temp[MAX_PATH];
GetDefaultPrinter(temp, &size);
 
HDC hDc = CreateDC(NULL, temp, NULL, NULL);
 
if(hDc)
{
  DOCINFO docinfo;
  docinfo.cbSize          = sizeof(docinfo);
  docinfo.lpszDocName =("Simple");
  docinfo.lpszOutput    = NULL;
  docinfo.lpszDatatype =("EMF");
  docinfo.fwType        = 0;
 
    if(StartDoc(hDc, &docinfo) > 0)
    {
        if(StartPage(hDc) > 0)
        {
    
      //нужные действия
        EndPage(hDc);
        }
    EndDoc(hDc);
    }
    }
  DeleteDC(hDc);


Нужные действия — рисуем всякие фигуры, выводим текст, всё как в обычном обработчике WM_PAINT, только там с системой координат и шрифтами надо ещё разобраться, я уже подробностей не помню.
Re[6]: Программная печать из MFC-приложения
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 26.07.17 12:23
Оценка:
Ясно, спасибо!

У меня есть программный пример, который я создал:

void CPrintSolvedNUDialog::OnBnClickedOk()
// если была нажата кнопка "Печать"
{
    // TODO: добавьте свой код обработчика уведомлений
    int  i, n;
    CString  myString;
    LPCSTR  pzText;
    DWORD  size = MAX_PATH;
    TCHAR  temp[MAX_PATH];

    m_IDC_EDIT1.GetWindowTextA(myString);
    n = myString.GetLength();
    pzText = (LPCSTR)myString;
    GetDefaultPrinter(temp,&size);
    HDC  hDC = CreateDC(NULL,temp,NULL,NULL);
    if (hDC)
    {
        DOCINFO  docinfo;
        docinfo.cbSize = sizeof(docinfo);
        docinfo.lpszDocName = "Simple";
        docinfo.lpszOutput = NULL;
        docinfo.lpszDatatype = "EMF";
        docinfo.fwType = 0;
        if (StartDoc(hDC,&docinfo)>0)
        {
            if (StartPage(hDC)>0)
            {
                TextOut(hDC,0,0,pzText,80);
                EndPage(hDC);
            }
            EndDoc(hDC);
        }
        DeleteDC(hDC);
    }
    CDialogEx::OnOK();
}


Этот пример работает. Но он работает для одной строки, находящейся в многострочном текстовом поле CEdit.
А как правильно сделать так, чтобы этот пример работал и для тех случаев, когда в текстовом поле CEdit находятся несколько строк?
Следует ли сделать цикл считывания строк из m_IDC_EDIT1 (CEdit) внутри

if (StartPage(hDC>0))
{
    //...
}


и там же выводить их на печать, или же цикл считывания строк из m_IDC_EDIT1 лучше сделать перед HDC hDC = CreateDC(NULL,temp,NULL,NULL);
--записать их в массив строк, а внутри

if (StartPage(hDC>0))
{
    //...
}


работать с этим массивом строк?

Число выводимых строк примерно равно 55--60, так что они все дожны уместиться на одном листе.
Re[7]: Программная печать из MFC-приложения
От: Слава  
Дата: 26.07.17 12:43
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>работать с этим массивом строк?

RF>Число выводимых строк примерно равно 55--60, так что они все дожны уместиться на одном листе.

Вы поищите примеры рисования с помощью GDI. Если я правильно помню, DrawText может переносить текст внутри заданной области. Можно также оценить минимально необходимый размер области с помощью функций из того же семейства.

Но вообще, это всё очень низкоуровнево и неудобно. У документа могут быть поля, они могут быть разных размеров, ориентация листа может быть разной, вы это всё обязаны учитывать. Я бы на вашем месте попытался сделать вывод в Word, или просто в RTF, или в HTML.
Re[7]: Программная печать из MFC-приложения
От: Evgeniy Skvortsov Россия  
Дата: 26.07.17 13:44
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Этот пример работает. Но он работает для одной строки, находящейся в многострочном текстовом поле CEdit.

RF>А как правильно сделать так, чтобы этот пример работал и для тех случаев, когда в текстовом поле CEdit находятся несколько строк?

Да совершенно пофиг как получать строки, просто зачем строки копировать во временный буфер? Пустая трата времени
Внутри цикла получать и тут же выводить.

Только это всё имеет смысл для действительно примитивных документов в пару строк, если структура документа предполагается хоть сколько-нибудь сложная — лучше использовать какое-то готовое средство. Генератор отчетов какой-нибудь, для MFC вроде был Crystal Reports, или перейти на doc/view, там есть вариант когда вью будет диалогом, сложностей особых не должно возникнуть.

RF>Число выводимых строк примерно равно 55--60, так что они все дожны уместиться на одном листе.


При таком подходе только хардкор — всё придется учитывать самому, размеры строк, размеры отступов, высоту шрифта и т.д.

[Добавлено]
Ещё можно вместо CEdit использовать CRichEditCtrl, у него вроде есть возможность выводить кусок текста на принтер
Отредактировано 26.07.2017 14:04 Evgeniy Skvortsov . Предыдущая версия .
Re[8]: Программная печать из MFC-приложения
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 26.07.17 14:27
Оценка:
Вот этот пример у меня работает:

заполняю мой m_IDC_EDIT1 пятью одинаковыми строками по 80 символов:

BOOL  CPrintSolvedNUDialog::OnInitDialog()
{
    char  s[1024];

    CDialog::OnInitDialog();
    strcpy(s,"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzab");
    strcat(s,"\r\n");
    strcat(s,"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzab");
    strcat(s,"\r\n");
    strcat(s,"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzab");
    strcat(s,"\r\n");
    strcat(s,"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzab");
    strcat(s,"\r\n");
    strcat(s,"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzab");
    m_IDC_EDIT1.SetWindowTextA(s);
    return TRUE;
}


и выдаю их на печать:

void CPrintSolvedNUDialog::OnBnClickedOk()
// если была нажата кнопка "Печать"
{
    // TODO: добавьте свой код обработчика уведомлений
    int  i, n, cyChar, cyPage, yPos;
    CString  myString;
    LPCSTR  pzText;
    LPTSTR  lpszText;
    DWORD  size = MAX_PATH;
    TCHAR  temp[MAX_PATH];
    TEXTMETRIC  txtm;

    m_IDC_EDIT1.GetWindowTextA(myString);
    lpszText = "";
    //n = myString.GetLength();
    n = m_IDC_EDIT1.GetLineCount();
    pzText = (LPCSTR)myString;
    GetDefaultPrinter(temp,&size);    
    HDC  hDC = CreateDC(NULL,temp,NULL,NULL);
    if (hDC)
    {
        cyPage = GetDeviceCaps(hDC,VERTRES);
        GetTextMetrics(hDC,&txtm);
        cyChar = txtm.tmHeight + txtm.tmExternalLeading;
        yPos = 0;
        DOCINFO  docinfo;
        docinfo.cbSize = sizeof(docinfo);
        docinfo.lpszDocName = "Simple";
        docinfo.lpszOutput = NULL;
        docinfo.lpszDatatype = "EMF";
        docinfo.fwType = 0;
        if (StartDoc(hDC,&docinfo)>0)
        {
            if (StartPage(hDC)>0)
            {
                //TextOut(hDC,0,0,pzText,80);
                for (i=0; i<n; i++)
                {
                    //m_IDC_EDIT1.GetLine(i,lpszText);
                    int  len = m_IDC_EDIT1.LineLength(i);
                    m_IDC_EDIT1.GetLine(i,myString.GetBuffer(len),len);
                    myString.ReleaseBuffer();
                    myString = myString + "\r\n";
                    pzText = myString.GetBuffer();
                    TextOut(hDC,0,yPos,pzText,80);
                    yPos += cyChar;
                }
                EndPage(hDC);
            }
            EndDoc(hDC);
        }
        DeleteDC(hDC);
    }
    CDialogEx::OnOK();
}


В результате выводятся на принтер пять одинаковых строк!
Re[9]: Программная печать из MFC-приложения
От: Evgeniy Skvortsov Россия  
Дата: 26.07.17 14:33
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Вот этот пример у меня работает:


Да с чего бы ему не работать?
Я о другом, что если захочется большего — начнутся проблемы.
Re[10]: Программная печать из MFC-приложения
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 27.07.17 06:53
Оценка:
Такой вопрос: как задать имя шрифта, размерность шрифта, атрибуты шрифта (обычный шрифт, толстый шрифт, наклонный шрифт), который будет выводиться на печать? И можно ли задать расстояние между строками, которые выводятся на печать?
Re[11]: Программная печать из MFC-приложения
От: peterbes Россия  
Дата: 27.07.17 08:03
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Такой вопрос: как задать имя шрифта, размерность шрифта, атрибуты шрифта (обычный шрифт, толстый шрифт, наклонный шрифт), который будет выводиться на печать? И можно ли задать расстояние между строками, которые выводятся на печать?



Создать контекст
Создать шрифт с необходимыми атрибутами
Загрузить шрифт в выполняемый контекст, получив дескриптор выгруженного объекта
Нарисовать строку/строки
Загрузить старый сохраненный дескриптор
Удалить шрифт
Удалить контекст

Ты примеры-то смотрел?
Re[11]: Программная печать из MFC-приложения
От: Evgeniy Skvortsov Россия  
Дата: 27.07.17 11:54
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Такой вопрос: как задать имя шрифта, размерность шрифта, атрибуты шрифта (обычный шрифт, толстый шрифт, наклонный шрифт), который будет выводиться на печать?


CrteateFont — там все параметры шрифта задаются.


RF> И можно ли задать расстояние между строками, которые выводятся на печать?


Конечно можно, в твоем примере расстояние между строками задается этим выражением yPos += cyChar;
Измени cyChar и будет или больше или меньше расстояние

Вообще вывод на печать практически не отличается от рисования на экране, просто в случае печати используется контекст принтера.
Re[12]: Программная печать из MFC-приложения
От: VladFein США www.FeinSoftware.com
Дата: 27.07.17 17:12
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Вообще вывод на печать практически не отличается от рисования на экране, просто в случае печати используется контекст принтера.


А белым по чёрному на принтере уже можно писать?
Re[13]: Программная печать из MFC-приложения
От: Evgeniy Skvortsov Россия  
Дата: 28.07.17 06:35
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>А белым по чёрному на принтере уже можно писать?


Сделай черный фон и рисуй белыми буквами, каки проблемы?
Re[10]: Программная печать из MFC-приложения
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 28.07.17 11:59
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Я о другом, что если захочется большего — начнутся проблемы.


Да, проблемы у меня начались.

Вот мой код:

Конструктор класса CPrintSolvedNUDialog (пустой конструктор):

CPrintSolvedNUDialog::CPrintSolvedNUDialog(CWnd* pParent /*=NULL*/)
    : CDialogEx(CPrintSolvedNUDialog::IDD, pParent)
{

}


Функция setOutputInfo класса CPrintSolvedNUDialog--передача диалогу структуры aps типа addparstruct, в которой содержится много полей, для вывода в текстовое окно диалога:

void  CPrintSolvedNUDialog::setOutputInfo(addparstruct aps)
{
    this->aps = aps;
}


Функция OnInitDialog класса CPrintSolvedNUDialog, в которой осуществляется вывод информации из структуры aps в многострочное текстовое поле (класс CEdit):

BOOL  CPrintSolvedNUDialog::OnInitDialog()
{
    char  s[7000], s2[160];
    int  i, n;
    long double  val1, val2, val3;
    string  str;

    CDialog::OnInitDialog();
    strcpy(s,"");
    strcpy(s2,"     Результаты решения краевой задачи по определению орбиты КА \r\n");
    strcat(s,s2);
    strcpy(s2," \r\n");
    strcat(s,s2);
    sprintf(s2," Мерный интервал (дата/время): %s \r\n",aps.measuresinterval);
    strcat(s,s2);
    strcpy(s2," \r\n");
    strcat(s,s2);
    sprintf(s2,"                    Использованные измерения: \r\n");
    strcat(s,s2);
    strcpy(s2," \r\n");
    strcat(s,s2);
    sprintf(s2," Виды  Рассмотрено  Включено  Распределение по времени(ET) СКО разброса (O-C) \r\n");
    n = aps.typeofmeasinterval.size();
    if (n>0)
    {
        for (i=0; i<n; i++)
        {
            str = (string)(aps.typeofmeasinterval.at(i));
            strcpy(s2,str.c_str());
            strcat(s,s2);
            strcat(s,"\r\n");
        }
    }
    sprintf(s2," Всего    %d       %d       %s \r\n",aps.nummeas,aps.nummeas,aps.measuresinterval);
    strcat(s,s2);
    strcpy(s2," \r\n");
    strcat(s,s2);
    sprintf(s2," Количество выполненных итераций: %d \r\n",aps.nummeas);
    strcat(s,s2);
    strcpy(s2," \r\n");
    strcat(s,s2);
    sprintf(s2," Согласование измерений: sigma0 = %.6f \r\n");
    strcat(s,s2);
    strcpy(s2," \r\n");
    strcat(s,s2);
    sprintf(s2,"                Уточнённые НУ         Поправки к исходным НУ   СКО НУ (1 sigma) \r\n");
    strcat(s,s2);
    strcpy(s2," \r\n");
    strcat(s,s2);
    sprintf(s2," tНУ       %s\r\n",aps.stNU);
    strcat(s,s2);
    sprintf(s2," x(км)     %.15le     %.15le   %.9le \r\n",aps.x,aps.deltax,aps.SKOx);
    strcat(s,s2);
    sprintf(s2," y(км)     %.15le     %.15le   %.9le \r\n",aps.y,aps.deltay,aps.SKOy);
    strcat(s,s2);
    sprintf(s2," z(км)     %.15le     %.15le   %.9le \r\n",aps.z,aps.deltaz,aps.SKOz);
    strcat(s,s2);
    sprintf(s2," Vx(км)    %.15le     %.15le   %.9le \r\n",aps.Vx,aps.deltaVx,aps.SKOVx);
    strcat(s,s2);
    sprintf(s2," Vy(км)    %.15le     %.15le   %.9le \r\n",aps.Vy,aps.deltaVy,aps.SKOVy);
    strcat(s,s2);
    sprintf(s2," Vz(км)    %.15le     %.15le   %.9le \r\n",aps.Vz,aps.deltaVz,aps.SKOVz);
    strcat(s,s2);
    n = aps.Sbarray.size();
    if (n>0)
    {
        // вывод Sb
    }
    n = aps.kappaarray.size();
    if (n>0)
    {
        // вывод kappa;
    }
    n = aps.Vimparray.size();
    if (n>0)
    {
        for (i=0; i<n/3; i++)
        {
            val1 = (long double)(aps.Vimparray.at(i*3));
            val2 = (long double)(aps.Vimparray.at(i*3+1));
            val3 = (long double)(aps.Vimparray.at(i*3+2));
            sprintf(s2," dV%dx(м/с)  %.15le    %.15le   %.9le \r\n",i+1,val1,val2,val3);
            strcat(s,s2);
        }
    }
    sprintf(s2," \r\n");
    strcat(s,s2);
    sprintf(s2,"Среднеквадратические ошибки в орбитальной системе RNB \r\n");
    strcat(s,s2);
    strcpy(s2," \r\n");
    strcat(s,s2);
    sprintf(s2," sigma r(км)  sigma n(км)  sigma b(км)  sigmaVr(м/с) sigmaVn(м/с) sigmaVb(м/с) \r\n");
    strcat(s,s2);
    sprintf(s2," %.5le  %.5le  %.5le %.5le  %.5le  %.5le \r\n",aps.sigmar,aps.sigman,aps.sigmab,aps.sigmaVr,aps.sigmaVn,aps.sigmaVb);
    strcat(s,s2);
    strcpy(s2," \r\n");
    strcat(s,s2);
    sprintf(s2,"          Уточнение элементов орбиты \r\n");
    strcat(s,s2);
    strcpy(s2," \r\n");
    strcat(s,s2);
    sprintf(s2," a(км)   %.15le   %.9le     %.9le \r\n",aps.a,aps.deltaa,aps.SKOa);
    strcat(s,s2);
    sprintf(s2," e       %.15le   %.9le     %.9le \r\n",aps.e,aps.deltae,aps.SKOe);
    strcat(s,s2);
    sprintf(s2," i(град) %.15le   %.9le     %.9le \r\n",aps.ild,aps.deltaild,aps.SKOild);
    strcat(s,s2);
    sprintf(s2," W(град) %.15le   %.9le     %.9le \r\n",aps.Omega,aps.deltaOmega,aps.SKOOmega);
    strcat(s,s2);
    sprintf(s2," w(град) %.15le   %.9le     %.9le \r\n",aps.omega,aps.deltaomega,aps.SKOomega);
    strcat(s,s2);
    sprintf(s2," tpi       %s      %.4fs               %.4fs \r\n",aps.stpi,aps.deltaperiod,aps.SKOtpi);
    strcat(s,s2);
    sprintf(s2," Период         %s         %.4fs               %.4fs \r\n",aps.period,aps.deltaperiod,aps.SKOperiod);
    strcat(s,s2);
    strcpy(s2," \r\n");
    strcat(s,s2);
    sprintf(s2,"                 Корреляционная матрица элементов Kq \r\n");
    strcat(s,s2);
    sprintf(s2,"           a           e           i           W           w          tpi \r\n");
    strcat(s,s2);
    sprintf(s2," a   %.7f  %.7f  %.7f  %.7f  %.7f  %.7f \r\n",aps.covmatr[0],aps.covmatr[1],aps.covmatr[2],aps.covmatr[3],aps.covmatr[4],aps.covmatr[5]);
    strcat(s,s2);
    sprintf(s2," e   %.7f  %.7f  %.7f  %.7f  %.7f  %.7f \r\n",aps.covmatr[6],aps.covmatr[7],aps.covmatr[8],aps.covmatr[9],aps.covmatr[10],aps.covmatr[11]);
    strcat(s,s2);
    sprintf(s2," i   %.7f  %.7f  %.7f  %.7f  %.7f  %.7f \r\n",aps.covmatr[12],aps.covmatr[13],aps.covmatr[14],aps.covmatr[15],aps.covmatr[16],aps.covmatr[17]);
    strcat(s,s2);
    sprintf(s2," W   %.7f  %.7f  %.7f  %.7f  %.7f  %.7f \r\n",aps.covmatr[18],aps.covmatr[19],aps.covmatr[20],aps.covmatr[21],aps.covmatr[22],aps.covmatr[23]);
    strcat(s,s2);
    sprintf(s2," w   %.7f  %.7f  %.7f  %.7f  %.7f  %.7f \r\n",aps.covmatr[24],aps.covmatr[25],aps.covmatr[26],aps.covmatr[27],aps.covmatr[28],aps.covmatr[29]);
    strcat(s,s2);
    sprintf(s2," tpi %.7f  %.7f  %.7f  %.7f  %.7f  %.7f \r\n",aps.covmatr[30],aps.covmatr[31],aps.covmatr[32],aps.covmatr[33],aps.covmatr[34],aps.covmatr[35]);
    strcat(s,s2);
    m_IDC_EDIT1.SetWindowTextA(s);
    return TRUE;
}


Функция OnBnClickedOk класса CPrintSolvedNUDialog--в неё осуществляется вывод информации, находящейся в многострочном текстовом поле (класс CEdit) на принтер:

void CPrintSolvedNUDialog::OnBnClickedOk()
// если была нажата кнопка "Печать"
{
    // TODO: добавьте свой код обработчика уведомлений
    int  i, n, cyChar, cyPage, yPos;
    CString  myString;
    LPCSTR  pzText;
    LPTSTR  lpszText;
    DWORD  size = MAX_PATH;
    TCHAR  temp[MAX_PATH];
    TEXTMETRIC  txtm;

    m_IDC_EDIT1.GetWindowTextA(myString);
    lpszText = "";
    //n = myString.GetLength();
    n = m_IDC_EDIT1.GetLineCount();
    pzText = (LPCSTR)myString;
    GetDefaultPrinter(temp,&size);    
    HDC  hDC = CreateDC(NULL,temp,NULL,NULL);
    if (hDC)
    {
        cyPage = GetDeviceCaps(hDC,VERTRES);
        GetTextMetrics(hDC,&txtm);
        cyChar = txtm.tmHeight + txtm.tmExternalLeading;
        yPos = 0;
        DOCINFO  docinfo;
        docinfo.cbSize = sizeof(docinfo);
        docinfo.lpszDocName = "Simple";
        docinfo.lpszOutput = NULL;
        docinfo.lpszDatatype = "EMF";
        docinfo.fwType = 0;
        if (StartDoc(hDC,&docinfo)>0)
        {
            if (StartPage(hDC)>0)
            {
                //TextOut(hDC,0,0,pzText,80);
                for (i=0; i<n; i++)
                {
                    //m_IDC_EDIT1.GetLine(i,lpszText);
                    int  len = m_IDC_EDIT1.LineLength(i);
                    if (len>0)
                    {
                        m_IDC_EDIT1.GetLine(i,myString.GetBuffer(len),len);
                        myString.ReleaseBuffer();
                    }
                    else
                        myString = " ";
                    myString = myString + "\r\n";
                    pzText = myString.GetBuffer();
                    TextOut(hDC,0,yPos,pzText,90);
                    yPos += cyChar;
                }
                EndPage(hDC);
            }
            EndDoc(hDC);
        }
        DeleteDC(hDC);
    }
    CDialogEx::OnOK();
}


И проблема заключается в следующем: вместо нормального вывода строк у меня на печать выводится что-то типа

Результаты решения краевой задачи по определению орбиты КА Мерный интер?ээээ<<<<<<<<<<<<<<<< ъ;М}фWNet Provider Class<<<<<<<<<<<<<<<<<<<<
Мерный интервал (дата/время): 2017.04.22/01:06: 9.184 — 2017.0ээээ<<<<<<<<<<<<<<<<ою?ээээ<<<<<<<< ъ;М}фWNet Provider Class<<<<<<<<
D | 1452HHHHHHHHHHHээээ<<<<<<<<ою
V | 1452HHHHHHHHHHH<<<<<<<<ээээ<<<<<<<<ою
?ээээ<<<<<<<< ъ;М{фWNet Provider Class


То есть у меня не выводятся правильно на печать переходы на новые строки, строки не всегда выводятся полностью (хотя длина любой из выводимых строк меньше 80 символов), не выводятся пустые строки--но зато выводится абракадабра.

В чём причина этого? Можно ли решить эту проблему и если да, то как её решить?
Re[11]: Программная печать из MFC-приложения
От: Evgeniy Skvortsov Россия  
Дата: 28.07.17 13:36
Оценка:
Здравствуйте, RussianFellow, Вы писали:

Ошибка скорее всего в твоих адских выкрутасах с получением строк.
Я попытался собрать этот кусок, но он даже не компилируется, там куча ошибок, как у тебя это запускается, я
(наверно у тебя проект не юникодный)

Запусти под отладчиком и посмотри что оказывается в pzText перед вызовом TextOut.
Отредактировано 28.07.2017 14:03 Evgeniy Skvortsov . Предыдущая версия . Еще …
Отредактировано 28.07.2017 13:59 Evgeniy Skvortsov . Предыдущая версия .
Re[11]: Программная печать из MFC-приложения
От: qaz77  
Дата: 29.07.17 13:41
Оценка:
Здравствуйте, RussianFellow, Вы писали:
RF>То есть у меня не выводятся правильно на печать переходы на новые строки, строки не всегда выводятся полностью (хотя длина любой из выводимых строк меньше 80 символов), не выводятся пустые строки--но зато выводится абракадабра.

                    int  len = m_IDC_EDIT1.LineLength(i);
                    if (len>0)
                    {
                        m_IDC_EDIT1.GetLine(i,myString.GetBuffer(len),len);
                        myString.ReleaseBuffer();
                    }
                    else
                        myString = " ";
                    myString = myString + "\r\n"; // <- это лишнее
                    pzText = myString.GetBuffer();
                    TextOut(hDC,0,yPos,pzText,len); // <- здесь надо указать длину строки, а не 90
Отредактировано 29.07.2017 13:42 qaz77 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.