【问题标题】:Showing an additional modeless window with C++ and WinApi使用 C++ 和 WinApi 显示附加的无模式窗口
【发布时间】:2011-11-10 09:49:02
【问题描述】:

我有一个名为 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,但不喜欢第三个参数是成员函数。我尝试将其设为 static 成员函数,但它似乎也不喜欢那样。这是说 DWORD (__stdcall *)() 与 LPTHREAD_START_ROUTINE 不兼容。

【问题讨论】:

    标签: c++ windows winapi


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多