使用C ++和WinApi显示另一个无模式窗口

时间:2011-11-10 00:20:12

标签: c++ windows winapi

我有一个名为GUIMain的类,它为我的程序注册,创建和显示一个主窗口。在它上面是一个按钮,当用户点击它时,它会显示一个额外的窗口。

如果我是用C#编写的,我会有两个选择:

AdditionalForm myForm = new AdditionalForm();
myForm.ShowDialog(this); // blocking. Returns when myForm is closed;
someOtherFunction();

AdditionalForm myForm = new AdditionalForm();
myForm.Show(this);   // non-blocking.
someOtherFunction(); // runs while myForm is still visible

或者,即使这样也可以:

AdditionalForm myForm = new AdditionalForm();
new Thread(new ThreadStart(delegate()
  {
    myForm.ShowDialog(this);   // blocks in a separate thread
  })).Start();
someOtherFunction(); // runs while myForm is still visible   

但我是用C ++编写的,而不是C#。

我还有一个名为PreviewWindow的类,其中包含公共成员函数Register()Create()Show()。最后一个函数包含一个消息循环,它基本上使它成为阻塞调用 - 类似于C#的ShowDialog()

如何重新编写PreviewWindow::Show()以使其没有阻塞循环:

while (GetMessage(&msg, 0, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

或者,我怎样才能在一个单独的线程上调用它?

我现在有:

previewWindow = new PreviewWindow(hInstance, hWnd);

previewWindow->Register();
previewWindow->Create();
previewWindow->Show();         // blocks :(
previewWindow->DisplayImage(); // never runs.

我尝试了CreateThread,但不喜欢第3个参数是成员函数。我试过把它变成一个静态成员函数,但它似乎也不喜欢它。它说DWORD(__stdcall *)()与LPTHREAD_START_ROUTINE不兼容。

1 个答案:

答案 0 :(得分:2)

你应该只有一个事件循环,它将处理除模态窗口之外的所有窗口(它们运行自己的消息循环来阻止UI)。那么您的PreviewWindow::Show只是ShowWindow(handle, SW_SHOW);。通常应该在绝对必要时保存多线程。