bool Window::RelayMouseMessage(bool (Window::*msg)(const MouseCoords&), const MouseCoords& mc) { // Abgeleitete Klassen fragen, ob das Weiterleiten von Mausnachrichten erlaubt ist // (IngameFenster könnten ja z.B. minimiert sein) if(!IsMessageRelayAllowed()) return false; bool processed = false; isInMouseRelay = true; // Alle Controls durchgehen // Use reverse iterator because the topmost (=last elements) should receive the messages first! for(std::map<unsigned int, Window*>::reverse_iterator it = childIdToWnd_.rbegin(); it != childIdToWnd_.rend() && active_; ++it) { if(!lockedAreas_.empty()) if(TestWindowInRegion(it->second, mc)) continue; if(it->second->visible_ && it->second->active_) { if((it->second->*msg)(mc)) processed = true; } } for(std::vector<Window*>::iterator it = tofreeAreas_.begin(); it != tofreeAreas_.end(); ++it) lockedAreas_.erase(*it); tofreeAreas_.clear(); isInMouseRelay = false; return processed; }
bool Window::RelayMouseMessage(bool (Window::*msg)(const MouseCoords&),const MouseCoords& mc) { // Abgeleitete Klassen fragen, ob das Weiterleiten von Mausnachrichten erlaubt ist // (IngameFenster könnten ja z.B. minimiert sein) if(!IsMessageRelayAllowed()) return false; bool processed = false; // Alle Controls durchgehen // Falls das Fenster dann plötzlich nich mehr aktiv ist (z.b. neues Fenster geöffnet, sofort abbrechen!) // Use reverse iterator because the topmost (=last elements) should receive the messages first! for(std::map<unsigned int,Window*>::reverse_iterator it = idmap.rbegin(); it != idmap.rend() && active; ++it) { if(locked_areas.size()) if(TestWindowInRegion(it->second, mc)) continue; if(it->second->visible && it->second->active) // Falls von einem Steuerelement verarbeitet --> abbrechen if((it->second->*msg)(mc)) { processed = true; break; } } /*// Nur vorläufig if(processed && msg == &Window::Msg_LeftDown) { for(std::map<unsigned int,Window*>::iterator it = idmap.begin(); it != idmap.end() && active; ++it) { if(locked_areas.size()) if(TestWindowInRegion(it->second, mc)) continue; if(it->second->visible && it->second->active) // Falls von einem Steuerelement verarbeitet --> abbrechen it->second->Msg_LeftDown_After(mc); } }*/ return processed; }