MFC-在显示对话框后立即执行代码(.NET等效于Form.show) 我正在对C++ MFC项目做一些小的改动。我是.NET开发人员,所以Windows编程对我来说是新的

MFC-在显示对话框后立即执行代码(.NET等效于Form.show) 我正在对C++ MFC项目做一些小的改动。我是.NET开发人员,所以Windows编程对我来说是新的,windows,mfc,dialog,Windows,Mfc,Dialog,我需要在CDialog第一次完全显示(绘制)后立即启动一些方法,但只需一次 我该怎么做?在.NET中,我将处理Form.show事件 我需要处理一些信息吗?哪个? 我需要重写一些CDialog方法吗? 还是没有简单的方法?我正在考虑处理WM_ACTIVATE,然后使用一个标志来确保我只调用另一个方法一次。在这里找到了答案: 如果你像我一样使用MFC,你需要映射WM_WINDOWPOSCHANGED,然后使用ON_消息映射WM_应用程序。有关更多详细信息,请参阅。另一种我多次成功使用的方法是使用计

我需要在CDialog第一次完全显示(绘制)后立即启动一些方法,但只需一次

我该怎么做?在.NET中,我将处理Form.show事件

我需要处理一些信息吗?哪个? 我需要重写一些CDialog方法吗? 还是没有简单的方法?我正在考虑处理WM_ACTIVATE,然后使用一个标志来确保我只调用另一个方法一次。

在这里找到了答案:


如果你像我一样使用MFC,你需要映射WM_WINDOWPOSCHANGED,然后使用ON_消息映射WM_应用程序。有关更多详细信息,请参阅。

另一种我多次成功使用的方法是使用计时器。将其设置为10毫秒。只有在显示对话框后才会触发

他会将代码放在OnPaint()中,然后在类中完全初始化bool m_。
我也喜欢计时器。。虽然我通常用100毫秒。在这些情况下,我还将所有初始化代码移出oninit。。只是为了防止太多的处理

作为参考,您不需要覆盖DlgProc来截取WM_WINDOWPOSCHANGED

   ON_WM_WINDOWPOSCHANGED()
   ON_MESSAGE(MyCDialog::MY_USER_MSG, OnDialogShown)

void MyCDialog::OnWindowPosChanged(WINDOWPOS *wndpos)
{
   __super::OnWindowPosChanged(wndpos);

   if (!mDialogShown && (wndpos->flags & SWP_SHOWWINDOW)) {
      PostMessage(MY_USER_MSG);
      mDialogShown = true;
   }
}

LRESULT MyCDialog::OnDialogShown(WPARAM, LPARAM)
{
   ...
}


如果合适,您可以实现内联处理,而不是发布另一条消息。

@Sumrak链接已断开。在Wayback机器上找不到修复程序
   ON_WM_WINDOWPOSCHANGED()
   ON_MESSAGE(MyCDialog::MY_USER_MSG, OnDialogShown)

void MyCDialog::OnWindowPosChanged(WINDOWPOS *wndpos)
{
   __super::OnWindowPosChanged(wndpos);

   if (!mDialogShown && (wndpos->flags & SWP_SHOWWINDOW)) {
      PostMessage(MY_USER_MSG);
      mDialogShown = true;
   }
}

LRESULT MyCDialog::OnDialogShown(WPARAM, LPARAM)
{
   ...
}