Announcement

Collapse
No announcement yet.

Eigene Botschaften definieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Eigene Botschaften definieren

    Hallo zusammen,

    wie muss unter C++ Builder die Deklaration für eine eigene Botschaft definiert werden?

    Vielen Dank
    Uwe

  • #2
    Hallo Uwe<br>
    Was meinst Du mit Deklaration eine Botschaft.<br>
    Meines Wissens bezieht unter C++Builder mit Botschaften arbeiten, wenn ich zum Beispiel auf ein Formular Click DoppelClick oder darüberfahr, daß ein bestimmtes Ereignis eintritt. Diese werden auch unter Ereignisse bestimmt und im Quelltext programmiert.<br><br>
    Grüße Stefa

    Comment


    • #3
      Hallo Stefan,

      Nein ich meinte zusätzliche eigene Botschaften, nicht die bereits durch die vcl abgedeckten. Dazu muss man sich meines Wissens nach erst mal eine eigene definieren (#define CM_OWNMESSAGE (WM_APP + 1)) und dann irgendwie mit dem Makro BEGIN_MESSAGE_MAP die Botschaftsantwortmethode mit der selbstdefinierten Botschaft verbinden. Dann kann ich nachher im Programm eine Message mit SendMessage oder PostMessage losjagen. Das ganze hakt aber bei mir irgendwie.
      Könnte mir mal jemand ein Beispiel abbilden wie sowas funktioniert?

      Grüsse
      Uw

      Comment


      • #4
        1. Du mußt unterscheiden zwischen tatsächlichen eigenen Botschaften, die es in Windows nicht gibt und Windowsbotschaften, für die von der VCL keine Rountinen bereitgestellt werden, aber in Windows vorhandnen sind.

        2. #define MYMESSAGE WM_USER+1

        Wenn du tatsächlich eine eigene neue Botschaft erzeugen willst

        3. Der MessageHandler mit der eigenen und der Botschaft WM_ERASEBKGND, die es in Windows gibt:
        <pre>
        BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(MYMESSAGE, TMessage, OnMyMessage)
        MESSAGE_HANDLER(WM_ERASEBKGND, TWMEraseBkgnd,OnEraseBkgnd)
        END_MESSAGE_MAP(TForm)

        Vor dem MessageHandler in der Header-Datei:

        void __fastcall OnEraseBkgnd(TWMEraseBkgnd& Message);

        void __fastcall OnMyMessage(TMessage& Message);

        Die Routine zur Bearbeitung des WM_ERASEBKGND Ergeinisses:

        void __fastcall TMainForm::OnEraseBkgnd(TWMEraseBkgnd& Message)
        {
        // Code
        Message.Result = true; Background löschen

        Message.Result = false; Background nicht löschen
        }

        void __fastcall TMainForm::OnMyMessage(TMessage& Message)
        {
        //meine Botschaft und ihr Code
        Message.Result = true;
        }

        </pre&gt
        Christian

        Comment


        • #5
          Hochinteressante Angelegenheit!

          Nun würde mich natürlich interessieren, wie ich aus einer anderen Anwendung genau diese Botschaft an diese Anwendung schicken kann?

          Nehmen wir an Anwendung A hat o.g. MessageHandler für MyMessage.

          Ich möchte nun aus Anwendung B MyMessage an An wendung A schicken.

          Ist das überhaupt möglich????

          gruß

          Manfre

          Comment


          • #6
            PostMessage(hWnd,WM_COMMAND,MYMESSAGE,0L);

            Wobei Anwendung B das Fensterhandle hWnd von Anwendung A vorher zum Beispiel mit FindWindow ermittelt werden muß.

            Gruß
            Günthe
            Günther

            Comment


            • #7
              Tja, das wird so nicht zwischen zwei verschiedenen Anwendungen gehen.

              PostMessage funktioniert nur bei den normalen Windows-Botschaften (Bsp. WM_CLOSE). Bei eigenen Botschaften müssen beide Anwendungen die "neue" Botschaft mit RegisterMessage registriere
              Christian

              Comment


              • #8
                Dann ist es wohl Zufall, wenn es bei mir funktioniert ???

                Man beachte, die eigentliche Botschaft ist WM_COMMAND. Der Parameter MYMESSAGE muß natürlich in beiden Programmen den gleichen Zahlenwert haben
                Günther

                Comment


                • #9
                  Nein, kein Zufall, aber eine andere Methode, die so eigentlich von MS nicht vorgesehen ist. Wenn die mal eine neuen Code bei der Botschaft WM_COMMAND einführen und das ist durch Zufall dein wNotifyCode dann kracht es wohl.

                  Wenn du WM_COMMAND sendest ist das keine eigendefinierte Botschaft.

                  Du übergibst lediglich im wNotifyCode deinen Wert.

                  Bei einer eigendefinierten Botschaft kannst du einen eigenen Wert übergegen und hast die wParameter und lParameter frei um eigene zusätzliche Werte zu dieser Botschaft zu übergeben.

                  Die Funktion heisst RegisterWindowMessage (Fehler von mir).

                  Innerhalb EINER Anwendung (also zwischen verschiedenen Fenstern der Anwendung) ist die Registrierung nicht vonnöten.

                  The RegisterWindowMessage function defines a new window message that is guaranteed to be unique throughout the system. The returned message value can be used when calling the SendMessage or PostMessage function.

                  UINT RegisterWindowMessage(

                  LPCTSTR lpString // address of message string
                  );


                  Parameters

                  lpString

                  Points to a null-terminated string that specifies the message to be registered.



                  Return Values

                  If the message is successfully registered, the return value is a message identifier in the range 0xC000 through 0xFFFF.
                  If the function fails, the return value is zero.

                  Remarks

                  The RegisterWindowMessage function is typically used to register messages for communicating between two cooperating applications.
                  If two different applications register the same message string, the applications return the same message value. The message remains registered until the Windows session ends.
                  Only use RegisterWindowMessage when more than one application must process the same message. For sending private messages within a window class, an application can use any integer in the range WM_USER through 0x7FFF. (Messages in this range are private to a window class, not to an application. For example, predefined control classes such as BUTTON, EDIT, LISTBOX, and COMBOBOX may use values in this range.)

                  See Also

                  PostAppMessage, PostMessage, SendMessag
                  Christian

                  Comment

                  Working...
                  X