MFC - 在显示对话框后立即执行代码(.NET等效于Form.Shown)

时间:2008-11-06 17:04:49

标签: windows mfc dialog

我正在对C ++ MFC项目做一些小改动。我是.NET开发人员,所以Windows编程对我来说是新的。

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

我该怎么做?在.NET中,我会处理 Form.Shown 事件。

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

4 个答案:

答案 0 :(得分:3)

在这里找到答案:Waiting until the dialog box is displayed before doing something

Short story:
INT_PTR CALLBACK
DlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
  switch (uiMsg) {

  case WM_INITDIALOG:
    return TRUE;

  case WM_WINDOWPOSCHANGED:
    if ((((WINDOWPOS*)lParam)->flags & SWP_SHOWWINDOW) &&
        !g_fShown) {
      g_fShown = TRUE;
      PostMessage(hwnd, WM_APP, 0, 0);
    }
    break;


  case WM_APP:
      MessageBox(hwnd,
                 IsWindowVisible(hwnd) ? TEXT("Visible")
                                       : TEXT("Not Visible"),
                 TEXT("Title"), MB_OK);
      break;

  case WM_CLOSE:
   EndDialog(hwnd, 0);
   break;
  }

  return FALSE;
}

如果您像我一样使用MFC,则需要映射WM_WINDOWPOSCHANGED,然后使用ON_MESSAGE映射WM_APP。有关详细信息,请参阅this CodeProject article

答案 1 :(得分:1)

作为参考,您无需重写DlgProc即可拦截WM_WINDOWPOSCHANGED。

fig, ax = plt.subplots()
df['Price'].plot(ax=ax)
# Plot a vertical yellow line at each date whose Alignment is -1
[ax.axvline(x, c='y') for x in df[df['Alignment'] == -1].index]

您可以实现内联处理,而不是在适当的时候发布其他消息。

答案 2 :(得分:0)

我已经多次使用并取得巨大成功的另一种方法是使用计时器。设置为10分钟。它只会在显示对话框后触发。

答案 3 :(得分:0)

地狱把代码放在OnPaint()中,然后在你的班级里给你一个bool m_fullyInitilized。 我也喜欢这个计时器..虽然我通常会用100毫秒。在这些情况下,我还将所有启动代码移出oninit ..只是为了防止在那里进行太多处理。