Я разрабатываю пользовательский диалог печати и настройки страницы, используя MFC и VS2008 для моей программы Win32.Поскольку код унаследован, я не могу извлечь большую пользу из архитектуры MFC view / doc.В результате я написал код печати полностью с нуля.
Я настраиваю CPrintInfo, создаю экземпляр своего диалогового окна для пользовательской печати и подключаю это диалоговое окно к только что созданному CPrintInfo.Когда мой пользовательский диалог печати открыт, у меня есть переключатель, позволяющий пользователю переключать ориентацию страницы.По некоторым причинам я не смог изменить текущий DEVMODE во время выполнения.В результате каждая страница, которую я печатаю, будет отображаться как портрет.
Даже если я вручную установлю pDevMode-> dmOrientation на DMORIENT_LANDSCAPE из обработчика событий диалогового окна пользовательской печати, результат печати по-прежнему будет отображаться какпортрет.Я действительно не уверен, почему это происходит и как изменить DevMode после открытия диалогового окна печати.
Заранее благодарю за любую помощь.
Вот код, который у меня есть:
void PrintSomething(CWnd* currentWnd) {
// Create CPrintInfo
CPrintInfo* pPrintInfo = new CPrintInfo;
SetupPrintInfo(pPrintInfo); // simply setup some member variables of CPrintInfo
// Create a custom print dialog
CustomPrintDlg* pCustomPrtDlg = new CustomPrintDlg(FALSE, PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS
| PD_HIDEPRINTTOFILE | PD_NOSELECTION, pPrintInfo, currentWnd);
SetupPrintDialog(pPrintInfo,pCustomPrtDlg);
if ( AfxGetApp()->DoPrintDialog(pCustomPrtDlg) == IDOK ) {
... // proceed a print loop
}
}
Код для настройки диалогового окна пользовательской печати:
void SetupPrintDialog(CPrintInfo* pPrintInfo,CustomPrintDlg* pCustomPrtDlg) {
delete pInfo->m_pPD;
pInfo->m_pPD = pCustomPrtDlg;
pInfo->m_pPD->m_pd.hInstance = AfxGetInstanceHandle();
pInfo->m_pPD->m_pd.lpPrintTemplateName = MAKEINTRESOURCE(IDD_CUSTOM_PRTDLG);
// Set the Flags of the PRINTDLG structure as shown, else the
// changes will have no effect.
pInfo>m_pPD->m_pd.Flags |= PD_ENABLEPRINTTEMPLATE;
// Set the page range.
pInfo>m_pPD->m_pd.nMinPage = 1; // one based page numbers.
pInfo>m_pPD->m_pd.nMaxPage = 0xffff; // how many pages is unknown.
}
Когда пользователь переключает переключатель в положение «Пейзаж», эта функция вызывается:
void CustomPrintDlg::OnLandscapeChecked() {
// set the current Devmode to landscape
LPDEVMODE pDevMode = GetDevMode();
GlobalUnlock(pDevMode);
pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
}
Псевдок для пользовательского класса диалогового окна печати:
class CustomPrintDlg: public CPrintDialog {
... // just override some methods from CPrintDialog
};
Еще раз спасибо, Унаги