"Callback" aus CStatic Objekten in einen CDialogEx



  • Hallo!

    Ich versuche gerade eine optimale Lösung für ein bestimmt sehr triviales Problem zu finden.

    Und zwar habe ich einen von CDialogEx abgeleiteten Dialog, in dem ich mir an einer Stelle einen Vektor mit 240 CMuCardStatic Elementen (enthalten PNG-Grafiken von µSD-Karten) fülle. Beispielhaft:

    m_imageBlock.push_back(std::make_unique<CMuCardStatic>());
    m_imageBlock.at(count)->Create(_T("X"), SS_NOTIFY | SS_BITMAP | WS_VISIBLE | SS_REALSIZEIMAGE, CRect(topX, topY, 0, 0), this);
    m_imageBlock.at(count)->SetBitmap(m_image_gray);
    m_imageBlock.at(count)->setCardNumber(count+1);
    

    CMuCardStatic ist abgeleitet von CStatic und enthält als zusätzliche Member-Variablen momentan nur eine eindeutige ID (int) und einen beschreibenden Text (CString). Später sollen da noch diverse andere Dinge hinzukommen. Nun möchte ich, dann wenn ich auf eines der CStatic Elemente doppelt mit der Maus klicke, die eindeutige ID an den CDialog übergeben wird. Im CDialog möchte ich daraufhin eine zur ID passende Aktionen ausführen. Innerhalb meiner CMuCardStatic kann ich den Doppelklick über ON_WM_LBUTTONDBLCLK() problemlos auswerten und z. B. eine AfxMessageBox anzeigen lassen.

    Jetzt bin ich aber am überlegen, wie ich das bewerkstelligen soll, das der Doppelklick ,bzw. nur die ID, an den CDialog weitergeleitet wird. Ich könnte jedem Objekt der CMuCardStatic Klasse jetzt immer einen Pointer auf meine spezielle CDialogEx Klasse mitgebeben und dann bei einem Doppelklick aus der CMuCardStatic heraus auf eine Methode in dem CDialog zugreifen. Aber dann habe ich eine zirkuläre Abhängigkeit, da ich dann den Header vom CDialog in meiner CMuCardStatic includen müsste. Das finde ich irgendwie nicht sauber.

    Was wäre hier denn der "state-of-the-art" Weg, wenn man bei MFC noch davon reden mag. 😃

    Vielen lieben Dank!



  • Wenn du beim Erstellen deines Static (Create) nach dem this (ich geh davon aus das this dein CDialogEx ist) noch eine ID angibst, dann kannst du doch in deine Dialogklasse die Message empfangen.

    Auswerten kannst du die dann zum Beispiel mit ON_CONTROL_RANGE. Im Handler bekommst du dann die ID des Auslösenden CStatic zurück und kannst darauf reagieren.

    https://docs.microsoft.com/de-de/cpp/mfc/handlers-for-message-map-ranges?view=msvc-170

    für weitere Studien.

    Die benutzten ID´s sollten im Bereich WM_USER und aufwärts sein, damit du nicht mit anderen Nachrichten kollidierst.


Anmelden zum Antworten