【问题标题】:Handling multiple windows WIN32 API处理多个windows WIN32 API
【发布时间】:2009-11-10 13:18:15
【问题描述】:

你好 我正在尝试在包含多个窗口的 Win32 环境中创建一个应用程序。 我怎么做?我在网上找到的所有 Win32 教程都只展示了如何管理一个窗口。 如何创建第二个窗口,以及如何一起处理它们的消息? (我知道我应该只有一个消息循环)

感谢!

丹

【问题讨论】:

    标签: winapi loops message


    【解决方案1】:

    您的消息循环为在当前线程上创建的所有窗口获取并分派消息。

    这样一个简单的消息循环就足够了。

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

    否则,要在线程上创建窗口,您只需根据需要/需要多次调用 CreateWindow(...) 来构建您的 UI。

    警告:在许多简单程序中常见的模式是在 WindowProc 中处理 WM_DESTROY 以调用 PostQuitMessage()。 PostQuitMessage() 向线程发送一条消息,告诉消息循环退出。这将终止应用程序,销毁线程上的所有窗口。如果你有一个主应用程序窗口,如果关闭,应该退出应用程序,只有那个窗口应该调用 PostQuitMessage。如果您有两个(或更多)可以按任意顺序关闭的窗口,那么您需要保持打开窗口的计数,并仅在用户关闭最后一个窗口时调用 PostQuitMessage。

    确实,任何演示对话框的示例程序也演示了如何在线程上创建多个窗口,因为对话框上的每个控件也是一个带有 windowproc 的窗口。

    许多新的 Windows 开发人员陷入了试图为特定窗口过滤消息的陷阱:

      while(GetMessage(&msg,hwnd,0,0,0)...
    

    这是错误的,因为它会阻止任何子窗口获取它们的消息。许多实用程序库将在线程上创建隐藏窗口并使用它们从其他进程/线程接收消息 - 仅过滤应用程序窗口的消息会导致消息队列增长,并且其他事情会以奇怪的不寻常方式失败.将 NULL 传递给 hwnd,直到您完全理解为什么您可能要暂时过滤特定窗口的消息。

    【讨论】:

      【解决方案2】:

      所以你要创建一个子窗口对吗?您必须决定要创建哪种类型的窗口 - 有两种类型:模态(也称为对话框)和非模态。

      只需寻找 CreateDialog、DialogBox 和 CreateWindow 函数

      您必须为新的模式窗口提供一个 wndproc,而无模式窗口使用与主窗口相同的 wndproc。

      对不起,如果我弄错了什么,很久以前我编写了原始 WinAPI..

      【讨论】:

      • 您好,感谢您的快速回复!正如你所说,我添加了一个窗口作为子窗口 - 但我看到我的 WndProc 只被父窗口的 HWND 调用一次。我的理想是让 WndProc 被调用两次,并在其中进行切换以找出我正在处理的 HWND。这可能吗?我必须用自己的 Wndproc 创建另一个窗口吗?非常感谢
      猜你喜欢
      • 2012-10-08
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 2010-10-25
      相关资源
      最近更新 更多