Problem mit BUTTON



  • Hi Leute.

    Hoffe ihr könnt mir helfen. Probiere schon seit zwei Tagen herauszufinden wie ich überprüfen kann, ob dieser Button gedrückt wurde:

    void wtButton::create(wtWindow wnd, int x, int y, int wx, int wy, char *title, int id)
    {    
        hwnd = CreateWindow("BUTTON",title,WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,x,y,wx,wy,wnd.getHwnd(),(HMENU)id,wnd.getHinstance(),NULL);
    }
    

    Die Funktion funktioniert einwandfrei. Der Button wird auch angezeigt und ich kann ihn auch drücken. Allerdings wird, wenn man ihn drückt, keine Nachricht verschickt. Ich habe mir alle Nachrichten ausgeben lassen, die das Programm empfängt. Wenn ich den Button an klicke kommt überhaupt keine Nachricht an. Kein WM_COMMAND, kein BN_CLICKED, einfach nix.

    Ich weiß nicht woran das liegt.
    Hoffe ihr könnt mir helfen.

    LG,
    Timo



  • Hallo Dago,

    normalerweiße sollte es so funktionieren:

    switch(Message)
    {
        case WM_COMMAND:
            if (LOWORD(wParam) == id)
                {
                    bla...
                }
        break;
    }
    

    Hast du auch so eine Routine die dir die Messages übergibt?

    while(GetMessage(&Msg, NULL, 0, 0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
    

    Gruß
    yogle



  • du musst ne WindowPorzedur da rein packen...

    LRESULT CALLBACK wtButton::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       case WM_COMMAND:
          {
             if (lParam == (LPARAM)hwnd)
             {
                if (HIWORD(wParam) == BN_CLICKED)
                   SendMessage(hWnd, WM_CLOSE, 0, 0);
             }
             return 0;
       }
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
    


  • Hi,

    Ich hab jetzt herausgefunden, dass der Button tatsächlich eine WM_COMMAND Message schickt. Ich hab bislang probiert sie so abzufangen:

    if (GetMessage(&messages, NULL, 0, 0))
            {
                TranslateMessage(&messages);
    
                if (messages.message == WM_COMMAND) MessageBox(NULL,"Kam was an","...",MB_OK);
                else;
    
                DispatchMessage(&messages);
                return true;
            }
    

    Das hat allerdings nicht geklappt. Nur in der WNDPROC-Funktion konnte ich die Nachricht abfangen.
    Komischerweise funktioniert diese Abfrage aber, wenn zum Beispiel ein Menü angeklickt wurde.

    @ (D)Evil:
    Das habe ich schon probiert. Aber der Compiler (benutze Dev-C++) meckert, dass ich die WindowPorzedur nicht in eine Klasse einbinden kann. Hab sie deshalb außerhalb der Klasse so laufen:

    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                
        {
            case WM_DESTROY:
                PostQuitMessage(0);
                break;
            default:                     
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    

    Wenn ich hier das hier hinzufüge, funktioniert es auch wenn der Button geklickt wurde:

    case WM_COMMAND:
        MessageBox(NULL,"Hier funktionierts","...",MB_OK);
        break;
    

    Aber warum funktioniert die Variante oben nicht?

    EDIT:
    Nachtrag: WM_MOVE oder WM_SIZE kann ich zum Beispiel über meine Variante (ganz oben) auch nicht abfangen.



  • @ (D)Evil:
    Wenn ich es so mach, wie du gemeint hast bekomme ich für diese Zeile:

    wincl.lpfnWndProc = WindowProcedure;
    

    Diese Fehlermeldung:

    argument of type `LRESULT (wtWindow::)(HWND__*, UINT, WPARAM, LPARAM)' does not match `LRESULT (*)(HWND__*, UINT, WPARAM, LPARAM)'
    


  • Vielleicht hilft dir das hier?!



  • Hallo Dago,

    also ich programmiere auch mit Dev-Cpp und bei mir läuft dieser
    Code einwandfrei.
    Einfach mal ein neues leeres Projekt erstellen und den Code so
    wie er dasteht reinkopieren. Müsste funktionieren 😉

    #include <windows.h>
    
    HWND hwnd;
    HWND buttonTest;
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
    {
        switch(Message)
        {
            // Button erstellen
            case WM_CREATE:
                buttonTest = CreateWindowEx (WS_EX_WINDOWEDGE,"button","Test",WS_CHILD | WS_VISIBLE,
    							            85, 70, 80, 30, hwnd, (HMENU)1, 
    							            (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL);    
            break;
    
            // Kommando empfangen
            case WM_COMMAND:
                 if (LOWORD(wParam) == 1)    
                 {
                     MessageBox(NULL,"Button wurde gedrückt!","Hallo",MB_OK);
                 }
            break;    
    
            // X-Button 
            case WM_CLOSE:
                ExitProcess(0);
            break;
    
            default:
            return DefWindowProc(hwnd, Message, wParam, lParam);
        }
    }        
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        static HINSTANCE g_hInst = NULL;
        static char g_szClassName[] = "MyWindowClass";
    
        WNDCLASSEX WndClass; 
        g_hInst = hInstance;
        MSG Msg;
    
        WndClass.cbSize        = sizeof(WNDCLASSEX);
        WndClass.style         = 0;
        WndClass.lpfnWndProc   = WndProc;
        WndClass.cbClsExtra    = 0;
        WndClass.cbWndExtra    = 0;
        WndClass.hInstance     = g_hInst;
        WndClass.hIcon         = (HICON)LoadIcon(NULL,IDI_APPLICATION);
        WndClass.hCursor       = LoadCursor(NULL,IDC_ARROW);
        WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW);
        WndClass.lpszMenuName  = NULL;
        WndClass.lpszClassName = g_szClassName;
        WndClass.hIconSm       = WndClass.hIcon;
    
        RegisterClassEx(&WndClass);
    
        hwnd = CreateWindowEx(
                              WS_EX_CLIENTEDGE,
                              g_szClassName,
                              "Testprogramm",
                              DS_MODALFRAME | DS_3DLOOK | DS_CENTER | 
                                 WS_MINIMIZEBOX | WS_SYSMENU | WS_POPUP | 
                                 WS_CAPTION | WS_EX_CLIENTEDGE,
                              500,  
                              350,  
                              250, 
                              200,
                              NULL, 
                              NULL, 
                              g_hInst, 
                              NULL );
    
        ShowWindow(hwnd,SW_SHOWNORMAL);
    
        while(GetMessage(&Msg, NULL, 0, 0))
        {
           TranslateMessage(&Msg);
           DispatchMessage(&Msg);
        }
        return Msg.wParam;
    }
    

    Viel Spaß noch mit dem programmieren. 🙂
    Gruß yogle


Anmelden zum Antworten