Программное задание ориентации печати
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 12.09.17 05:33
Оценка:
Я вывожу текст на печать через CPrinterDC. Перед печать у меня появляется диалог для настроек печати. В этом диалоге настроек я задаю ориентацию печати альбомную, потому что у меня широкие строки.
Можно ли задать настройку ориентации печати программно, чтобы пользователю не приходилось каждый раз задавать ориентацию печати в диалоге?
Можно ли это сделать средствами CPrinterDC? Если можно, то как? Если нельзя сделать это с помощью CPrinterDC, то как сделать это другим способом при помощи MFC?
1613 г. = 2024 г.
Re: Программное задание ориентации печати
От: SergeyOsipov Россия  
Дата: 12.09.17 05:39
Оценка:
Здравствуйте, RussianFellow, Вы писали:

ты работаешь в режиме "день в месяц"? Просто те вопросы по печати, которые ты задаешь последние полгода, по идее решаются за неделю тем кто начал разбираться в печати в MFC.
Re: Программное задание ориентации печати
От: qaz77  
Дата: 14.09.17 23:09
Оценка:
Здравствуйте, RussianFellow, Вы писали
RF>Можно ли задать настройку ориентации печати программно, чтобы пользователю не приходилось каждый раз задавать ориентацию печати в диалоге?
RF>Можно ли это сделать средствами CPrinterDC? Если можно, то как? Если нельзя сделать это с помощью CPrinterDC, то как сделать это другим способом при помощи MFC?

Это задается не в DC, а в DEVMODE.
Почитай MSDN о режимах принтеров в Windows (там количество копий и т.п.).
Re[2]: Программное задание ориентации печати
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 15.09.17 07:46
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>Это задается не в DC, а в DEVMODE.

Q>Почитай MSDN о режимах принтеров в Windows (там количество копий и т.п.).

А где использовать этот DEVMODE? Не могли бы Вы привести фрагмент кода или дать ссылку на это использование?
1613 г. = 2024 г.
Re[3]: Программное задание ориентации печати
От: qaz77  
Дата: 21.09.17 12:50
Оценка:
Здравствуйте, RussianFellow, Вы писали:
RF>А где использовать этот DEVMODE? Не могли бы Вы привести фрагмент кода или дать ссылку на это использование?

Посмотреть пример можно в описании CWinApp::GetPrinterDeviceDefaults:
https://msdn.microsoft.com/en-us/library/t5799e1d.aspx
Re: Как избавиться от диалога выбора/настроек принтера?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 04.10.17 11:38
Оценка:
И ещё вопрос: можно ли организовать программную печать информации таким образом, чтобы не выскакивал диалог выбора/настроек принтера? (С помощью функции TextOut или как-то ещё).
То есть чтобы пользователь нажал на кнопку "Печать", расположенную на диалоговом окне приложения, и тут же бы произошла печать, без всяких диалогов настроек или выбора принтера?
1613 г. = 2024 г.
Re[2]: Как избавиться от диалога выбора/настроек принтера?
От: Nikolaz Германия www.nikeware.com
Дата: 04.10.17 13:36
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>То есть чтобы пользователь нажал на кнопку "Печать", расположенную на диалоговом окне приложения, и тут же бы произошла печать, без всяких диалогов настроек или выбора принтера?


CPrintInfo в помощь.

BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
   pInfo->m_bDirect = TRUE; // TRUE if bypassing Print Dialog

 ...

   return CView::OnPreparePrinting(pInfo);
}


А вообще-то по-больше читайте документацию, а то мы так с вашей "помощью" всю справку по MFC заново процитируем здесь на РСДН .

з.ы. Можно вопрос. Зачем вам этот труп MFC?
Я понимаю ещё поддержка старых проектов, но делать что-то новое на MFC
Re[3]: Как избавиться от диалога выбора/настроек принтера?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 04.10.17 14:30
Оценка:
Всё хорошо, но что делать, если у меня обычное диалоговое оконное приложение, а не приложение типа "документ-представление" (document-view)?
То есть у меня нет никаких CView или их потомков?
1613 г. = 2024 г.
Re[4]: Как избавиться от диалога выбора/настроек принтера?
От: Nikolaz Германия www.nikeware.com
Дата: 04.10.17 14:45
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Всё хорошо, но что делать, если у меня обычное диалоговое оконное приложение, а не приложение типа "документ-представление" (document-view)?

RF>То есть у меня нет никаких CView или их потомков?
Я не телепат. Догадаться, что у вас там за код, который "стоит" за нажатием этой самой кнопки, я не могу.
Пройдитесь отладчиком вглубь. Посмотрите что и как вызывается. Половина вопросов отпадёт само собой. Вторая половина будет более конкретной.

Удачи!
Re[4]: Как избавиться от диалога выбора/настроек принтера?
От: VladFein США  
Дата: 04.10.17 17:28
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Всё хорошо, но что делать, если у меня обычное диалоговое оконное приложение, а не приложение типа "документ-представление" (document-view)?

RF>То есть у меня нет никаких CView или их потомков?

http://rsdn.org/forum/mfc/6849112.1
Автор: VladFein
Дата: 24.07.17
Re[5]: Как избавиться от диалога выбора/настроек принтера?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 06.10.17 11:48
Оценка:
Вот мой псевдокод:

void  CMyDialog::OnBnClickedButton1
{
    CDC  printDC;
    defaultPrinter = получение_принтера_используемого_по_умолчанию;
    printDC.Attach(defaultPrinter);
    задание_альбомной_ориентации_печати;
    cyPage = printDC.GetDeviceCaps(VERTRES);
    printDC.GetTextMetrics(&txtm);
    cyChar = txtm.tmHeight + txtm.tmExternalLeading;
    yPos = 800;
    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(&lt);
    strcpy(lt.ltFaceName,"Courier New");
    lf.lfHeight = 110;
    lf.lfWidth = 52;
    myFont.CreateFontIndirect(&lf);
    printDC.SelectObject(&myFont);
    if (printDC.StartDoc(&docinfo)>0)
    {
        if (printDC.StartPage()>0)
        {
            sprintf(s,"Тест");
            len = strlen(s);
            pzText = (LPCSTR)s;
            printDC.TextOut(320,yPos,pzText,len);
            yPos += cyChar;
            printDC.EndPage();
        }
        printDC.EndDoc();
    }
    printDC.Detach();
}


То есть берётся принтер, используемый по умолчанию, задаётся альбомная ориентация печати и на печать выводится строка "Тест".

Весь вопрос состоит в том, что нужно написать в коде вместо

defaultPrinter = получение_принтера_используемого_по_умолчанию;


и

задание_альбомной_ориентации_печати;

?
1613 г. = 2024 г.
Re[6]: Как избавиться от диалога выбора/настроек принтера?
От: Lexsus Россия  
Дата: 06.10.17 14:28
Оценка:
Здравствуйте, RussianFellow, Вы писали:



RF>
RF>defaultPrinter = получение_принтера_используемого_по_умолчанию;
RF>


RF>и


RF>
RF>задание_альбомной_ориентации_печати;
RF>

RF>?

Вот так попробуй:
void CPage::SetPrinterMode(CDC* pDC,int Mode)
{
    if(Mode !=DMORIENT_LANDSCAPE && Mode != DMORIENT_PORTRAIT)
        return;
    PRINTDLG* pPrintDlg = new PRINTDLG;
    AfxGetApp()->GetPrinterDeviceDefaults(pPrintDlg);
    DEVMODE* lpDevMode = (DEVMODE*)::GlobalLock(pPrintDlg->hDevMode);        
    lpDevMode->dmOrientation = (short)Mode;
    pDC->ResetDC(lpDevMode);    
    ::GlobalUnlock(pPrintDlg->hDevMode);    
    delete pPrintDlg;
}
Re[7]: Как избавиться от диалога выбора/настроек принтера?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 09.10.17 07:21
Оценка:
Здравствуйте, Lexsus, Вы писали:

L>Вот так попробуй:

L>
L>void CPage::SetPrinterMode(CDC* pDC,int Mode)
L>{
L>    if(Mode !=DMORIENT_LANDSCAPE && Mode != DMORIENT_PORTRAIT)
L>        return;
L>    PRINTDLG* pPrintDlg = new PRINTDLG;
L>    AfxGetApp()->GetPrinterDeviceDefaults(pPrintDlg);
L>    DEVMODE* lpDevMode = (DEVMODE*)::GlobalLock(pPrintDlg->hDevMode);        
L>    lpDevMode->dmOrientation = (short)Mode;
    pDC->>ResetDC(lpDevMode);    
L>    ::GlobalUnlock(pPrintDlg->hDevMode);    
L>    delete pPrintDlg;
L>}
L>


У меня на строке
pDC->ResetDC(lpDevMode);

бьётся программа с сообщением:

Debug Assertion Failed
Program: C:\Windows\system32\mfc110d.dll
File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl
Line: 737


Что это означает? Как исправить эту ошибку?
1613 г. = 2024 г.
Re[8]: Как избавиться от диалога выбора/настроек принтера?
От: Lexsus Россия  
Дата: 09.10.17 07:35
Оценка:
Здравствуйте, RussianFellow, Вы писали:

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


L>>Вот так попробуй:

L>>
L>>void CPage::SetPrinterMode(CDC* pDC,int Mode)
L>>{
L>>    if(Mode !=DMORIENT_LANDSCAPE && Mode != DMORIENT_PORTRAIT)
L>>        return;
L>>    PRINTDLG* pPrintDlg = new PRINTDLG;
L>>    AfxGetApp()->GetPrinterDeviceDefaults(pPrintDlg);
L>>    DEVMODE* lpDevMode = (DEVMODE*)::GlobalLock(pPrintDlg->hDevMode);        
L>>    lpDevMode->dmOrientation = (short)Mode;
    pDC->>>ResetDC(lpDevMode);    
L>>    ::GlobalUnlock(pPrintDlg->hDevMode);    
L>>    delete pPrintDlg;
L>>}
L>>


RF>У меня на строке

RF>
pDC->>ResetDC(lpDevMode);
RF>

RF> бьётся программа с сообщением:

RF>

RF>Debug Assertion Failed
RF>Program: C:\Windows\system32\mfc110d.dll
RF>File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl
RF>Line: 737


RF>Что это означает? Как исправить эту ошибку?

SetPrinterMode откуда вызываешь?
Re[9]: Как избавиться от диалога выбора/настроек принтера?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 09.10.17 08:03
Оценка:
Здравствуйте, Lexsus, Вы писали:

RF>>Что это означает? Как исправить эту ошибку?

L>SetPrinterMode откуда вызываешь?

Из функции
CPage::OnBnClickedButton1()
:

CPage::OnBnClickedButton1()
{
    CDC  printDC;
    setPrinterMode(&printDC,DMORIENT_LANDSCAPE);
    // дальнейшие действия;
}
1613 г. = 2024 г.
Re[10]: Как избавиться от диалога выбора/настроек принтера?
От: Lexsus Россия  
Дата: 09.10.17 09:20
Оценка:
Здравствуйте, RussianFellow, Вы писали:

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


RF>>>Что это означает? Как исправить эту ошибку?

L>>SetPrinterMode откуда вызываешь?

RF>Из функции
CPage::OnBnClickedButton1()
:


RF>
RF>CPage::OnBnClickedButton1()
RF>{
RF>    CDC  printDC;
RF>    setPrinterMode(&printDC,DMORIENT_LANDSCAPE);
RF>    // дальнейшие действия;
RF>}
RF>

Тебе как то надо получить контекст печати CDC и передать в setPrinterMode. В приложение Document/View это можно сделать переопределим OnBeginPrinting например.
Re[11]: Как избавиться от диалога выбора/настроек принтера?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 09.10.17 09:47
Оценка:
Здравствуйте, Lexsus, Вы писали:

L>Тебе как то надо получить контекст печати CDC и передать в setPrinterMode. В приложение Document/View это можно сделать переопределим OnBeginPrinting например.


А что делать в обычном диалоговом приложении? Можно ли в нём получить контекст печати CDC, соответствующему принтеру по умолчанию, а потом уже передать его в функцию setPrinterMode?
1613 г. = 2024 г.
Re[12]: Как избавиться от диалога выбора/настроек принтера?
От: Nikolaz Германия www.nikeware.com
Дата: 09.10.17 12:33
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>А что делать в обычном диалоговом приложении?

"Курить" MSDN: BOOL CWinApp::GetPrinterDeviceDefaults(struct tagPDA* pPrintDlg);

Ну и далее:
typedef struct tagPD {
  DWORD           lStructSize;
  HWND            hwndOwner;
  HGLOBAL         hDevMode;
  HGLOBAL         hDevNames;
  HDC             hDC;
  DWORD           Flags;
  WORD            nFromPage;
  WORD            nToPage;
  WORD            nMinPage;
  WORD            nMaxPage;
  WORD            nCopies;
  HINSTANCE       hInstance;
  LPARAM          lCustData;
  LPPRINTHOOKPROC lpfnPrintHook;
  LPSETUPHOOKPROC lpfnSetupHook;
  LPCTSTR         lpPrintTemplateName;
  LPCTSTR         lpSetupTemplateName;
  HGLOBAL         hPrintTemplate;
  HGLOBAL         hSetupTemplate;
} PRINTDLG, *LPPRINTDLG;
Re[12]: Как избавиться от диалога выбора/настроек принтера?
От: Arsen.Shnurkov  
Дата: 09.10.17 13:52
Оценка:
RF>А что делать в обычном диалоговом приложении? Можно ли в нём получить контекст печати CDC, соответствующему принтеру по умолчанию, а потом уже передать его в функцию setPrinterMode?

Можно. Тебе надо прочитать книжку
http://www.charlespetzold.com/pw5/
"This book has a whole chapter on printing (chapter 13, to be exact): what is a printing device context, what is DEVCAPS, printing dialogs etc."

Нашел в гугле. Я только одного не могу понять, зачем тебе мёртвый MFC, если есть живой Qt.
Re[13]: Как избавиться от диалога выбора/настроек принтера?
От: Privalov  
Дата: 10.10.17 06:44
Оценка:
Здравствуйте, Arsen.Shnurkov, Вы писали:

AS>Можно. Тебе надо прочитать книжку

AS>http://www.charlespetzold.com/pw5/

Он однажды нашел ссылку на русский перевод этой книги. Правда, некоторое время спустя, об этом забыл. Потому что начал просить на него ссылку.
https://rsdn.org/forum/winapi/6720399.1
Автор: Privalov
Дата: 09.03.17
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.