Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Visual C++ / MFC / WTL > Программное задание ориентации печати


Автор: erslgoeirjh 13.09.17, 06:07
Я вывожу текст на печать через CPrinterDC. Перед печать у меня появляется диалог для настроек печати. В этом диалоге настроек я задаю ориентацию печати альбомную, потому что у меня широкие строки.
Можно ли задать настройку ориентации печати программно, чтобы пользователю не приходилось каждый раз задавать ориентацию печати в диалоге?
Можно ли это сделать средствами CPrinterDC? Если можно, то как? Если нельзя сделать это с помощью CPrinterDC, то как сделать это другим способом при помощи MFC?

Автор: ter_nk_ 13.09.17, 06:41
DEVMODE structure

Автор: erslgoeirjh 13.09.17, 08:43
Цитата ter_nk_ @

А не могли бы Вы привести пример кода, в котором CPrinterDC использует DEVMODE ?

Автор: ter_nk_ 13.09.17, 08:55
c PrintDlg

https://www.experts-exchange.com/questions/...lg-by-code.html

Автор: erslgoeirjh 13.09.17, 13:07
Я использовал структуру DEVMODE, однако у меня программа печатает текст в книжной ориентации, а не в альбомной. Вот код:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    void CBroachDialog::OnBnClickedButton4()
    // если была нажата кнопка "Печать"
    {
        // TODO: добавьте свой код обработчика уведомлений
        int  i, j, n, len, cyChar, cyPage, yPos, strcount, numobj, cmindex;
        long double  val;
        char  s[256], shelp[80];
        CString  myString;
        LPCSTR  pzText;
        LPTSTR  lpszText;
        DWORD  size = MAX_PATH;
        TCHAR  temp[MAX_PATH];
        TEXTMETRIC  txtm;
        LOGFONT lf, lf2;
        CFont  myFont, myFont2;
        FILE *f;
     
        strcount = 0;
        numobj = 0; // отладочный вариант
        CPrintDialog  cp(FALSE);
        if (cp.DoModal()==IDOK)
        {
            DEVMODE*  lpDevMode = (DEVMODE*)::GlobalLock(cp.GetDevMode());
            lpDevMode->dmOrientation = DMORIENT_LANDSCAPE;
            //::GlobalUnlock(cp.GetDevMode());
            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);
            savedFont->GetLogFont(&lf2);
                strcpy(lf.lfFaceName,"Courier New");
                //lf.lfHeight = 60;
            lf.lfHeight = 110;
                lf.lfWidth = 52;
            //CFont  myFont;
            myFont.CreateFontIndirectA(&lf);
            lf2.lfHeight = 115;
            lf2.lfWidth = 52;
            myFont2.CreateFontIndirectA(&lf2);
            printDC.SelectObject(&myFont);
            _set_output_format(_TWO_DIGIT_EXPONENT);
            if (printDC.StartDoc(&docinfo)>0)
            {
                if (printDC.StartPage()>0)
                {
                    strcpy(s,"Результаты протяжки полученных условий");
                    len = strlen(s);
                    pzText = (LPCSTR)s;
                    printDC.TextOutA(0,yPos,pzText,len);
                    yPos += cyChar;
                    sprintf(s,"объекта № %d на время %s",numobj,sdatetime);
                    len = strlen(s);
                    pzText = (LPCSTR)s;
                    printDC.TextOutA(0,yPos,pzText,len);
                    yPos += cyChar;
                    strcpy(s," ");
                    len = strlen(s);
                    pzText = (LPCSTR)s;
                    printDC.TextOutA(0,yPos,pzText,len);
                    yPos += cyChar;
                    strcpy(s,"Протянутый вектор-состояния от уточнённых начальных условий:");
                    len = strlen(s);
                    pzText = (LPCSTR)s;
                    printDC.TextOutA(0,yPos,pzText,len);
                    yPos += cyChar;
                    sprintf(s,"X = %.16le",rv0[0].x*AE);
                    len = strlen(s);
                    pzText = (LPCSTR)s;
                    printDC.TextOutA(0,yPos,pzText,len);
                    yPos += cyChar;
                    sprintf(s,"Y = %.16le",rv0[0].y*AE);
                    len = strlen(s);
                    pzText = (LPCSTR)s;
                    printDC.TextOutA(0,yPos,pzText,len);
                    yPos += cyChar;
                    sprintf(s,"Z = %.16le",rv0[0].z*AE);
                    len = strlen(s);
                    pzText = (LPCSTR)s;
                    printDC.TextOutA(0,yPos,pzText,len);
                    yPos += cyChar;
                    sprintf(s,"Vx = %.16le",rv0[1].x*AE/DAY);
                    len = strlen(s);
                    pzText = (LPCSTR)s;
                    printDC.TextOutA(0,yPos,pzText,len);
                    yPos += cyChar;
                    sprintf(s,"Vy = %.16le",rv0[1].y*AE/DAY);
                    len = strlen(s);
                    pzText = (LPCSTR)s;
                    printDC.TextOutA(0,yPos,pzText,len);
                    yPos += cyChar;
                    sprintf(s,"Vz = %.16le",rv0[1].z*AE/DAY);
                    len = strlen(s);
                    pzText = (LPCSTR)s;
                    printDC.TextOutA(0,yPos,pzText,len);
                    yPos += cyChar;
                    if (Sb>0.0)
                    {
                        sprintf(s,"Sb = %.16le",Sb);
                        len = strlen(s);
                        pzText = (LPCSTR)s;
                        printDC.TextOutA(0,yPos,pzText,len);
                        yPos += cyChar;
                    }
                    if (kappa>0.0)
                    {
                        sprintf(s,"kappa = %.16le",kappa);
                        len = strlen(s);
                        pzText = (LPCSTR)s;
                        printDC.TextOutA(0,yPos,pzText,len);
                        yPos += cyChar;
                    }
                    strcpy(s," ");
                    len = strlen(s);
                    pzText = (LPCSTR)s;
                    printDC.TextOutA(0,yPos,pzText,len);
                    yPos += cyChar;
                    strcpy(s,"Ковариационная матрица:");
                    len = strlen(s);
                    pzText = (LPCSTR)s;
                    printDC.TextOutA(0,yPos,pzText,len);
                    yPos += cyChar;
                    cmindex = 0;
                    if (covmatr.size()>0)
                    {
                        for (i=0; i<dim; i++)
                        {
                            strcpy(s,"");
                            if (i>0)
                            {
                                for (j=0; j<i; j++)
                                {
                                    sprintf(shelp,"                   ");
                                    strcat(s,shelp);
                                }
                            }
                            for (j=i; j<dim; j++)
                            {
                                val = (long double)(covmatr.at(cmindex));
                                sprintf(shelp,"%.10le   ",val);
                                strcat(s,shelp);
                                cmindex++;
                            }
                            len = strlen(s);
                            pzText = (LPCSTR)s;
                            printDC.TextOutA(0,yPos,pzText,len);
                            yPos += cyChar;
                       }
                    }
                    printDC.EndPage();
                }
                printDC.EndDoc();
            }
            printDC.SelectObject(savedFont);
            printDC.Detach();
            ::GlobalUnlock(cp.GetDevMode());
        }
    }


Как сделать так, чтобы программа печатала в альбомной ориентации?

Автор: ter_nk_ 13.09.17, 13:50
Не знаю, может этот класс MFC как-то позволяет настройку менять.

Добавлено
Вот пример из мсдн https://msdn.microsoft.com/ru-ru/library/t5...ror=-2147217396

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