【发布时间】:2013-03-10 22:51:43
【问题描述】:
我正在使用 MyPrintDialog 扩展的 CPrintDialog。 问题是: MyPrintDialog 的 OnInitDialog() 方法在应用程序第一次尝试打开打印对话框时不会被调用。
我正在尝试通过 OnInitDialog() 方法在打印对话框中设置打印机名称。 打印机名称由用户在我要用于打印的应用程序中指定。
我的 OnInitDialog() 方法
CComboBox *wndCmbBox = (CComboBox *)GetDlgItem( IDC_PER_USER ); /*IDC_PER_USER which is ID of Prin Dialog combo */
if( wndCmbBox != NULL )
{
wndCmbBox->SelectString( -1, PrinterName );
}
或者是他们在打印对话框中设置用户选择打印机名称的任何方式..?
请解释一下。
编辑
是的,我的意思是 onInit() OnInitDialog()
我正在使用 VS 2012 和 Win7 32 位。我只在第一次拨打DoModel() 时遇到这个问题。下一个连续的DoModel() 方法调用OnInitDialog()。
我已经调试了问题并发现了一些东西
INT_PTR CALLBACK AfxDlgProc(HWND hWnd, UINT message, WPARAM, LPARAM)
{
if (message == WM_INITDIALOG)
{
// special case for WM_INITDIALOG
CDialog* pDlg = DYNAMIC_DOWNCAST(CDialog, CWnd::FromHandlePermanent(hWnd));
if (pDlg != NULL)
return pDlg->OnInitDialog();
else
return 1;
}
return 0;
}
以上是dlgcore.cpp的功能。当问题被重现时,我观察到DYNAMIC_DOWNCAST 返回NULL。
请注意,我自定义了 CPrintDialog 并在其中添加了一个复选框。我怀疑它是否会造成问题。
【问题讨论】:
-
您能说明您何时以及如何创建模态对话框吗?
-
另外,如果您使用提供的 CPrintDialog 而不是您的自定义版本,它的行为方式是否也相同?那么,您是否确认您的自定义不应受到责备?
-
请在this位置找到文件
-
我看不到任何明显的东西,尽管在你重写的 OnInitDialog() 中你应该调用 CPrintDialog::OnInitDialog() first 而不是在你的代码之后。如果只使用 CPrintDialog 而不是 CCustomPrintDlg 会发生什么?
标签: c++ windows visual-c++ mfc