MFC - Печать - Изменение ориентации страницы из настраиваемого диалогового окна - PullRequest
0 голосов
/ 01 февраля 2011

Я разрабатываю пользовательский диалог печати и настройки страницы, используя 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
};

Еще раз спасибо, Унаги

Ответы [ 2 ]

1 голос
/ 04 февраля 2011

Я нашел решение:

Все, что мне нужно, это вызвать GlobalLock для получения указателя на Devmode перед изменением текущего DevMode.

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

Еще раз спасибо за помощь.

0 голосов
/ 02 февраля 2011

Нигде в вашем примере кода вы не показываете, как вы создаете DC для печати.Когда вы вызываете CreateDC, вы должны передать указатель на структуру DEVMODE;это определяет, будет ли печать портретной или альбомной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...