Maus/Tastatur-ereigniss



  • Also ich möchte die Mausklicks und Tastendrücke zählen, daüfr hab ich die Funktionen OnLeftButtonKlick OnRightButtonClick und OnKeyDown erstellt, natürlich auf den dazugehörigen WM_ Messages.

    void CEreignisstestDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {

    ++KeyDown;
    m_KeyDown=KeyDown;
    CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
    }

    void CEreignisstestDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
    {

    ++MouseDown;
    m_MouseDown=MouseDown;
    CDialog::OnLButtonDblClk(nFlags, point);
    }

    void CEreignisstestDlg::OnRButtonDblClk(UINT nFlags, CPoint point)
    {

    ++MouseDown;
    m_MouseDown=MouseDown;
    CDialog::OnRButtonDblClk(nFlags, point);
    }

    wenn ich aber jetzt einen Klick mache oder eine Taste drücke passiert nichts....



  • ich hab noch bei jeder Funktion UpdateData(FALSE); hinzugefügt aber es geht trotzdem noch nicht, nur beim 1. Mausklick springt der "Mauscounter" auf eins, aber danach nichts mehr, und beim KeyCounter gar nichts



  • Ich habs jetzt mal nachgebastelt, und bei mir funktionierts einwandfrei. Ich komme mit diesen UpdateDate überhaupt nicht zurecht. Ich habe mir zum testen ein Static Field geschnappt, und seinen Namen auf IDC_COUNTER gesetzt, und den Inhalt auf 0 gesetzt. Und hier mein Code:

    void CKlickDlg::OnLButtonDblClk(UINT nFlags, CPoint point) 
    {
    	// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen
    
    	SetDlgItemInt(IDC_COUNTER, GetDlgItemInt(IDC_COUNTER) + 1);
    
    	CDialog::OnLButtonDblClk(nFlags, point);
    }
    

    Ich nehme keine Membervariable her, ich setze den Wert mit SetDlgItemInt. Um etwas hochzählen zu können, hole ich mir den Wert von IDC_COUNTER raus, addiere eins drauf, und übergib das an SetDlgItemInt. Und daraus ergibt sich dann eben die Zeile

    SetDlgItemInt(IDC_COUNTER, GetDlgItemInt(IDC_COUNTER) + 1);
    

    Damit ersparste dir dann auch das UpdateData(). Du kannst auf diese weiße sämtliche Variablen handhaben. Ich nehme UpdateData() schon lange nicht mehr her.
    Wenn ich Arrays habe, lege ich die getrennt im Quellcode an, und lese die Werte ein. Wenn ich sie in Steuerelemente einsetzen möchte, mach ich das mit SetDlgItemInt oder SetDlgItemText. Wenn man das richtig anstellt kommt man genausoweit, wie mit den "Member-Variablen" aus dem "MFC-Klassen-Assistenten".

    Und wie gesagt, wenn du wirklich mal die Daten in Variablen brauchst, kannste sie auch mit dem Klassen Assistenten erstellen lassen, oder über die "Klassenansicht" zu einer Klasse hinzufügen, ODER, du fügst sie direkt nach den #includes einfach so ein, dann sind die global vorhanden, aber dafür werden mich jetzt gleich ein paar Leute schlagen 🤡.

    Aber einlesen würde ich sie immer mit GetDlgItemInt oder GetDlgItemText, selbst wenn es LONG oder BOOL Werte sind, hol ich sie mir lieber mit dieser Methode als Text raus, und formatiere sie extra, is mir schon öfter passiert, dass ich wegen einem vergessenen UpdateData() ne halbe Stunde gedebugged habe, bis es mir auffiel. Und ich hatte bis jetzt noch keine SO TOLLEN Anwendungen, bei denen ich auf jede kleinste Optimierung hätte spechten müssen, um auch JA nich zuviel Leistung zu verbraten.

    Ich hoffe ich konnte dir helfen.



  • hmm, ja so hab ichs ja auch gemacht, ein Static Field und eine Member Variable, aber ok.
    Und wie speicher ich dann den Wert des Static in eine Variable?
    int i=SetDlgItemInt(blablabla)??



  • ich frag hier gleich auch mal:
    wie kann man Maus/Tastaturereignisse , die ausserhalb des Dialogs getätigt werden auffangen?



  • Wichtig ist, dass du von Static Fields überhaupt was Speichern oder Setzen kannst. Du musst dem Static Field einen eigenen Namen geben. Weil die heißen IMMER IDC_STATIC.

    Damit du den Wert von einem Static Field speichern kannst (das Static muss seinen eigenen Namen bekommen haben, ich geb ihm jetzt wieder den Namen "IDC_COUNTER").

    CString csCounter;
    int iCounter;
    
    csCounter = GetDlgItemText(IDC_COUNTER);
    iCounter = GetDlgItemInt(IDC_COUNTER);
    

    musst dabei natürlich berücksichtigen, dass du nur einen INT holen kannst, wenn da ne ganzzahl drinsteht.

    Gruß

    Markus Seidl


Anmelden zum Antworten