Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    [C++] WM_KEYDOWN edit box

    Allora ragazzi, io ho una edit box e sto cercando di capire quando un tasto viene premuto e il focus è nella edit box.

    Esempio, un WM_KEYDOWN nella procedura della finestra madre non rileva i tasti premuti quando il focus è sulla edit box....allora ho pensato di memorizzare su una stringa il contenuto della edit ogni volta che si riceve un EN_UPDATE e controllare l'ultimo carattere, ma è un metodo inutile perchè se io scrivo a metà riga o cancello un carattere, mi rileva come carattere premuto sempre l'ultimo della riga, invece non è lui......come potrei fare?

  2. #2
    L'edit control non mette a disposizione una notifica tipo WM_CHAR/WM_KEYDOWN, dal momento che mediamente questo genere di cose non interessa ai suoi utilizzatori. Puoi comunque intercettare il WM_KEYDOWN che viene inviato a lui (in fin dei conti un edit control è pur sempre una normale finestra) effettuandone il subclassing, ma forse questo è un argomento un po' avanzato per le tue attuali conoscenze...
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    bene

    bene, non sembra neanche troppo complicato il metodo delle subclassi, ma per adesso non posso provarlo perchè dev-c++ (che sto usando temporaneamente a causa di problemi con visual che devo reinstallare) non supporta alcune funzione dellaq commctrl che servono per le subclassi, quindi ricontinuerò questa discussione tra circa una settimana, quando spero di aver reinstallato visual, grazie comunque

  4. #4

    Re: bene

    Originariamente inviato da kirakira93
    bene, non sembra neanche troppo complicato il metodo delle subclassi, ma per adesso non posso provarlo perchè dev-c++ (che sto usando temporaneamente a causa di problemi con visual che devo reinstallare) non supporta alcune funzione dellaq commctrl che servono per le subclassi,
    Di che stai parlando? Per il subclassing basta la SetWindowLongPtr...
    quindi ricontinuerò questa discussione tra circa una settimana, quando spero di aver reinstallato visual
    Una settimana per reinstallare VS? Lavori su un 386?
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    ...

    allora il codice che ho scritto io è questo: non va bene?

    codice:
    //...
    
    case VM_CREATE:
    //...
    SetWindowSubclass(hwndEdit, SubclassEditBoxProc, 0, 0);
    break;
    //...
    
    LRESULT CALLBACK SubclassEditBoxProc(HWND hWnd, UINT uMsg, WPARAM wParam,
                                   LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
    {
    if(uMsg == WM_CHAR)
         {
         EBox("s");
         }
         
    return DefSubclassProc(hWnd, uMsg, wParam, lParam);
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    CE L'HO FATTA

    Siiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ce l'ho fatta


    codice:
    //prima del main
    typedef LRESULT CALLBACK (*pfWinProc) (HWND, UINT, WPARAM, LPARAM);
    pfWinProc EditOldProcedure;
    
    //...
    WM_CREATE:
    EditOldProcedure = (pfWinProc)SetWindowLongPtr(hwndEdit,GWLP_WNDPROC,(LONG_PTR)EditNewProcedure);
    //...
    
    
    
    LRESULT CALLBACK EditNewProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    if(message == WM_KEYDOWN && wParam == VK_RETURN || message == WM_CHAR && wParam == '\r')
            {
            if(wParam == '\r' && message == WM_CHAR)
                MessageBox(hwnd,"RETURN premuto","w kirakira93 che ce l'ha fatta :P",MB_ICONASTERISK);    
            return 0;  
            }
    
    return EditOldProcedure (hwnd, message, wParam, lParam);
    }
    Grazie mItaly!!!

  7. #7
    Ottimo lavoro; un paio di consigli aggiuntivi:
    • invece di chiamare la WndProc "vera" direttamente, sarebbe meglio usare CallWindowProc per richiamarla; non so se in questo caso si applichi il suo effettivo scopo, ma usarla non costa niente e si va sul sicuro;
    • invece di usare una variabile globale per memorizzare la wndproc precedente e/o altri dati, potresti allocare sull'heap una struttura in cui memorizzi tutte queste informazioni e metterne l'indirizzo nei dati utente associati all'editbox (sempre tramite SetWindowLongPtr), in modo da poter gestire indipendentemente più editbox subclassate. Per un esempio, dai un'occhiata qui (righe 553-598) e qui (righe 40-45).
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    Grazie Ancora

    Grazie mille

  9. #9
    Di niente, ciao!
    Amaro C++, il gusto pieno dell'undefined behavior.

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.