-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にウィンドウハンドル(HWND)が含まれている場合はstd::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

特定の. SetWindowLongPtr_ 引数として使用します。thisHWNDGWLP_USERDATAnIndex

この方法では、マップはまったく必要ありません。ウィンドウ ハンドルがあれば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 に答える