Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.180.175] |
|
Сообщ.
#1
,
|
|
|
Я вывожу текст на печать через CPrinterDC. Перед печать у меня появляется диалог для настроек печати. В этом диалоге настроек я задаю ориентацию печати альбомную, потому что у меня широкие строки.
Можно ли задать настройку ориентации печати программно, чтобы пользователю не приходилось каждый раз задавать ориентацию печати в диалоге? Можно ли это сделать средствами CPrinterDC? Если можно, то как? Если нельзя сделать это с помощью CPrinterDC, то как сделать это другим способом при помощи MFC? |
Сообщ.
#2
,
|
|
|
Сообщ.
#3
,
|
|
|
А не могли бы Вы привести пример кода, в котором CPrinterDC использует DEVMODE ? |
Сообщ.
#4
,
|
|
|
Сообщ.
#5
,
|
|
|
Я использовал структуру DEVMODE, однако у меня программа печатает текст в книжной ориентации, а не в альбомной. Вот код:
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()); } } Как сделать так, чтобы программа печатала в альбомной ориентации? |
Сообщ.
#6
,
|
|
|
Не знаю, может этот класс MFC как-то позволяет настройку менять.
Добавлено Вот пример из мсдн https://msdn.microsoft.com/ru-ru/library/t5...ror=-2147217396 |