MFC - 打印 - 从自定义页面设置对话框更改页面方向

时间:2011-02-01 18:56:54

标签: c++ mfc printing

我正在为我的Win32程序使用MFC和VS2008开发自定义打印对话框和页面设置。由于代码是遗留的,我无法从MFC视图/ 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;
}

自定义打印对话框类的pseucode:

class CustomPrintDlg: public CPrintDialog {

  ...   // just override some methods from CPrintDialog
};

再次感谢, 鳗鱼

2 个答案:

答案 0 :(得分:1)

我找到了解决方案:

我需要的是在更改当前DevMode之前调用GlobalLock获取指向Devmode的指针。

void CustomPrintDlg::OnLandscapeChecked()
{
      // set the current Devmode to landscape
      LPDEVMODE pDevMode = GetDevMode();
      GlobalLock(pDevMode);
      pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
      GlobalUnlock(pDevMode)
}

再次感谢您的帮助。

答案 1 :(得分:0)

您的示例代码中没有任何地方显示您是如何创建用于打印的DC的。调用CreateDC时,必须将指针传递给DEVMODE结构;这定义了打印是纵向还是横向。