CListCtrl - OnDblClick löst OnClick aus

SunnyBunny

Mitglied
Wenn ich bei mir MFC, VS6.0, C++, eine ListCtrl habe und beide Funktionen Einzelklick und Doppelklick benutzen will, dann springt mir das Programm beim Doppelklick zuerst in den Einzelklick.

Wie kann ich dies verhindern, so dass entsprechend nur in die jeweilige Funktion gesprungen wird.

Vielen Dank für eure Hilfe im Voraus.

Gruß Sunny
 
Zuletzt bearbeitet:
Hi,

das läuft darauf hinaus, die Auswertung zu verzögern, bis die DoubleClick-Zeit abgelaufen ist. Also in der Behandlungsroutine für den Einzelklick einen Timer starten mit etwas mehr als die DoubleClick-Zeit. Dann gibt es zwei Möglichkeiten.
Erstens: Der zweite Klick erfolgt, bevor der Timer abgelaufen ist. Dann wird die DoubleClick-Routine angesprungen. Hier bitte mit KillTimer den Timer ausschalten, dass er nicht auch auslöst und dann die weitere Behandlung starten.
Zweitens: Der Timer löst aus, bevor ein zweiter Klick kommt. Dann hier (in OnTimer) die Funktion für den Einzelklick implementieren. KillTimer nicht vergessen.

Mfg

langer
 
Wenn ich bei mir MFC, VS6.0, C++, eine ListCtrl habe und beide Funktionen Einzelklick und Doppelklick benutzen will, dann springt mir das Programm beim Doppelklick zuerst in den Einzelklick.
Wundert mich jetzt, die Windows-API sollte die entsprechenden Notifications eigentlich sauber trennen können. Verwendest du die NM_CLICK (einfach) und NM_DBLCLICK (doppelt) Notifications?

Gruß MCoder
 
Jawoll ja.
NM_CLICK (einfach) und NM_DBLCLICK (doppelt) Notifications werden benutzt.
Er springt immer in die Einzelklick - Funktion, da der erste Teil des Doppelklciks ja ein Einfachklick ist. Finde das grausam von Microsoft, dass die das nicht auseinanderhalten. :mad:
Versuche mich gerade am Timer. :)
 
Bekomme das mit dem Timer nicht ganz hin, da ich nicht weiss wie ich den Aufruf des Einzelklicks machen soll:

Code:
OnClickListListe1(NMHDR* pNMHDR, LRESULT* pResult)

Woher bekomme ich die beiden Objekte?
 
Die Timergeschichte könntest du so lösen:
C++:
void CMyDlg::OnClickList(NMHDR* pNMHDR, LRESULT* pResult) 
{
    const UINT nIDEvent = 1;

    m_bDblClick = FALSE; // Membervariable im Dialog
    SetTimer(nIDEvent, GetDoubleClickTime() + 10, NULL);

    *pResult = 0;
}

void CMyDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult) 
{
    m_bDblClick = TRUE;
    
    // TODO: Doppelklick verarbeiten

    *pResult = 0;
}

void CMyDlg::OnTimer(UINT nIDEvent) // Mit Klassenassistenten erzeugen (WM_TIMER)
{
    if( nIDEvent == 1 )
    {
        KillTimer(nIDEvent);

        if( !m_bDblClick )
        {
            // TODO: Einfachklick verarbeiten
        }
    }

    CDialog::OnTimer(nIDEvent);
}
Gruß
MCoder
 
Super DANKE!

Es funktioniert.

(Und ich wollte mit Callbackfunktion und Pretranslatemessage und Klicksimulation das machen, aber so ist das natürlich viel einfacher!).

/Closed
 
Zurück