2

当打印机从我的应用程序更改时,我想更改 CPrintDialog 的属性。

我在自定义 CPrintDialog 的 OnInitDialog() 中设置了打印机名称。

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

问题是,打印机名称可以在组合框中设置,但它的属性没有设置。我的意思是说打印机状态、类型等……默认情况下,默认打印机的属性集。所以,它的冲突。

但是,如果我从 CPrintDialog 的组合框中更改了打印机,那么它的属性会根据打印机选择自动更改。

我力图从任何地方找到任何解决方案。请参考我附上的图片。

C打印对话框

编辑 正如科迪建议的那样,我可以从我的应用程序中根据选定的打印机更改打印机,即使我应用打印命令,然后从选定的打印机打印,这一切都很好,但这不是问题,问题是,在第一次打开“打印”对话框时,其属性与所选打印机不匹配,如果选择的打印机不是我的应用程序中的默认打印机。

4

2 回答 2

8

你这样做是不对的。您不应通过显示打印机对话框和以编程方式操作其控件来自定义打印设置。这肯定会出错,就像你观察到的那样。这不是普通对话框的预期使用模型。

CPrintDialog相反,通过修改其结构来设置默认值m_pd,如文档中所述

要使用CPrintDialog对象,首先使用CPrintDialog构造函数创建对象。构建对话框后,您可以设置或修改m_pd结构中的任何值以初始化对话框控件的值。结构m_pd是类型。PRINTDLG有关此结构的详细信息,请参阅 Windows SDK。

您还可以以编程方式更改整个应用程序的默认打印机。这根本不需要显示任何对话框。为此,请调用该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);

}

我已经在函数中传递了hDevModeand 。hDevNamesGetPrinterDevice()

它工作正常,没有任何副作用。

仍然热烈感谢他们@Cody Gray@roger_rowland支持..:)

于 2013-04-06T09:03:52.283 回答