Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    83

    C - Pulsante con le API di Windows

    Salve a tutti...

    Ho una finestra, ed ho aggiunto un pulsante con la CreateWindowEx:

    HWND pulsante = CreateWindowEx("BUTTON","Premimi", {resto dei parametri.....} ,... );

    Il pulsante si vede ed è tutto Ok, vorrei solo poter associargli degli eventi, tipo quando è cliccato...

    Come posso farlo ad intercettare dalla Window Procedure ?
    Inoltre, dimentico qualcosa; tipo qualche identificatore o altre cose per il pulsante???

    P.S. Non rimandatemi su MSDN please... Non ho trovato nulla che possa farmelo capire facilmente.

    grazie a tutti
    #include <pgnvni.h>

  2. #2
    Devi processare il messaggio WM_COMMAND nella window procedure della finestra proprietaria del pulsante.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Il codice seguente crea due pulsanti(btn1 e btn2):

    codice:
    #include <windows.h>
    
    #define ID_BTN1 101
    #define ID_BTN2 102
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("Bottoni");
         HWND         hwnd;
         MSG          msg;
         WNDCLASS     wndclass;
         
         wndclass.style         = CS_HREDRAW | CS_VREDRAW;
         wndclass.lpfnWndProc   = WndProc;
         wndclass.cbClsExtra    = 0;
         wndclass.cbWndExtra    = 0;
         wndclass.hInstance     = hInstance;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW);
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
         wndclass.lpszMenuName  = NULL;
         wndclass.lpszClassName = szAppName;
         
         if (!RegisterClass (&wndclass))
         {
              MessageBox (NULL, TEXT ("Errore nella chiamata a RegisterClass!"),
                          szAppName, MB_ICONERROR);
              return 0;
         }
         
         hwnd = CreateWindow (szAppName, TEXT ("Bottoni in Win API"),
                              WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              NULL, NULL, hInstance, NULL);
    
         ShowWindow (hwnd, iCmdShow);
         UpdateWindow (hwnd);
         while (GetMessage (&msg, NULL, 0, 0))
         {
    		 TranslateMessage (&msg);
    		 DispatchMessage (&msg);
         }
         return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         static HWND  hwndButton1;
         static HWND  hwndButton2;
    
         static int   cxChar, cyChar;
         
         switch (message)
         {
         case WM_CREATE :
              cxChar = LOWORD (GetDialogBaseUnits ());
              cyChar = HIWORD (GetDialogBaseUnits ());
              
              hwndButton1 = CreateWindow(
    			  TEXT("button"), 
                  TEXT("btn 1"),
    			  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
    			  cxChar,
    			  cyChar,
    			  20 * cxChar, 7 * cyChar / 4,
    			  hwnd,
    			  (HMENU)ID_BTN1,
    			  ((LPCREATESTRUCT)lParam)->hInstance,
    			  NULL);
    
              hwndButton2 = CreateWindow(
    			  TEXT("button"), 
                  TEXT("btn 2"),
    			  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
    			  cxChar,
    			  cyChar * 3,
    			  20 * cxChar, 7 * cyChar / 4,
    			  hwnd,
    			  (HMENU)ID_BTN2,
    			  ((LPCREATESTRUCT) lParam)->hInstance,
    			  NULL);
    
              return 0;
             
         case WM_COMMAND :
    
    		 if ( HIWORD(wParam) == BN_CLICKED )
    		 {
    			if ( LOWORD(wParam) == ID_BTN1 )
    				MessageBox(hwnd, TEXT("Ciao dal bottone 1"), TEXT("Ciao"), MB_OK);
    			else if ( LOWORD(wParam) == ID_BTN2 )
    				MessageBox(hwnd, TEXT("Ciao dal bottone 2"), TEXT("Ciao"), MB_OK);
    		 }
              break ;
              
         case WM_DESTROY :
              PostQuitMessage(0);
              return 0;
         }
    
         return DefWindowProc (hwnd, message, wParam, lParam);
    }
    Per intercettare i messaggi dei button, devi gestire il messaggio WM_COMMAND nella window procedure.
    Quando viene premuto un pulsante, la procedura riceve il messaggio WM_COMMAND con i seguenti parametri:

    - La parola bassa di wParam contiene l'ID del controllo che abbiamo utilizzato nella chiamata a CreateWindow per creare il pulsante.
    - La parola alta di wParam contiene il codice di notifica del pulsante. Noi siamo interessati all'evento "click" e, dunque, gestiamo soltanto i messaggi con codice di notifica uguale a BN_CLICKED.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    83
    Grazie, ho un ultimo dubbio; per quanto riguarda questi cast che significati hanno?

    ( HMENU )ID_BTN2
    ( (LPCREATESTRUCT) lParam)->hInstance

    Il secondo mi lascia completamente spaesato...


    Sono obbligatori?
    #include <pgnvni.h>

  5. #5
    La funzione CreateWindow è così dichiarata:

    codice:
    HWND CreateWindow(          LPCTSTR lpClassName,
        LPCTSTR lpWindowName,
        DWORD dwStyle,
        int x,
        int y,
        int nWidth,
        int nHeight,
        HWND hWndParent,
        HMENU hMenu,
        HINSTANCE hInstance,
        LPVOID lpParam
    );
    Il parametro hMenu specifica o l'handle del menù associato alla finestra o, come nel nostro caso, l'ID di un controllo figlio. Ogni controllo figlio deve avere un identificatore univoco. Associando tale valore in fase di creazione del controllo, siamo in grado, nella gestione del messaggio WM_COMMAND, di sapere qual è il controllo che ha inviato la notifica:

    codice:
    ...
    ...
    if ( LOWORD(wParam) == ID_BTN1 )
    	MessageBox(hwnd, TEXT("Hai premuto il bottone 1"), TEXT("Ciao"), MB_OK);
    else if ( LOWORD(wParam) == ID_BTN2 )
    	MessageBox(hwnd, TEXT("Hai premuto il bottone 2"), TEXT("Ciao"), MB_OK);
    ...
    ...
    Per hInstance(rappresenta l'handle dell'istanza del modulo associato alla finestra) puoi anche passare NULL:

    codice:
              hwndButton2 = CreateWindow(
    			  TEXT("button"), 
                  TEXT("btn 2"),
    			  WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
    			  cxChar,
    			  cyChar * 3,
    			  20 * cxChar, 7 * cyChar / 4,
    			  hwnd,
    			  (HMENU)ID_BTN2,
    			  NULL, /* ((LPCREATESTRUCT)lParam)->hInstance, */
    			  NULL);

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    83
    Bene, grazie per i chiarimenti, ora devo solo capire perchè fai partire gli ID dei pulsanti da 101 e 102... Per il resto penso di aver capito abbastanza!
    #include <pgnvni.h>

  7. #7
    Originariamente inviato da pgnvni
    Bene, grazie per i chiarimenti, ora devo solo capire perchè fai partire gli ID dei pulsanti da 101 e 102... Per il resto penso di aver capito abbastanza!
    Puoi farli partire da 1 o da 1000, non ha importanza. La cosa importante è che ogni controllo figlio abbia un identificatore univoco.


  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    83
    Ok... Ho provato e funziona tutto, ho solo levato getStockObject perchè il compilatore mi diceva: "undefined reference".

    Da dove le hai studiate le Api di Windows?

    Grazie per avermi illuminato
    #include <pgnvni.h>

  9. #9
    Sicuro di averlo messo giusto, con la maiuscola?
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    83
    No scusami era con la G maiuscola, ma ugualmente quando compilo il compilatore si lamenta... Evidentemente devo linkare anche una libreria statica boh...

    il problema comunque l'ho risolto con:

    (HBRUSH) COLOR_WINDOW
    #include <pgnvni.h>

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.