如何更新无模式对话框

时间:2014-05-09 11:02:06

标签: c++ mfc

我在一个单独的线程中运行了一个无模式对话框。我想从我的主程序更新此对话框。我尝试创建自定义消息UPDATE = 0x8001(在此范围内WM_APP - 0xBFFF)和该消息的关联处理程序并调用postthreadmessage()。但这不起作用。我的代码看起来像这样。

int _tmain(int argc, _TCHAR* argv[])
{
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), SW_SHOW))
    {
        std::cout<<"Fatal Error: MFC initialization failed\n";
    }
    else
    {   
        std::thread th2(ModelessThreadFunc);
        DWORD thid = GetThreadId(th2.native_handle());
        std::cout<<PostThreadMessage(thid,UPDATE,0,0);
        th2.join(); 
    }
    return 0;
}

int ModelessThreadFunc()
{
    dialog *dial = new dialog;
    assert(dial->Create(dialog::IDD));
    dial->ShowWindow(SW_SHOWNORMAL);
    MSG msg;
     while((::GetMessage(&msg, NULL, 0,0) != 0))
     {
           ::peekmessage(&msg,NULL,0x8000,0x8002,0x0001);       
       ::TranslateMessage(&msg);
           ::DispatchMessage(&msg);

     }

    return 0;
}

任何人都能解释上述逻辑的问题吗?我的目标是在其线程之外更新对话框。欢迎任何更多的想法。谢谢。

1 个答案:

答案 0 :(得分:1)

如果目标线程创建任何窗口,则会记录PostThreadMessage失败。你应该PostMessage到对话框HWND。您可能还需要使用AfxBeginThread而不是std :: thread,因为您需要内置于CWinThread的MFC消息泵。

通常,不建议您采用的方法。所有GUI都应该在主线程中,而辅助线程用于耗时的操作。这避免了许多尴尬的问题。