2013-02-07 3 views
-3

J'ai un std :: carte de fenêtres, par exemple:C++ - carte - obtenir la clé de cette valeur

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; 

Et dans la fonction WndProc Je veux savoir quelle fenêtre est maintenant dans la fonction, comment puis-je obtenir la clé de cette fenêtre.

+1

quand itérer, Windows-> première? – Rapptz

+0

Je suis dans la fonction WndProc Je veux savoir quelle fenêtre est maintenant dans la fonction – user1544067

+0

je ne vois pas pourquoi vous utilisez un 'std :: map' pour cela. – Rapptz

Répondre

0

Vous pouvez utiliser SetWindowLongPtr pour stocker un pointeur vers un objet (this si vous créez une fenêtre dans une méthode de classe) pour une HWND donnée. Utiliser GWLP_USERDATA comme argument nIndex.

De cette façon, vous avez besoin aucune carte du tout: lorsque vous avez une poignée de fenêtre, GetWindowLongPtr est suffisant pour obtenir un objet.

1

Si le MyWindow contient la poignée de fenêtres (HWND), vous pouvez utiliser par exemple. std::find_if pour trouver l'instance.

Quelque chose comme:

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 
} 
0

Vous pouvez faire une recherche force brute de la carte:

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 */ } 

Si les objets sont uniques, vous pourriez aussi être en mesure de dire &p.second == this dans la comparaison.

+0

Ne pas vous dire 'std :: find_if'? :) –

+0

@JoachimPileborg: oui, merci! –