【发布时间】:2011-02-01 18:56:53
【问题描述】:
我正在为我的 Win32 程序使用 MFC 和 VS2008 开发自定义打印对话框和页面设置。由于代码是遗留代码,我无法从 MFC 视图/文档架构中获得太多优势。结果,我完全从头开始编写了打印代码。
我设置了 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
};
再次感谢, 鳗鱼
【问题讨论】: