当打印机从我的应用程序更改时,我想更改CPrintDialog的属性。
我在自定义CPrintDialog的OnInitDialog()中设置了打印机名称。
CComboBox *wndCmbBox = (CComboBox *)GetDlgItem( IDC_PER_USER );
if( wndCmbBox != NULL )
{
wndCmbBox->SelectString( -1, s_PrinterName);
}
问题是,可以在组合框中设置打印机名称,但不设置其属性。 我的意思是说打印机状态,类型等... 默认情况下,默认打印机的属性设置。所以,它的冲突。
但是,如果我从CPrintDialog的组合框中更改了打印机,则会根据打印机选择自动更改其属性。
我从任何地方找到任何解决方案。请参阅我附上的图片。
修改 正如cody建议的那样,我可以从我的应用程序中按照所选打印机更改打印机,即使我应用打印命令,然后从所选打印机打印,这一切都很顺利, 但这不是问题,问题是,在第一次打开“打印”对话框时,如果从我的应用程序中选择默认打印机,则其属性与所选打印机不匹配。
答案 0 :(得分:7)
你做错了。您应该不通过显示打印机对话框并以编程方式操作其控件来自定义打印设置。这肯定会出错,就像你已经观察到的那样。这不是常用对话框的预期使用模型。
相反,通过修改CPrintDialog
结构来设置m_pd
的默认值,如the documentation中所述:
要使用
CPrintDialog
对象,首先使用CPrintDialog
构造函数创建对象。构建对话框后,您可以设置或修改m_pd
结构中的任何值以初始化对话框控件的值。m_pd
结构的类型为PRINTDLG
。有关此结构的详细信息,请参阅Windows SDK。
您还可以以编程方式更改整个应用程序的默认打印机。这不需要显示任何对话框。为此,请调用SelectPrinter
功能。这将设置一台新打印机并释放先前选择的打印机。
完成此操作后,无论何时显示打印对话框,它都会自动将指定的打印机显示为已选择。当您检索有关所选打印机的信息时,您将检索的信息将应用于正确的打印机。
在此MSDN文章中查找更多信息:How to programmatically print to a non-default printer in MFC
答案 1 :(得分: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
的支持.. :)