Probleme mit subclassing von button -> repaint funktioniert nicht



  • und das sorgt wofür? dafür das der button nicht gezeichnet wird?



  • Nein, daß der von dir frisch gezeichnete Inhalt wieder überpinselt wird 😉 Wenn du etwas selber komplett erledigt hast, brauchst du nicht mehr auf die Standardimplementierung zurückgreifen.



  • was sollte ich stattdessen machen? das bitmap soll aufn button, (ziemlich) egal wie



  • bau dir doch deine ButtonProc so auf wie die WndProc:

    case WM_PAINT:
      //... Button zeichnen
      return 0;
    

    In dem Block steht alles drin, was dein Programm zum Zeichnen wissen muß, damit ist die Nachrichtenbehandlung fertig.

    (eventuell müsstest du den Rückgabewert noch anpassen - aber da kann dir die WinAPI-Doku eher weiterhelfen)



  • im sourcecode kann man sehen, dass wndproc u. buttonproc gleich aufgebaut sind, allerdings tritt dann das oben beschriebene problem auf. lasse ich das beginpaint weg, erscheint zwar der button komplett, aber ohne bitmap



  • das Problem ist eben, daß sie NICHT komplett gleich aufgebaut sind:

    // etwas vereinfacht:
    WndProc(...)
    {
      switch(message)
      {
      case WM_xxx:
        // handle Message xxx
        return 0; // verlässt die Funktion
      case WM_yyy:
        // handle Message yyy
        return 0;
      //...
      }
      return DefWindowProc(...); // nur aufgerufen, wenn keiner der case... aktiv wurde
    }
    
    ButtonProc(...)
    {
      switch(message)
      {
      case WM_xxx:
        // handle Message xxx
        break; // verlässt nicht die Funktion, sondern nur den switch()
      //...
      }
      return CallWindowProc(...); // in jedem Fall nach deiner Nachrichtenbehandlung aufgerufen
    }
    


  • das heißt, ich sollte bei einem button die WM_PAINT-Nachricht VOLLKOMMEN alleine übernehmen... Achso...

    ok, ich probiers



  • ich habe jetzt den fehler gefunden! die WM_CREATE-nachricht wird nicht aufgerufen (warum auch immer), ich habe die sachen aus der wm_create einfach beim ersten aufruf der wm_paint machen lass -> geht

    danke für eure hilfe, auch wenn der fehler letztlich woanders lag



  • Naja, das ist so nicht richtig.
    Das WM_CREATE wird auch bei den Buttons aufgerufen, nur landen diese Aufrufe nicht in Deiner eigenen WndProc, was aber ganz einfach daran liegt, dass Du die WndProc ja erst nach dem Aufruf von CreateWindow (also nach dem Erstellen) änderst.



  • ok wie auch immer, ich weiß jetzt wo mein fehler lag.

    danke für die hilfe,

    euer ItsNotYou


Anmelden zum Antworten