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 символов), не выводятся пустые строки--но зато выводится абракадабра.

В чём причина этого? Можно ли решить эту проблему и если да, то как её решить?
1613 г. = 2024 г.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.