【发布时间】:2011-07-02 14:00:07
【问题描述】:
我想在 MFC 中创建对话框后创建一个线程。 Windows 是否提供了任何函数并在OnInitDialog 之后自动调用,以便我可以在其中创建线程?
【问题讨论】:
标签: c++ windows winapi mfc dialog
我想在 MFC 中创建对话框后创建一个线程。 Windows 是否提供了任何函数并在OnInitDialog 之后自动调用,以便我可以在其中创建线程?
【问题讨论】:
标签: c++ windows winapi mfc dialog
您可以简单地在OnInitDialog 函数中创建您的线程。没有理由通过搜索不同的函数或将初始化代码分成两部分来使事情变得过于复杂。 (还有没有任何这样的功能,因为没有发送相应的 Windows 消息。)
如果您想在创建线程之前在屏幕上显示对话框,您可以使用ShowWindow function 手动显示它。例如:
ShowWindow(SW_SHOW);
RedrawWindow();
另见 Raymond Chen 的这篇文章:Waiting until the dialog box is displayed before doing something
【讨论】:
CenterWindow(),因为调用 ShowWindow 会导致出现左上角的对话框。
_AfxPostInitDialog 中,该函数在 OnInitDialog 之后运行。如果OnInitDialog 函数没有改变对话框的坐标,_AfxPostInitDialog 实际上会调用CenterWindow。但是明确地调用它也不会受到伤害,所以不管怎样都行。只需确保将其置于合理的位置,同时考虑到多显示器系统。始终以主显示器为中心将是错误的决定。 :-)
OnInitDialog() 是初始化时调用的主函数(响应WM_CREATE)。
你为什么不能在那里创建你的线程?
【讨论】:
OnInitDialog 不是为了响应WM_INITDIALOG 而调用的吗?
我已将线程优先级更改为低于正常值,并且当线程第一次执行时,我将线程设置为正常优先级。这工作正常。感谢您的回复。
【讨论】:
多年来对在 MFC 对话框应用程序(最喜欢的游乐场)中绘制第一个视图图形的 OnTimer 解决方案感到不满意之后,这似乎是一个不错的简单解决方案:-
计时器意味着应用程序在图形发生之前已经存在了一段时间,并且显然 hscroll 优先发生在 WM_PAINT 消息之后,该消息会将图片元素擦除为空白状态,删除在 initdialog 期间绘制的任何内容。
BOOL CSpecDlg::OnInitDialog()
{
...
PostMessage(WM_HSCROLL,0, (LPARAM)NULL);
return TRUE; // return TRUE unless you set the focus to a control
}
void CSpecDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
if (pScrollBar==NULL)
{
plot();
}
CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
【讨论】: