Fokus auf Childview



  • Hallo Leute, kurze Frage.

    Im Childview meiner SDI-Anwendung fang ich Tastatureingaben über WM_KEYDOWN und WM_KEYUP auf.
    Wenn ich jetzt über mein Mainmenü z.B. das Dialogfeld AboutDlg öffne und anschließend wieder schließe verliert die Childview anscheinend den Fokus und bekommt ihn anschließend wohl auch nicht zurück. Das ist jedenfalls meine Vermutung.

    Könnte mir mal jemand den Sachverhalt schildern, ob ich da überhaupt richtig liege und wo ich was einbauen muss, das ich nach dem Beenden z.B. des AboutDlg o.ä. weiter Nachrichten von WM_KeyUp in im Childview abfragen kann!?
    😕

    Danke



  • Ich könnte jetzt z.B. in der Main auch zusätzlich die WM_KEYDOWN - Nachrichten abfangen, weil irgendwas muss ja den Fokus haben, aber das ist meiner Meinung nach absolut nicht performant und erfüllt auch nicht den Sinn. Ich würde das gern sauber lösen, aber ich steh aufm Schlauch. 👍 👎


  • Mod

    Benutze den Spy++ um herauszubekommen wer den Focus bekommt.

    Hast Du eigene Controls in Deinem View? Evtl. hat Dein View dann den Focus aber nicht eines Deiner Controls?
    Das ist ein Problem wenn Du Controls in einem View ereugst der nicht von CFormView abgeleitet wird.



  • Es wird WM_KILLFOCUS für das Childview aufgerufen wenn ich etwas aus dem Mainmenü öffne.

    Eigene Controls habe ich da nicht. Ich geb da nur Text aus und über die Tastatur ein, deshalb brauch ich da den Fokus wieder.


  • Mod

    RunSeb schrieb:

    Es wird WM_KILLFOCUS für das Childview aufgerufen wenn ich etwas aus dem Mainmenü öffne.

    Eigene Controls habe ich da nicht. Ich geb da nur Text aus und über die Tastatur ein, deshalb brauch ich da den Fokus wieder.

    Schau Dir das mit Spy++ an. Wenn der en modaler Dalog schließt wird der Focus an das Mainframe zurückgesetzt. Dieser setzt den Focus automatisch auf das ActiveView?

    Was ist das für eine Anwendung? SDI? Was ist das für ein View?



  • Ja, nach dem Schließen bekommt das Mainfraime automatisch den Fokus, aber nicht das ActiveView?
    Ich habe ne MFC-Standart SDI Anwendung. Das Childwiev ist auch default von CWnd glaub ich.
    Also ich kann mir das nicht erklären alles


  • Mod

    RunSeb schrieb:

    Ja, nach dem Schließen bekommt das Mainfraime automatisch den Fokus, aber nicht das ActiveView?
    Ich habe ne MFC-stan**** SDI Anwendung. Das Childwiev ist auch default von CWnd glaub ich.
    Also ich kann mir das nicht erklären alles

    Deine Aussage ist falsch. Der Code der in CFrameWnd vorgesehen ist, sorgt genau dafür (siehe MFC Sourcecode):

    void CFrameWnd::OnSetFocus(CWnd* pOldWnd)
    {
    	if (m_pViewActive != NULL)
    		m_pViewActive->SetFocus();
    	else
    		CWnd::OnSetFocus(pOldWnd);
    }
    

    Machst Du irgendwelche Tricks mit View Swapping oder benutzt Du SetActiveView falsch?



  • Wenn ich den AboutDlg schließe müsste demnach dann die Funktion void CFrameWnd::OnSetFocus(CWnd* pOldWnd) ausgeführt werden.
    Ich habs mal durchdebuggt und er springt da nicht rein.
    In meiner MainFrame - Klasse wir das hier beim Beenden des AboutDlg aufgerufen:

    void CMainFrame::OnSetFocus(CWnd* pOldWnd)
    {
    	// Fokus an das Ansichtsfenster weitergeben
    	m_wndView.SetFocus();
    }
    

    aber dann landet er hier (winocc.cpp):

    CWnd* CWnd::SetFocus()
    {
    	ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));
    
    	if (m_pCtrlSite == NULL)
    		return CWnd::FromHandle(::SetFocus(m_hWnd));
    	else
    		return m_pCtrlSite->SetFocus();
    }
    

  • Mod

    1. Warum hast Du diesen Handler überhaupt geschrieben?
    2. Dann schau Dir doch bitte man den Callstack an wenn CWnd::SetFocus aufgerufen wird! Wer löst diese Funktion denn aus?
    3. Verstehe ich Deinen Code gar nicht, denn ein View wird normalerweise dynamisch erzeugt und ist kene Membervariable wie bei Dir!


Anmelden zum Antworten