Newsgroup: it.comp.programmare.win32
Titolo: WS_TABSTOP e BS_DEFPUSHBUTTON, aiuto...

Ciao a tutti e buon fine settimana!
Vorrei creare una semplice finestra (in C) con una editbox e un pulsante
di default.
L'edit la creo così:
editbox = CreateWindow ( TEXT("edit"), "",
            WS_CHILD | WS_VISIBLE |WS_BORDER|WS_TABSTOP,
            0, 0,
            15 * cxChar, 7 * cyChar / 4,
            hwnd, (HMENU) 3,
            ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
ed il bottone di default lo creo così:
defbutton = CreateWindow ( TEXT("button"), "",
            WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON|WS_TABSTOP,
            110, 110,
            15 * cxChar, 7 * cyChar / 4,
            hwnd, (HMENU) 4,
            ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
Poi chiamo SetFocus(editbox) (in WM_CREATE) perchè voglio che l'utente
inserisca il testo.
Il problema (anzi, i problemi sono i seguenti):
1. Vorrei che anche quando sono sull'editbox (o su un'altra finestra che
creo sempre all'interno di questa procedura) e schiaccio ENTER è come se
premessi col mouse il tasto defbutton. Insomma, se ho capito bene è la
funzione che dovrebbe svolgere lo stile BS_DEFPUSHBUTTON, ma invece se
sono per esempio sull'editbox e schiaccio ENTER non succede nulla.
2. Il bottone assume un strano atteggiamento.Se mi muovo col tasto TAB
dall'editbox al defbutton, questo prende l'input focus ma non è
cliccabile, cioè quando ha sopra l'input focus e schiaccio ENTER non
succede nulla.
Stessa cosa accade se, una volta premuto il bottone, la procedura si
accorge che editbox contiene una stringa non valida. Allora lancia una
MessageBox; quando poi chiudo la MessageBox e rimando l'input focus alla
finestra editbox stesso problema: correggo la stringa, schiaccio TAB, il
defbutton ha l'input focus ma se schiaccio ENTER non succede nulla.
Spero di non essere stato troppo noioso...
Grazie a tutti quelli che mi daranno una mano!
Buona giornata.
GB
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 di default.
[cut]
Ciao, ti rispondo ancora io e poiche' ho una buona conoscenza del Windows
SDK ... mi permetto, se non ti dispiace, di darti solo alcuni consigli.
---------
Ti consiglio di creare all'inizio del sorgente una define per ognuno dei
controlli della tua finestra. Esempio:
    #define IDC_EDITBOX_TESTO             1000
    #define IDC_BUTTON_PULSANTE      1001
E' buona norma usare numeri alti (il Visual C++ ad esempio nel suo "dialog
editor" parte proprio da 1000 per numerare i controlli !). Il motivo e' che
ci sono dei valori predefiniti (vedi in winuser.h, IDOK, IDCANCEL, ecc...)
che partono da 1 e con cui non confondersi.
---------
Per il TAB e WS_TABSTOP, ti ho gia' risposto: basta usare la funzione
IsDialogMessage nel loop dei messaggi.
while (GetMessage (&msg, NULL, 0, 0))
{
   if (!IsDialogMessage (hwnd_finestra, &msg))
   {
      TranslateMessage (&msg);
      DispatchMessage (&msg);
   }
}
Ormai dovrebbe esserti chiaro !
---------
Per il tasto ENTER la questione e' un po' diversa. Lo stile BS_DEFPUSHBUTTON
indica soltanto al pulsante come deve apparire (con un bordo scuro intorno
per far vedere che e' quello di default).
Quando premi ENTER, la funzione IsDialogMessage "se ne accorge" (filtra il
messaggio) e invia alla window procedure un messaggio particolare:
DM_GETDEFID
Questo messaggio e' definito come WM_USER+0 (vedi sempre in winuser.h).
Bene questo messaggio "chiede" alla window procedure di indicare quale e' il
controllo di default.
Tu devi rispondere a questo messaggio semplicemente cosi':
case DM_GETDEFID:
    return MAKELRESULT (IDC_BUTTON_PULSANTE, DC_HASDEFID);
Cioe' rispondi che esiste un identificativo di default di valore
IDC_BUTTON_PULSANTE.
Fatto questo vedrai che alla window procedure ti arrivera' subito dopo il
messaggio WM_COMMAND con l'identificativo del pulsante quando premi ENTER.
Qualunque sia il controllo che ha il focus nel momento in cui premi ENTER,
proprio come se avessi fatto click sul pulsante di default !
---------
Spero di esserti stato di aiuto.
Ciao.