none
Dialoge und Messages RRS feed

  • Frage

  • Hallo zusammen...

    Dialogmessages müssen durch IsDialogMessage... gut. Also schlägt MS vor, man solle WM_ACTIVATE abfangen, dann 'ne Variable setzen mit dem HDLG vom aktiven Dialog und das ganze was für ihn ankommt durch IsDialogMessage leiten. Schön... jetzt aber... was ist, wenn ich mehrere nicht-modale Dialoge habe?

    Ich habe mir das mal überlegt und frage mich, ob's überhaupt Nachrichten geben kann, die an einen nicht-modalen Dialog gesendet werden müssen, welcher nicht aktiv ist... (WM_ACTIVATE umgeht ja gewisse Teile der Nachrichten-Schleife... so ganz hab ich's aber nicht mehr im Kopf) ... also -> stimmt meine Annahme? Kann man sagen, dass es keine Nachrichten gibt, die ich per IsDialogMessage behandeln muss, wenn der Dialog nicht aktiv ist? (wobei... wenn ich einen Child-Dialog habe... also einen mit WS_CHILD ... klappt's dann auch??).

    Und gleich noch 'ne Frage... wenn ich z.B. WM_APP + 3 behandeln will in meinem Dialog... dann käme das doch recht schlecht, wenn gewisses nicht durch IsDialogMessage geschleust wird... müsste ich dann meinen Dialog so bauen, dass er noch eine eigene Window-Proc hat? (die könnte ich ja subclassen ...) ...

    Oder komm ich nicht um einen Array mit Dialogen rum, die ich in der Message-Loop alle durchgehe um rauszufinden, ob ich IsDialogMessage aufrufen muss???

    Rudolf

    Montag, 31. Oktober 2011 12:19

Antworten

  • 1. Eine Nachricht, die wie WM_APP an einen Dialog gesendet wird, kommt auch an!

    2. IsDialogMessage behandel nur WM_KEY... und WM_MOUSE Nachrichten und erzeugt aus diesen evtl. andere Nachricten.

    3. Wenn man auf das Tabulator Gehabe und auf Radio-Buttons, Standard-Buttons und der automatische Aktivierung verzichten kann, benötigt man IsDialogMessage gar nicht.

    4. Die MFC macht das immer automatisch richtig, weil einfach die Liste der Fenster durchgegangen wird und PreTranslateMessage aufegrufen wird.

    5. Man dies in etwa genaus implementieren:

    Pseudo Code:

    if (IsKeyboardOrMouseMessage())
    {
       HWND hWnd = TargetHwndForMessage();
       while (hWnd) 
       {
           if (IsADialogClass(hWnd))
           {
               If (IsDialogMessage(...))
                   return;
           }
           hWnd = GetParentOrOwnerOf(hWnd);
        }
    }
    


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 31. Oktober 2011 12:37
    Moderator

Alle Antworten

  • 1. Eine Nachricht, die wie WM_APP an einen Dialog gesendet wird, kommt auch an!

    2. IsDialogMessage behandel nur WM_KEY... und WM_MOUSE Nachrichten und erzeugt aus diesen evtl. andere Nachricten.

    3. Wenn man auf das Tabulator Gehabe und auf Radio-Buttons, Standard-Buttons und der automatische Aktivierung verzichten kann, benötigt man IsDialogMessage gar nicht.

    4. Die MFC macht das immer automatisch richtig, weil einfach die Liste der Fenster durchgegangen wird und PreTranslateMessage aufegrufen wird.

    5. Man dies in etwa genaus implementieren:

    Pseudo Code:

    if (IsKeyboardOrMouseMessage())
    {
       HWND hWnd = TargetHwndForMessage();
       while (hWnd) 
       {
           if (IsADialogClass(hWnd))
           {
               If (IsDialogMessage(...))
                   return;
           }
           hWnd = GetParentOrOwnerOf(hWnd);
        }
    }
    


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 31. Oktober 2011 12:37
    Moderator
  • MFC :-) ... gut... gibt's nicht bei uns. Aber ok... so Zeugs wie das behandelt... da hast du Recht, das könnte ich weglassen... dann verwende ich evtl. einfach die Funktion gar nicht.

    mal überlegen... danke...

    Rudolf

    Montag, 31. Oktober 2011 12:46
  • ... mein Pseudocode macht eigentlich auch nichts anderes als die MFC... ;)


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 31. Oktober 2011 12:58
    Moderator