2011-02-01 53 views
0

我正在爲我的Win32程序開發使用MFC和VS2008的自定義打印對話框和頁面設置。由於代碼是遺留的,我不能從MFC視圖/文檔體系結構中獲得太多優勢。因此,我完全從頭開始編寫打印代碼。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; 
} 

用於自定義打印對話框類pseucode:再次

class CustomPrintDlg: public CPrintDialog { 

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

感謝, 鰻魚

回答

0

無處在你的示例代碼,你表達你的創造DC進行打印。當你調用CreateDC時,你必須傳遞一個指向DEVMODE結構的指針;這定義了打印是縱向還是橫向。

+0

謝謝你指出。事實證明,在修改DevMode之前,我需要使用GlobalUnlock獲取指向DevMode的指針。 這裏是我的代碼和它的工作原理: 空隙CustomPrintDlg :: OnLandscapeChecked() { //設置當前DEVMODE爲橫向 LPDEVMODE pDevMode = GetDevMode(); GlobalLock(pDevMode); pDevMode-> dmOrientation = DMORIENT_LANDSCAPE; GlobalUnlock(pDevMode) } – Unagi 2011-02-04 03:31:14

1

我想出瞭解決方案:

所有我需要的是調用GlobalLock改變當前DevMode的前獲得一個指向DEVMODE。

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

再次感謝您的幫助。

+0

這對SDI文檔的工作方式是否相同?我試圖在SDI應用程序中爲我的打印選項獲取橫向模式,但是第一行:`LPDEVMODE pDevMode = GetDevMode();`給我一個錯誤,因爲它表示找不到標識符。任何建議讓這個工作? – Neophile 2012-01-16 09:54:25

相關問題