Meldungen für Steuerelemente?

Tobias Menzel

Erfahrenes Mitglied
Hi,

ich beginne gerade, mich mit VC++ und MFC auseinanderzusetzen.

Ich habe eine Dialogbasierte Anwendung und möchte Meldungen (z.B. MouseMove) für einzelne Steuerelemente abfangen. Meldungen kann ich aber nur für abgeleitete Klassen (z.B. mein Dialogfeld) abfangen - die Steuerelemente bekomme ich nur als Objekte...
Gibt es eine Möglichkeit, abgeleitete Klassen für einzelne Steuerelemente erstellen zu lassen bzw. die Meldung von dem Dialog auf Relevanz für ein bestimmtes Steuerelement zu überprüfen?

Weder aus der Dokumenteation von MS (die ich übrigens ab .NET nicht sehr gelungen finde) noch dem Forum konnte ich den den entscheidenden Hinweis entnehmen - das mag an falschen Suchbegriffen liegen, da ich, wie gesagt, in diesem Bereich absoluter Anfänger bin.

vielen Dank im Voraus für etwaige Antworten.

Gruß
 
Gibt es eine Möglichkeit, abgeleitete Klassen für einzelne Steuerelemente erstellen zu lassen bzw. die Meldung von dem Dialog auf Relevanz für ein bestimmtes Steuerelement zu überprüfen?
Man kann von den Controlklassen ableiten, aber das ist etwas knifflig. Es geht auch einfacher. Lass dir vom Wizard PreTranslateMessage() in deine Dialogklasse reinsetzen. Durch diese Methode laufen die Windowsmessages, bevor sie an die eigentliche Windowproc gehen. Das ist ein ausgezeichneter Platz, um Messages für einzelne Controls abzufangen (und nach Bedarf zu blockieren).
Hier ein Beispiel, wie man z.B. die Eingabe in einem Edit-Control steuern kann:
Code:
BOOL CMeinDlg::PreTranslateMessage(MSG* pMsg) 
{

  if (    pMsg->hwnd == m_ctlMeinEditControl.GetSafeHwnd() // ist es das Hwnd von dem Control?
       && pMsg->message == WM_CHAR  )                      // und interessiert mich die Message?
  {
    //- Eingabe filtern
	  TRACE( "Taste für Edit wParam%d!\n", pMsg->wParam );
    
    switch( pMsg->wParam )
    {
    case '.': //- Dezimalpunkt durch Komma ersetzen
      pMsg->wParam = ',';
      return CDialog::PreTranslateMessage(pMsg);

    case 8: //- Backspace 
    case ',':
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
      // das lassen wir defaultmässig verarbeiten 
      return CDialog::PreTranslateMessage(pMsg);

    default:
      // alles andere (z.B. Buchstaben) fressen wir (wird nicht weitergegeben)
      // (TRUE sagt dem Framework, dass es die Message nicht mehr beachten soll)
      return TRUE;
    }
  }

  return CDialog::PreTranslateMessage(pMsg);
}
 
Vielen Dank für die aussagekräftige Antwort.

Ich muss also jede Nachricht durch meine Dialogklasse laufen lassen... hmm, als alter VB6 und Flash-User hätte ich mir einfach eine größere Liste an Standardereignissen gewünscht (->Scriptsprachenverwöhnt).
Aber ich denke, mit dieser Methode bekomme ich es sicher hin (ich will im Prinzip nur die Cursortasten in einem Edit-Control abfangen, um durch eine Art "virtuelles Display" zu scrollen).

Danke nochmal.

Gruß

P.S.: wo ich schon mal hier bin ( ;) ) - ich nehme an, um meinen Steuerelementen erweiterte Darstellungsattribute zu geben (z.B. roter Hintergrund für ein Textfeld), benötige ich auch mehr, als eine einfache Memberfunktion a la "SetBgndColor"? Oder, um das ganze Abzukürzen: wo finde ich eine übersichtliche Auflistung aller änderbaren Attribute der verschiedenen Controls? Sollte sicher in der Doku bzw. MSDN zu finden sein, aber irgendwie scheinen MSDN und ich keine rechten Freunde zu werden :(

Danke
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück