-3

我有一个 std::map 的窗口,例如:

class MyWindow
{
public:
    MyWindow()
    {
        CreateWindow(...);
    }
    ... // rest of code
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        // code
    }
}

std::map<string, MyWindow> windows;

而在 WndProc 函数内部我想知道函数中现在是哪个窗口,我怎样才能得到这个窗口的键。

4

3 回答 3

1

如果MyWindow包含 Windows 句柄 ( HWND),那么您可以使用 egstd::find_if来查找实例。

就像是:

HWND hWnd;  // The window handle to look for

auto windowIterator = std::find_if(std::begin(windows), std::end(windows),
    [hWnd](const std::map<std::string, MyWindow>::value_type& p) -> bool {
        return (p.first.getNativeWindowHandle() == hWnd);
    });
if (windowIterator != std::end(windows))
{
    // `windowIterator` now "points" to the window
}
于 2013-02-07T09:40:57.797 回答
0

您可以使用SetWindowLongPtrthis给定的HWND. GWLP_USERDATA用作论据nIndex

这样,您根本不需要地图:当您有一个窗口句柄时,GetWindowLongPtr就足以获取一个对象。

于 2013-02-07T09:42:11.080 回答
0

您可以对地图进行蛮力搜索:

auto it = std::find_if(windows.begin(), windows.end(),
                       [this](std::pair<std::string const, MyWindow> const & p) -> bool
                       { return p.second == *this; } );

if (it == windows.end()) { /* not found */ }
else                     { /* window key is it->first */ }

如果对象是唯一的,您也可以&p.second == this在比较中说。

于 2013-02-07T09:42:40.900 回答