mfc Fenster Handle abfangen



  • Hi

    Ich habe ein Problem

    ich habe eine Listbox oder ähnliches. Wenn ich jetzt da klicke, dann ist das aktuelle Fenster ja die Listbox. Ich möchte jetzt das ein Ereignis ausgelöst wird, sobald ich woanders klicke.

    z.b. ich bin jetzt "aktiv" in der Listbox3. Jetzt klicke ich auf listbox2 oder listbox1 oder OkButton oder MyButton oder auf das Hauptdialogfenster möchte ich ein ereignis auslösen, durch einen einfachklick.

    Was muss ich dazuadden?



  • KillFocus ist das Zauberwort. 🙂



  • Danke für das Zauberwort, aber ich müsste auch wissen wie ich es einsetze.

    die listbox oder ähnliches heisst z.b. m_listbox von IDC_LIST

    Jetzt muss ich ja in der MessageMap???? sowas einfügen??

    ON_KILL_FOCUS(IDC_LIST, MyFkt)

    So oder? und jetzt wenn ich nichtmehr den focus drauf habe wird die Fkt. MyFkt aufgerufen?



  • Sollte eigentlich, ja.
    Ich mach das immer per Assistent, aber ich glaube so sieht das aus.

    Wieso? Geht es nicht? 😕



  • eine frage habe ich,

    wenn ich etwas überprüfen will indem man in die listbox tippt, wie mache ich das?

    überlegung meinerseits ist

    PreTranslateMessage(MSG* pMsg)
    

    da überprüfen ob m_bOK true ist
    dann

    if (pMsg->message == WM_KEYDOWN)
    

    m_bOK wird aktiv beim ereignis EN_SETFOCUS und deaktiv bei EN_KILLFOCUS

    meine fragen sind jetzt. brauch ich extra 2 zusätzliche Funktionen ( setfocus und killfocus ). wird die Funktion PreTranslateMessage(MSG* pMsg) aufgerufen wenn der focus auf ein listbox steuerelement ist?

    Ich habe nur eine membervaribale CString der listbox hinzugefügt. jetzt kann ich ja schlecht m_listbox.isfocus oder so aufrufen, sondern du den string übermitteln.



  • warum bekomm ich einen StackOverflow und mein programm stürzt ab???????

    .h

    //{{AFX_VIRTUAL(CTest)
    protected:
      virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    public:
      virtual BOOL PreTranslateMessage(MSG* pMsg);
    

    .cpp

    BOOL CTest::PreTranslateMessage(MSG* pMsg) 
    {
    
      return CTest::PreTranslateMessage(pMsg);
      //return true;  // hier stürzt das programm nicht ab, nur wenn ich irgendwas anklicken will
    }
    


  • Hi,

    du must PreTranslateMessage von der Basisklasse aufrufen, sonst gibts den
    Stackoverflow.

    BOOL CTest::PreTranslateMessage(MSG* pMsg)      <--
    {                                                  |
                                                       | = Endlosschleife auf den Stack
                                                       |
      return CTest::PreTranslateMessage(pMsg);---------
      // return CListBox::PreTranslateMessage(pMsg);
      //return true;  // hier stürzt das programm nicht ab, nur wenn ich irgendwas anklicken will
    }
    

    Gruss
    EB



  • super

    lol, auf das muss man einfach mal so kommen

    ein

    return CDialog.. // die basis

    bewirkt wunder 🙂

    danke danke 👍



  • Naja, was heist "drauf kommen". Da du die Pretranslate funktion in deiner klasse überladen hast, wird nur noch diese aufgerufen. Wenn du nun aber auch die Funktionalität der "originalen" Pretranslate behalten willst, dann musst du diese aufrufen.

    Das mit dem Stackoverflow ist ja auch klar. Wenn du eine Funktion aufrufst, wird platz auf dem Stack belegt und sobald du sie wieder verlässt wird dieser wieder freigegeben. Da deine Funktion sich nun ohne Abbruchbedingung immer wieder selbst aufgerufen hat, muss dieser ja irgendwann voll sein.

    MfG
    template


Anmelden zum Antworten