Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C] Bottoni win32...

    Rieccomi: come si crea un bottone? Cosa c'è di sbagliato in questo:
    codice:
    #include <stdio.h>
    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
    int RegisterDefaultClass(HINSTANCE hInstance);
    
    HWND window;
    HWND button;
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        MSG Msg;
    
        if (!(RegisterDefaultClass(hInstance)))
        {
            return 1;
        }
    
        window = CreateWindow (
                                    "defaultClass",
                                    "Window!!",
                                    WS_OVERLAPPEDWINDOW,
                                    CW_USEDEFAULT,
                                    CW_USEDEFAULT,
                                    250,
                                    250,
                                    (HWND) NULL,
                                    (HMENU) NULL,
                                    hInstance,
                                    NULL
                                 );
    
        if (!window)
        {
            return 1;
        }
    
        button = CreateWindow (
                                "Button",
                                "Button!!",
                                0,
                                2,
                                2,
                                50,
                                50,
                                window,
                                (HMENU) NULL,
                                hInstance,
                                NULL
                            );
    
        if (!button)
        {
            return 2;
        }
    
        ShowWindow(window, SW_SHOW);
        UpdateWindow(window);
    
        while(GetMessage(&Msg, NULL, 0, 0) > 0)
        {
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
        return Msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch(msg)
        {
            case WM_CLOSE:
                DestroyWindow(hwnd);
            break;
            case WM_DESTROY:
                PostQuitMessage(0);
            break;
            default:
                return DefWindowProc(hwnd, msg, wParam, lParam);
        }
        return 0;
    }
    
    int RegisterDefaultClass(HINSTANCE hInstance)
    {
        const char g_szClassName[] = "defaultClass";
        WNDCLASSEX wc;
    
        wc.cbSize        = sizeof(WNDCLASSEX);
        wc.style         = 0;
        wc.lpfnWndProc   = WndProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = hInstance;
        wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
        wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH) (COLOR_WINDOW);
        wc.lpszMenuName  = NULL;
        wc.lpszClassName = g_szClassName;
        wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
    
        if(!(RegisterClassEx(&wc)))
        {
            return 0;
        }
    }
    ?

    Si vede solo la finestra ma non il bottone o.O

  2. #2
    Devi dare come style al CreateWindow del button, WS_CHILD e WS_VISIBLE.

    Comunque la reference MSDN serve a questo
    lolide
    Java Programmer

    Informati

  3. #3
    asd sono agli inizi con MSDN, devo abituarmi a cercare...

    Grazie

  4. #4
    Ho modificato la funzione di callback, ma non funziona! (Ho provato a cercare questa volta :S)

    codice:
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch(msg)
        {
            case WM_CLOSE:
                DestroyWindow(hwnd);
            break;
            case WM_DESTROY:
                PostQuitMessage(0);
            break;
            case WM_COMMAND:
                if (hwnd == button)
                {
                    MessageBox(window, "Hello, World!!", "It works", 1);
                }
            break;
            default:
                return DefWindowProc(hwnd, msg, wParam, lParam);
        }
        return 0;
    }

  5. #5
    Purtroppo la programmazione di GUI direttamente con le API richiede un po' di studio iniziale.
    Quindi:
    [list=1][*]Per intercettare il click di un button devi leggere la notifica BN_CLICKED mandata tramite WM_COMMAND[*] Leggendo nella reference dei windows controls c'è una sezione nominata Using ...
    Inizia da li per capire come funziona il meccanismo dell'invio dei messaggi nelle GUI Windows.[/list=1]
    lolide
    Java Programmer

    Informati

  6. #6
    Originariamente inviato da lolide
    Purtroppo la programmazione di GUI direttamente con le API richiede un po' di studio iniziale.
    Quindi:
    [list=1][*]Per intercettare il click di un button devi leggere la notifica BN_CLICKED mandata tramite WM_COMMAND[*] Leggendo nella reference dei windows controls c'è una sezione nominata Using ...
    Inizia da li per capire come funziona il meccanismo dell'invio dei messaggi nelle GUI Windows.[/list=1]
    Un esempio?

  7. #7
    UPDATE: Ce l'ho fatta!
    Lo posto, così arriva qualcuno Googlando lo vede

    codice:
    #include <stdio.h>
    #include <windows.h>
    
    #define BUTTON 1001
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
    int RegisterDefaultClass(HINSTANCE hInstance);
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        HWND window;
        HWND button;
        MSG Msg;
    
        if (!(RegisterDefaultClass(hInstance)))
        {
            return 1;
        }
    
        window = CreateWindow (
                                    "defaultClass",
                                    "Window!!",
                                    WS_OVERLAPPEDWINDOW,
                                    CW_USEDEFAULT,
                                    CW_USEDEFAULT,
                                    250,
                                    250,
                                    (HWND) NULL,
                                    (HMENU) NULL,
                                    hInstance,
                                    NULL
                                 );
    
        if (!window)
        {
            return 1;
        }
    
        button = CreateWindow (
                                "Button",
                                "Hello!",
                                WS_CHILD|
                                WS_VISIBLE,
                                2,
                                2,
                                90,
                                20,
                                window,
                                BUTTON,
                                hInstance,
                                NULL
                            );
    
        if (!button)
        {
            return 2;
        }
    
        ShowWindow(window, SW_SHOW);
        UpdateWindow(window);
    
        while(GetMessage(&Msg, NULL, 0, 0) > 0)
        {
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
        return Msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch(msg)
        {
            case WM_CLOSE:
                DestroyWindow(hwnd);
            break;
            case WM_DESTROY:
                PostQuitMessage(0);
            break;
            case WM_COMMAND:
                switch(LOWORD(wParam))
                {
                    case BUTTON:
                        MessageBox(hwnd, "Hello, World!", "Bottone premuto", MB_OK);
                    break;
                }
            break;
            default:
                return DefWindowProc(hwnd, msg, wParam, lParam);
        }
        return 0;
    }
    
    int RegisterDefaultClass(HINSTANCE hInstance)
    {
        const char g_szClassName[] = "defaultClass";
        WNDCLASSEX wc;
    
        wc.cbSize        = sizeof(WNDCLASSEX);
        wc.style         = 0;
        wc.lpfnWndProc   = WndProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = hInstance;
        wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
        wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH) (COLOR_WINDOW);
        wc.lpszMenuName  = NULL;
        wc.lpszClassName = g_szClassName;
        wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
    
        if(!(RegisterClassEx(&wc)))
        {
            return 0;
        }
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.