私の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
};
おかげで再び、あなたのコード例ではどこにも うなぎ
それを指摘してくれてありがとう。 DevModeを変更する前に、GlobalUnlockを使ってDevModeへのポインタを取得する必要があることが分かります。ここ は、私が持っている、それが動作するコードです: 無効CustomPrintDlg :: OnLandscapeChecked(){ //風景 に現在のDevmodeを設定LPDEVMODE pDevMode = GetDevMode(); GlobalLock(pDevMode); pDevMode-> dmOrientation = DMORIENT_LANDSCAPE; GlobalUnlock(pDevMode) } – Unagi