Announcement

Collapse
No announcement yet.

Anfängerproblem mit WndProc-Zuweisung (WINDOWS)

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

  • Anfängerproblem mit WndProc-Zuweisung (WINDOWS)

    Hi,
    ich habe ein ziemlich seltsames Problem.

    Ich möchte eine Fensterklasse basteln, in der ich eine Standard-WinProc einbaue. Die Methodef sieht dann so aus:

    LRESULT CALLBACK Fensterklasse::WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
    {}

    Wenn ich nun im Kostruktor bei der Initialisierung der WNDCLASS folgendes schreibe:

    wndclass.lpfnWndProc = WndProc;

    oder auch:

    wndclass.lpfnWndProc = this->WndProc

    gibt's vom Compiler Haue :-)

    Kann mir jemand sagen was ich falsch mache, und wie ich mein Vorhaben realisieren kann ? Ich bin verzweifelt.

    Danke Bernd

  • #2
    Hallo,
    ich glaube, du verwechselst da was. Eine Fensterklasse ist keine Klasse im C++-Stil. Sie ist vielmehr eine Windwos-Interne Struktur, die die Eigenschaften eines Fensters beschreibt. Normalerweise macht man es so, dass WndProc eine globale Funktion ist, dann meckert der Compiler auch nicht. Wenn du willst, schick ich dir ne komplette WinMain- und WndProc-Funktion, dann kannst du es dir genau angucken.

    Mfg Georg

    Comment


    • #3
      Hi,

      Du hast mich falsch verstanden:

      Ich möchte tatsächlich eine C++-Klasse für ein Fenster implementieren, die die Windows "Pseudoklasse" als objektorientierter Wrapper umgibt. In deren Konstruktor möchte ich vorerst eine WndProc zuweisen, die eine Memberfunktion dieser Klasse ist. Diese Memberfunktion soll für alle Window-Events eine (nahezu) leere Methode über einen Funktionspointer aufrufen. Diese Funktionspointer sollen dann später im konkreten Anwendungsfall durch setzen von Funktionspointern ala OnDraw() etc. ersetzt werden.

      Nun erneut meine Frage: Ist es möglich WndProc auf eine Methode einer Klasse mit exakt identischer Signatur zu setzen ?

      Danke für die Hilf

      Comment


      • #4
        Welche Fehlermeldung spuckt der Compiler denn aus

        Comment


        • #5
          Die Fehlermeldung lautet:

          <pre>
          'long (__stdcall AFCFrame::*)(void *,unsigned int,unsigned int,long)' kann nicht in '
          long (__stdcall *)(void *,unsigned int,unsigned int,long)' konvertiert werden
          </pre>

          wobei AFCFrame der Name meiner Fensterklasse ist. Mir ist klar, dass es sich hier um einen Typzuweisungs- / Konvertierungsfehler handelt.
          Nur ist mir nicht klar warum hier eine Typkonvertierung überhaupt nötig sein sollte ich weise nämlich in der Zeile:

          <pre>
          wndclass.lpfnWndProc = WndProc;
          </pre>

          eine Methode / WndProc zu, die, bis auf dass sie zur Klasse AFCFrame gehört eine Funktion mit exakt derselben Signatur (Rückgabewerte / Parameter) wie sie eine 'normale' WndProc hat.

          Hier ist die Deklaration meiner WndProc:

          <pre>
          LRESULT CALLBACK AFCFrame::WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
          </pre>

          So, und nun noch eine wichtige Info: Ich habe das Ganze (für mich äusserst unbefriedigend, weil fragwürdig objektorientiert) vorerst so gelöst, dass ich dem Konstruktor der Fensterklasse aus der WinMain eine globale WndProc übergebe. Das funkt auch, allerdings, wie schon gesagt, finde ich das Ganze alles andere als elegant.

          Da es aber in IDE's allgemein möglich ist Fenstern, z.B. Beans in Java dynamisch Behandlungsmethoden für Events zuzuweisen (genau das will ich erreichen,) denke ich, dass es doch wohl eine Lösung für mei Problem geben muss... hoffe ich zumindest...

          Gruss und Danke

          Bern

          Comment


          • #6
            Hi,
            in dem Thread "memberfunktion mal anders" oder so ähnlich (steht über diesem hier) wird im Prinzip das selbe Problem angesprochen. Du solltest, wie dort auch gesagt wird mal in der MSDN nachgucken. Such dabei irgendas mit dem Operator '::' .

            Mfg Georg

            Comment


            • #7
              Ich schau mal nach. Darf ich, wenn ich nicht weiterkomme nochmals fragen ? Hast Du eine E-Mailaddresse an die ich mich mal wenden könnte.

              Danke

              Bern

              Comment


              • #8
                Klar kannst du noch mal fragen. Meine Adresse: [email protected]. Die Frage ist nur, ob ich dir noch weiter helfen kann

                Comment


                • #9
                  Lösung

                  Hallo,

                  warum auch immer habe ich das Problem gelöst indem ich folgendes verwendet habe:

                  static LRESULT CALLBACK Procedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
                  return DefWindowProc(hwnd, msg, wParam, lParam);
                  }

                  Kann mir jemand sagen, warum es aufeinmal mit static funktioniert?

                  Comment


                  • #10
                    nach 7 Jahren???
                    Christian

                    Comment


                    • #11
                      richtig.
                      Sieben Jahre später bin ich auf das selbe Problem gestoßen und habe nocheinmal eine Frage zum selben Thema.

                      Comment


                      • #12
                        Mit static hast du erreicht, dass es für alle Instanzen eine einzige Methode gibt. Wie schon in Beitrag 2 erwähnt gibt es keine Windowsklasse für "Fensterklassen". Lediglich eine Struktur. Diese erwartet eine Zeiger auf eine Funktion.
                        Wie würdest du dieser x-Methoden zuordnen, wenn du x-Instanzen deiner Klasse anlegst? Welche sollte Windows aufrufen?
                        Christian

                        Comment


                        • #13
                          Originally posted by Christian Marquardt View Post
                          nach 7 Jahren???
                          Wenigstens steht eine Lösung da für Andere, die ein ähnliches Problem haben

                          Comment

                          Working...
                          X