模态对话框继续添加文本

C++ Modal dialog box continuing adding texts

本文关键字:文本 添加 继续 对话框 模态      更新时间:2023-10-16

我有一个对话框,在它里面,它有OK和Cancel按钮,然后它也有一个ListBox来显示两列的文本。我想在对话框显示后继续向列表框中添加文本。我该怎么做呢?因为在我调用DoModal()来显示对话框之后,代码没有继续执行。或者我应该创建两个线程(一个是显示对话框,而另一个线程继续添加文本到对话框)?

让你的对话框'拉'它需要的数据,也许每秒钟轮询数据源与窗口消息,或每100毫秒左右。或者,如果你走"两个线程"路线(更好但更复杂的选项),让你的数据源在有新数据时向你的对话框发送一个窗口消息,然后让对话框获取它需要的数据。这样做的原因是,使用现有的CDialog基础结构来获得一个行为像实际对话框的窗口要容易得多,而不是构建一个行为像对话框但不是真正的模态窗口。

如果你选择两个线程的路线,你的分工应该是:一个线程做所有的UI工作(包括显示对话框),另一个线程"生成"数据并让UI知道何时有新数据。所以工作线程不应该做任何与UI相关的事情,也不应该直接调用对话框上的任何方法——你不能从多个线程访问窗口。唯一的跨线程窗口通信应该通过窗口消息进行(即,使用::SendMessage())。所以当然不要做一些像myDialog->m_theList.AddString("blah")从另一个线程,或类似的东西。

显示对话框会在关闭对话框之前暂停进一步的执行。而不是显示它的模态,显示它的正常,但使它始终在顶部,所以你可以继续执行代码后,调用DoModal()。或者,在调用DoModal()之前,在框中填充所需的所有信息。

如果你决定采用"两个线程"的方法,你会发现MFC对话框上的控件不应该从创建对话框的线程以外的线程更新或访问。即使在另一个线程中有指向这些控件的指针,访问它们也不是线程安全的。无论对话框是否为模态,该规则都适用。

相反,您的第二个线程需要向对话框窗口发送PostMessage或SendMessage,因此更新发生在创建对话框的线程上(很可能是应用程序的主UI线程)。