Nachrichtenverabeitung eines Child Windows



  • Hallo, ich hab mal ne Frage zu obigem Thema:
    Ich hab mir ein Fenster erstellt in das ich einen Button reingemacht hab.
    Nun stellt sich mir die Frage wie ich die Nachrichten abfange die an den Button gerichtet sind.
    Muss ich für den Button (also das Child) auch eine Fensterprocedur erzeugen?
    Ich hoffe mich kann jemand aufklären

    #include "stdafx.h"
    //#include <stdio.h>
    
    // Konstanten
    // ----------
    
    // Funktionsprototyping!
    // ---------------------
    LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg,
                             WPARAM wParam, LPARAM lParam);
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg,
                             WPARAM wParam, LPARAM lParam)
    {
         switch (uMsg)
        {
        case WM_DESTROY:
            // Beim Eintreffen von WM_DESTROY, Anwendung beenden
            PostQuitMessage(0);
            return 0L;
    		 case WM_CLOSE:
            {
                 // Abfrage, ob Anwendung beendet werden soll
                 int nRetVal = MessageBox(hWnd,
                                "Soll die Anwendung beendet werden?",
                                "WM_CLOSE", MB_YESNO);
                 // Falls ja, Fenster zerstoeren
                 if ( nRetVal == IDYES)
                     DestroyWindow(hWnd);
                return 0L;
            }
    
        }
    		// Alles durch WINDOWS bearbeiten lassen
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    
    LPCTSTR lpszWCLASSNAME = "ERSTES FENSTER";
    LPCTSTR lpszTITLE = "Mein erstes Fenster";
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpCmdLine,
                         int nCmdShow )
    {
       // ZU ERLEDIGEN: Fügen Sie hier den Code ein.
    
        // Fensterklasse registrieren
        // --------------------------
        // WNDCLASS-Strukur
        WNDCLASSEX WndClass;
        // Struktur mit '0' vorbelegen
        memset(&WndClass,0,sizeof(WndClass));
        WndClass.cbSize = sizeof(WndClass);
        // Fensterprozedur einhaengen
        WndClass.lpfnWndProc = WndProc;
        // Instanzen-Handle
        WndClass.hInstance = hInstance;
        // Icon fuer Fensterklasse laden
        WndClass.hIcon = LoadIcon(0,IDI_WINLOGO);
        // Cursor fuer Fensterklasse laden
        WndClass.hCursor = LoadCursor(0,IDC_UPARROW);
        // Fensterhintergrund setzen
        WndClass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
        // Fensterklassen-Name
        WndClass.lpszClassName = lpszWCLASSNAME;
        // Fensterklasse registrieren
        RegisterClassEx(&WndClass);
    
     // Fenster erzeugen
        HWND hWindow;                                  // Fenster-Handle
        hWindow = CreateWindowEx(0,                    // kein erweiterter Stil
                                 lpszWCLASSNAME,       // Fensterklassen-Name
                                 lpszTITLE,            // Fenstertitel
                                 WS_OVERLAPPEDWINDOW,  // Fensterstil
                                 CW_USEDEFAULT, 0,     // Position
                                 CW_USEDEFAULT, 0,     // Groesse
                                 (HWND)0,              // kein Parent-Fenster
                                 (HMENU)0,             // kein Menu
                                 hInstance,            // Instanzen-Handle
                                 NULL);                // keine zusaetzl. Daten
    
    		// Fehler abfangen
        if (hWindow == NULL)
        {
            MessageBox(0,"Fehler beim CreateWindowEx(...)!",
                       "FEHLER",MB_OK);
            return 0;
        }
    		// Fenster darstellen
        // ------------------
    
    		ShowWindow(hWindow, nCmdShow);
    		HWND hbutton = ::CreateWindow("ERSTES FENSTER","button",WS_BORDER | WS_CHILD | BS_ICON |BS_PUSHLIKE ,0,0,50,50,hWindow,NULL,0,0);
    		ShowWindow(hbutton,true);
    
    		MSG strMessage;    // Nachrichten-Struktur definieren
        // Auf Nachricht warten
        while (GetMessage(&strMessage,NULL,0,0))
        {
            // Tastencode uebersetzen
            TranslateMessage(&strMessage);
            // Nachricht an Fensterprozedur verteilen
            DispatchMessage(&strMessage);
        }
    
        return 0;
    }
    

    Danke



  • Geht es nur darum einen Click auf den Button abzufangen? Oder willst du alle Nachrichten kriegen? Wenn ja dann lautet das Stichwort Subclassing.



  • Naja,
    bisher würde mir ja ein click darauf schon reichen.
    Das Problem ist einfach dass ich nicht weiss wie ich in der Callback - Funktion zwischen dem Fenster und dem Button unterscheide.



  • da dein button ein child von deinem fenster ist fängst du nachrichten in der
    wndproc ab.

    CreateWindow("ERSTES FENSTER","button",WS_BORDER | WS_CHILD | BS_ICON |BS_PUSHLIKE ,0,0,50,50,hWindow,1001,0,0);
    
    case WM_COMMAND: 
        if (HIWORD(wParam) == BN_CLICKED) 
        { 
            switch (LOWORD(wParam)) 
            { 
                case 1001:
                    MessageBox(hWnd, "btn click", "btn click", MB_OK);
    

    [edit]tags vergessen
    [edit 3] letzter versuch



  • Hallo, danke für die Antworten,
    aber leider funzt es immer noch nicht.
    Ich bekomme auch schon einen Übersetzungsfehler wenn ich deine CreateWindow - Methode verwende
    (Konvertierung des Parameters 10 von 'const int' in 'struct HMENU__ *' nicht moeglich).
    Vielleicht hat noch jemand Rat?



  • casten.

    CreateWindow("ERSTES FENSTER","button",WS_BORDER | WS_CHILD | BS_ICON |BS_PUSHLIKE ,0,0,50,50,hWindow,(HMENU)1001,0,0);
    


  • Ich bekomm zwar keinen Fehler mehr, aber die MessageBox taucht trotzdem nicht auf 😞
    Das kann doch nicht so schwierig sein die richtigen Empfänger für Fenster (Button)
    zu ermitteln.





  • Danke, etz klappts 🙂



  • So, etz hätt ich noch eine kleine Frage und zwar:

    Ich hab mir das ganze mit dem Spy - Tool angesehen. Nun ist es so dass beim anklicken des Buttons gar keine WM_COMMAND - Nachricht bei dem Button ankommt.
    Wie kann das dann überhaupt funktionieren?
    Ich bin verwirrt....



  • Die WM_COMMAND kommt beim PARENT des CHILDS (dem Button) an...



  • Ahhhhh.... verstehe
    danke


Anmelden zum Antworten