【问题标题】:CPrintDialog::OnInitDialog does not get called every timeCPrintDialog::OnInitDialog 不会每次都被调用
【发布时间】: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


【解决方案1】:

如果你的意思是说OnInitDialog() 而不是OnInit(),那么this MSKB article 可能解释了你的问题,尽管它似乎在VC6 SP1 之后得到了修复。

【讨论】:

  • 我尝试了你的建议。但这并没有解决问题。请参阅编辑部分了解更多详情。
  • 您的编辑并不表明您尝试了 Roger 的建议... 设置消息挂钩时出了什么问题?你还记得静态链接到 MFC 吗?
  • 我已经尝试过 Roger 的建议。即使在设置钩子并静态链接到 MFC 之后,也不会第一次调用 onInitDialog()。
猜你喜欢
  • 2015-10-05
  • 2013-04-27
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多