2011-02-01 21 views
0

私のWin32プログラム用にカスタム印刷ダイアログとページ設定をMFCとVS2008を使って開発しています。コードは従来のものなので、MFCのビュー/ドキュメントのアーキテクチャを活用することはできません。その結果、私は最初から完全に印刷コードを書きました。MFC - 印刷 - カスタムページ設定ダイアログからページの向きを変更する

私はCPrintInfoをセットアップし、カスタム印刷ダイアログボックスをインスタンス化し、作成したばかりのCPrintInfoにこのダイアログボックスをフックします。カスタム印刷ダイアログが表示されたら、ユーザーがページの向きを切り替えるためのラジオボタンがあります。何らかの理由で、私は実行時に現在のDEVMODEを変更できませんでした。結果として、私が印刷したすべてのページはポートレートとして終了します。

カスタム印刷ダイアログのイベントハンドラから手動でpDevMode-> dmOrientationをDMORIENT_LANDSCAPEに設定しても、印刷結果はまだポートレートとして終了します。私は実際になぜこれが起きているのか、また印刷ダイアログがアップしたあとにDevModeを修正する方法がわかりません。

ご協力いただきありがとうございます。これは、ユーザーが横にあるラジオボタンを切り替えたとき

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 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 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

1

私は解決策を考え出した:

私が必要とするのは、現在からDevModeを変更する前のDevmodeへのポインタを取得するGlobalLockを呼び出すことです。

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

+1

GetDevMode()はCPrintDialogのメンバー関数です。印刷ダイアログインスタンス内で方向を操作しようとします。 – Unagi

+0

ええ、それは私のために働いた。あなたの返信をありがとう。 – Neophile

関連する問題