【问题标题】:MFC - Printing - Changing page orientation from a custom pagesetup dialogMFC - 打印 - 从自定义页面设置对话框更改页面方向
【发布时间】: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
};

再次感谢, 鳗鱼

【问题讨论】:

    标签: c++ mfc printing


    【解决方案1】:

    我想出了解决办法:

    我只需要调用 GlobalLock 来获取指向 Devmode 的指针,然后再更改当前的 DevMode。

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

    再次感谢您帮助我。

    【讨论】:

    • 这对 SDI 文档的工作方式是否相同?我试图在 SDI 应用程序中为我的打印选项获取横向模式,但第一行:LPDEVMODE pDevMode = GetDevMode(); 给了我一个错误,因为它说找不到标识符。关于让它发挥作用的任何建议?
    • GetDevMode() 是 CPrintDialog 的成员函数。尝试在打印对话框实例中操纵方向。
    【解决方案2】:

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

    【讨论】:

    • 感谢您指出这一点。事实证明,在修改 DevMode 之前,我需要使用 GlobalUnlock 获取指向 DevMode 的指针。这是我拥有的代码,它可以工作: void CustomPrintDlg::OnLandscapeChecked() { // 将当前 Devmode 设置为横向 LPDEVMODE pDevMode = GetDevMode();全局锁(pDevMode); pDevMode->dmOrientation = DMORIENT_LANDSCAPE;全局解锁(pDevMode)}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多