2

アプリからプリンターを変更したときに、CPrintDialogのプロパティを変更したい。

カスタムCPrintDialogのOnInitDialog()でプリンター名を設定しました。

CComboBox *wndCmbBox = (CComboBox *)GetDlgItem( IDC_PER_USER );
if( wndCmbBox != NULL )
{
    wndCmbBox->SelectString( -1, s_PrinterName);
}

問題は、プリンタ名はコンボボックスで設定できますが、そのプロパティは設定されないことです。つまり、プリンタのステータス、タイプなどです。デフォルトでは、デフォルトのプリンタのプロパティが設定されています。だから、その対立。

ただし、CPrintDialogのコンボボックスからプリンターを変更すると、プリンターの選択に従ってそのプロパティが自動的に変更されます。

私はまだどこからでも解決策を見つけることができません。添付の画像を参考にしてください。

CPrintDialog

編集 codyが提案するように、アプリから選択したプリンターに従ってプリンターを変更できます。[印刷]コマンドを適用しても、選択したプリンターから印刷が行われます。これはすべてうまくいきましたが、これは問題ではありません。問題は、初めて[印刷]ダイアログを開いたとき、そのプロパティは選択したプリンターと一致しません。プリンターが私のアプリから[デフォルトのプリンター]以外で選択されている場合。

4

2 に答える 2

8

あなたはそれを誤解している。プリンタダイアログを表示し、そのコントロールをプログラムで操作して、印刷設定をカスタマイズしないでください。あなたが観察したように、それは間違いなくうまくいかないでしょう。これは、一般的なダイアログで予想される使用モデルではありません。

代わりに、ドキュメントで説明されているように、構造CPrintDialogを変更してのデフォルト値を設定します。m_pd

オブジェクトを使用するにはCPrintDialog、最初にコンストラクターを使用してオブジェクトを作成しますCPrintDialog。ダイアログボックスが作成されたら、m_pd構造内の任意の値を設定または変更して、ダイアログボックスのコントロールの値を初期化できます。m_pd構造はタイプですPRINTDLG。この構造の詳細については、WindowsSDKを参照してください。

アプリケーション全体のデフォルトプリンタをプログラムで変更することもできます。これには、ダイアログを表示する必要はまったくありません。これを行うには、SelectPrinter関数を呼び出します。これにより、新しいプリンターが設定され、以前に選択されたプリンターが解放されます。

これを行うと、印刷ダイアログが表示されるたびに、選択したプリンターが自動的に表示されます。また、選択したプリンターに関する情報を取得すると、取得する情報が正しいプリンターに適用されます。

詳細については、このMSDNの記事を参照してください:MFCでデフォルト以外のプリンターにプログラムで印刷する方法

于 2013-03-29T08:05:25.867 に答える
0

最後に、プリンタの所有権の問題を解決しました。

m_pdの前に構造を初​​期化した後、このコードを配置しましたdoModal()

HGLOBAL hDevMode = NULL;
HGLOBAL hDevNames = NULL;
if (GetPrinterDevice( CurrentPrinterName.GetBuffer(), &hDevNames, &hDevMode))
{
    AfxGetApp()->SelectPrinter(hDevNames, hDevMode);

}

hDevMode関数にとを渡しhDevNamesましたGetPrinterDevice()

副作用なしで正常に動作します。

彼らのサポートに感謝し@Cody Gray、それでも暖かい.. :)@roger_rowland

于 2013-04-06T09:03:52.283 に答える