gpt4 book ai didi

c++ - 具有多个窗口的应用程序作为类的实例,C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:27:44 26 4
gpt4 key购买 nike

我写了一个应用程序。有一个名为 APP 的,带有窗口句柄,里面有消息循环,以及所有这些东西。

它旨在“运行”此类的一些对象,每个对象都有自己的窗口,这些窗口基于标准窗口所需的一组变量。

消息循环允许公开使用,它由 RunMessageLoop 方法运行。int nCmdShow - 当然,它是用来告诉如何显示窗口的。

现在,当我像这样创建一些对象时:

vector <APP *> App;
for (int i=0; i<3; i++)
{
App.push_back(&APP(nCmdShow))
App[i]->RunMessageLoop();
}

程序在开始另一个消息循环之前等待每个消息循环结束。

我想到了这样做:

vector <APP *> App;
for (int i=0; i<3; i++)
{
App.push_back(&APP(nCmdShow))
}
for (int i=0; i<3; i++)
{
App[i]->RunMessageLoop();
}

当我知道我希望在启动时运行多少个窗口时,似乎就可以了。

但我不知道如何动态创建新窗口,完全独立于其他窗口。它应该调用消息循环并立即返回 WinMain() 而不会结束消息循环。

我想到了多线程应用程序,每个线程对应一个 APP 类的实例。但是不知道如何构建多线程应用程序。

对可能的解决方案有什么想法吗?

最佳答案

我明白你现在想做什么了,我已经在我的名为 Lucid 的应用程序框架中实现了这一点(它仍在进行中)。为了得到答案,您的窗口类将被称为 Window 而不是 APP

这是通过将全局过程传递给您创建的每个窗口来完成的。所有窗口共享相同的过程。每次任何窗口收到消息时,该消息都会发送到全局过程,全局过程检查 HWND 是否属于您创建的 Window,如果属于, 将消息发送到 Window 的过程。以下是其工作原理的概述。

class Window
{
public:
// The contents of this function can vary from window to window
// provided that you make a subclass and override this method.
virtual LRESULT procedure(HWND wnd, UINT msg, WPARAM wp, LPARAM lp);

// When you create a Window object, add a pointer to it in this map.
// Eg. if (this->hwnd != NULL) createdWindows[this->hwnd] = this;
static map<HWND, Window*> createdWindows;

// When you create a window, make this its procedure.
static LRESULT CALLBACK routeMessage(HWND wnd, UINT msg, WPARAM wp, LPARAM lp)
{
if (createdWindows.find(wnd) != createdWindows.end()) {
// Message belongs to one of our 'Window' objects.
// Pass the message to that window and return the result.
return createdWindows[wnd]->procedure(wnd, msg, wp, lp);
} else {
// It seems you made 'routeMessage' the procedure
// of a window that doesn't belong in the map. Go ahead
// and process the message in the default manner.
return DefWindowProc(wnd, msg, wp, lp);
}
}
};

现在您只需要一个消息循环和一个线程。我有一个使用 Lucid 的测试项目,它在具有单个消息循环的单个线程上创建具有不同过程的 2 个窗口:

#include "Lucid.h"
using namespace Lucid;

void sayBye(MessageEventArgs& e)
{
MessageBox(NULL, "Goodbye!", "Form 2", MB_OK);
e.handled = true;
}

void Program::onStart()
{
Form* myForm1 = new Form("Hello World!");
myForm1->show();

Form* myForm2 = new Form("Hello World!");
myForm2->addMessageHandler(WM_CLOSE, sayBye);
myForm2->show();

// This Program::onStart() function is called
// immediately before the single message loop is entered.
}

关于c++ - 具有多个窗口的应用程序作为类的实例,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16563606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com