MFC – 在显示对话框后立即执行代码(Form.Shown的.NET等价物)

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

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

我怎样才能做到这一点? 在.NET中,我将处理Form.Shown事件。

我需要处理一些消息吗? 哪一个? 我是否需要重写一些CDialog方法? 还是有没有简单的方法? 我想处理WM_ACTIVATE,然后使用一个标志,以确保我只调用另一个方法一次。

Solutions Collecting From Web of "MFC – 在显示对话框后立即执行代码(Form.Shown的.NET等价物)"

在这里找到答案: 等到显示对话框之后再做一些事情

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。 有关更多详细信息,请参阅此CodeProject文章 。

我用了很多次,取得了很大的成功的另一种方法是使用计时器。 设置为10m0s。 只有在显示对话框后才会触发。

地狱把代码放在OnPaint()中,然后在你的班级中使用bool m_fullyInitilized。 我也喜欢这个计时器。虽然我通常会用100ms。 在这种情况下,我也把所有的initinit代码移出oninit。只是为了防止在那里处理太多。