Newsgroup: it.comp.programmare.win32
Titolo: [Visual C++] Finestre di dialogo

Ho realizzato una finestra di dialogo con VC++ 6.0 sotto Win 98.
Il tutto č stato fatto senza usare il winzard del Visual C.
Vorrei inserire un bottone Spin per poter andare a modificare un Edit Box.
Come faccio a sapere se č stato premuto il tasto in su o in giů dello Spin?
C'e' una funzione che mi da quest'informazione?
Un'altra domanda:
Ho creato un Edit Box di tipo numerico: come mai non riesco a digitare
numeri con la virgola?
Come posso ovviare al problema?
Grazie mille. :-)

numeri con la virgola?
La virgola non č un carattere numero (da 0 a 9) quindi non puoi.
Usi un edit box "normale" e ti devi gestire il messaggio WM_COMMAND e
il notification message EN_CHANGE oppure il messaggio WM_KEYDOWN
verificando il parametro wParam per il virtual key code.
Stefano "HappyMan" (Lago Maggiore - NO)
--
Personal Web 
http://www.sgr.info
Email happyman69 (at) 
libero.it

 controllo updown
Scusa la mia ignoranza;
Io ho fatto cosě:
Alla pressione di un tasto appare la mia finestra:
result=
DialogBoxParam(hInst,MAKEINTRESOURCE(IDD_REGOLAZIONI),hwnd,RegolazProc,0);
e la funzione che gestisce il tutto č cosě:
BOOL FAR PASCAL RegolazProc(HWND hwnd, unsigned msg, UINT wParam, LONG
lParam)
{
 char str[10];
 LPCSCROLLINFO lpsi;
  switch (msg)
  {
    case WM_INITDIALOG:
  MoveWindow( hwnd,500,250,300,300,TRUE);
  sprintf(str,"%1.3f",NCCF_VAL);
  SetDlgItemText (hwnd,IDC_NCCF_VALUE,str);
  sprintf(str,"%3d",DIF_VAL);
  SetDlgItemText (hwnd,IDC_SCURE_VALUE,str);
  CheckRadioButton(hwnd,IDC_IND_COL1,IDC_IND_COL2,IDC_IND_COL1);
  CheckRadioButton(hwnd,IDC_CONF1,IDC_CONF2,IDC_CONF1);
  CheckDlgButton(hwnd,IDC_NERI,BST_CHECKED);
  CheckDlgButton(hwnd,IDC_COLORATI,BST_CHECKED);
    case WM_COMMAND:
 switch (GET_WM_COMMAND_ID(wParam, lParam))
 {
  int a=0;
 case IDC_IND_COL1:
  curvaCol=1;
  break;
 case IDC_COLORATI:
  {
   UINT chk;
   chk=IsDlgButtonChecked(hwnd,IDC_COLORATI);
   if (chk==BST_CHECKED)
   {
    eliminaColorati=FALSE;
   }
   else
   {
    eliminaColorati=TRUE;
   }
  }
  break;
 case IDC_NERI:
  {
   UINT chk;
   chk=IsDlgButtonChecked(hwnd,IDC_NERI);
   if (chk==BST_CHECKED)
   {
    eliminaNeri=FALSE;
   }
   else
   {
    eliminaNeri=TRUE;
   }
  }
  break;
 case IDC_IND_COL2:
  curvaCol=2;
  break;
 case IDC_CONF1:
  curvaConf=1;
  break;
 case IDC_CONF2:
  curvaConf=2;
  break;
 case IDC_NCCF_UP:
  NCCF_VAL+=0.002;
  sprintf(str,"%1.3f",NCCF_VAL);
  SetDlgItemText (hwnd,IDC_NCCF_VALUE,str);
  break;
 case IDC_NCCF_DOWN:
  NCCF_VAL-=0.002;
  sprintf(str,"%1.3f",NCCF_VAL);
  SetDlgItemText (hwnd,IDC_NCCF_VALUE,str);
  break;
 case IDC_SCURE_UP:
  DIF_VAL+=10;
  sprintf(str,"%d",DIF_VAL);
  SetDlgItemText (hwnd,IDC_SCURE_VALUE,str);
  break;
 case IDC_SCURE_DOWN:
  DIF_VAL-=10;
  sprintf(str,"%d",DIF_VAL);
  SetDlgItemText (hwnd,IDC_SCURE_VALUE,str);
  break;
 case IDC_OK:
  GetDlgItemText (hwnd,IDC_NCCF_VALUE,str,10);
  NCCF_VAL=atof(str);
  GetDlgItemText (hwnd,IDC_SCURE_VALUE,str,10);
  DIF_VAL=atoi(str);
  EndDialog(hwnd, 0);
  break;
 }
 break;
  }
  return FALSE;
}
Scusa la mia ignoranza, ma come faccio ad intercettare il messaggio
WM_VSCROLL relativo al mio IDC_SPIN ?

  {
[cut]
	case WM_HSCROLL:
		bla bla;
		break;


 [cut]


sei sicuro che si faccia così?
a parte il fatto che casomai dovrebbe ricevere WM_VSCROLL e non HSCROLL,
ma da quanto mi risulta in questo modo ricevi il messaggio indirizzato
alla finestra di dialogo, non allo spin in essa contenuto; per ricevere
quello dello spin, penso che ci sia qualche notifica di WM_COMMAND.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 break;
Ho notato che come detto da MSDN in lParam č presente l'handle dello Spin:se
ne metto due a secnda di quale schiaccio il valore cambia ovviamente.
In wParam č presente nella parte bassa sempre il valore 4 (SB_THUMBPOSITION)
e nella parte alta un valore sempre positivo che parte da 0 e viene
incrementato se schiaccio le freccia in giů e decrementato se schiaccio
quella un su. Quando arriva a 0 e continuo a premere la freccia in su questo
perň rimane a 0.
Sai spiegarmi come mai?
E' questo l'unico modo che ho per sapere se ho premuto la freccia in su o in
giů del tastino?

quello dello spin, penso che ci sia qualche notifica di WM_COMMAND.
l'updown control dialoga con la parent window in divervi modi,
dall'help leggo:
messaggio WM_NOTIFY con notification UDN_DELTAPOS
(da win32.hlp trascrivo "The UDN_DELTAPOS message is sent before the
WM_VSCROLL or WM_HSCROLL message that actually changes the control's
position")
I messaggi WM_VSCROLL e HSCROLL sono in effetti *gli stessi* delle
scroll bar, infatti devi verificare l'id del controllo che ha generato
il messaggio:
id=GetWindowLong((HWND)lParam,GWL_ID);
if (id==IDC_UPDOWN)
	bla bla bla


Se a qualcuno può interessare ci sono riuscito e funziona.
Sono andato ad intercettare il msg WM_NOTIFY e ho proceduto come segue:
case WM_NOTIFY:
  {
   NMUPDOWN *lpnmud;
   lpnmud = (LPNMUPDOWN) lParam;
   if (lpnmud->hdr.idFrom==IDC_SPIN)
   {
    if (lpnmud->iDelta>0)
     DIF_VAL-=10;
    else
     DIF_VAL+=10;
    sprintf(str,"%d",DIF_VAL);
    SetDlgItemText (hwnd,IDC_SCURE_VALUE,str);
   }
   if (lpnmud->hdr.idFrom==IDC_SPIN1)
   {
    if (lpnmud->iDelta>0)
     NCCF_VAL-=0.002;
    else
