Newsgroup: it.comp.programmare.win32
Titolo: Limitare i caratteri di una text box

Ho un problema con le windows api, sto cercando di limitare i
caratteri che possono essere scritti in una textbox(ad esempio vorrei
che si potessero scrivere solo lettere e non numeri).
Io ho provato a cambiare la WNDPROC della mia textbox e ne ho
impostata una creata da me con questa tramite il messaggio WM_CHAR
riesco a selezionare i caratteri che arrivano alla textbox ma non so
come poi scriverli nella textbox,qualcuno di voi mi puņ aiutare?? o mi
puņ consigliare qualche metodo altervativo per risolvere il mio
problema?? Grazie in anticipo
Giovanni

On 3 Apr 2002 09:33:07 -0800, 
ra...@lastanzadellefate.com
 (Giovanni)
wrote:
[cut]
Ti incollo un po' di codice da un mio vecchio progetto che ti puoi
studiare, anche se non lo commento in dettaglio dovrebbe essere
abbastanza chiaro.
In pratica a seconda dell'id della finestra hai a disposizione un
controllo per inserire le date, interi o float.
Ciao
Stefano
LRESULT WINAPI KeyPressedProc(HWND hwnd,UINT message,WPARAM
wParam,LPARAM lParam)
{
	WNDPROC EditProc;
   char buffer[SMALLBUFFER],value[SMALLBUFFER];
   DWORD start,end;
	HINSTANCE hInst;
   HWND hCal;
   RECT rect;
   LONG id;
   id=GetWindowLong(hwnd,GWL_ID);
   switch (message)
	{
		case WM_KEYUP:
      	switch (wParam)
      	{
				case VK_F2:
SendMessage(GetParent(hwnd),WM_PARENTNOTIFY,MAKEWPARAM(WM_LBUTTONDBLCLK,id),(LPARAM)hwnd);
   				break;
            case VK_F4:
            	if (id>=IDC_DATE && id<=IDC_DATE+99)
               {
hInst=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
   	            GetWindowRect(hwnd,&rect);
hCal=CreateWindowEx(0,MONTHCAL_CLASS,"",WS_VISIBLE|WS_BORDER|WS_POPUP|MCS_NOTODAY,rect.left,rect.bottom,200,150,GetParent(hwnd),(HMENU)0,hInst,NULL);
						// Effettuo un
subclassing del controllo MonthCalendar
EditProc=(WNDPROC)GetWindowLong(hCal,GWL_WNDPROC);
SetWindowLong(hCal,GWL_USERDATA,(LONG)EditProc);
SetWindowLong(hCal,GWL_WNDPROC,(LONG)MonthCalendarProc);
                  SetProp(hCal,"DateCtrl",hwnd);
               }
					break;
         }
         break;
      case WM_KEYDOWN:
      	switch (wParam)
      	{
         	case VK_DELETE:
		      	if ((id>=IDC_FLOAT && id<=IDC_FLOAT+99) ||
(id>=IDC_INTEGER && id<=IDC_INTEGER+99))
   	         {
SendMessage(hwnd,EM_GETSEL,(WPARAM)(LPDWORD)&start,(LPARAM)(LPDWORD)&end);
SendMessage(hwnd,WM_GETTEXT,(WPARAM)SMALLBUFFER,(LPARAM)buffer);
SendMessage(hwnd,WM_SETTEXT,(WPARAM)0,(LPARAM)buffer);
SendMessage(hwnd,EM_SETSEL,(WPARAM)(INT)start,(LPARAM)(INT)end);
            	}
         }
         break;
   	case WM_CHAR:
      	if (id>=IDC_FLOAT && id<=IDC_FLOAT+99)
         {
         	if ((wParam<'0' || wParam>'9') && wParam!='.' &&
wParam!='-' && wParam!=8)
               return(0);
SendMessage(hwnd,EM_GETSEL,(WPARAM)(LPDWORD)&start,(LPARAM)(LPDWORD)&end);
SendMessage(hwnd,WM_GETTEXT,(WPARAM)SMALLBUFFER,(LPARAM)buffer);
SendMessage(hwnd,WM_SETTEXT,(WPARAM)0,(LPARAM)buffer);
SendMessage(hwnd,EM_SETSEL,(WPARAM)(INT)start,(LPARAM)(INT)end);
	         break;
         }
      	if (id>=IDC_INTEGER && id<=IDC_INTEGER+99)
         {
         	if ((wParam<'0' || wParam>'9') && wParam!='-' &&
wParam!=8)
            	return(0);
SendMessage(hwnd,EM_GETSEL,(WPARAM)(LPDWORD)&start,(LPARAM)(LPDWORD)&end);
SendMessage(hwnd,WM_GETTEXT,(WPARAM)SMALLBUFFER,(LPARAM)buffer);
SendMessage(hwnd,WM_SETTEXT,(WPARAM)0,(LPARAM)buffer);
SendMessage(hwnd,EM_SETSEL,(WPARAM)(INT)start,(LPARAM)(INT)end);
	         break;
         }
         break;
		case WM_KILLFOCUS:
      	if (id>=IDC_DATE && id<=IDC_DATE+99)
         {
SendMessage(hwnd,WM_GETTEXT,(WPARAM)SMALLBUFFER,(LPARAM)buffer);
            if (strlen(buffer)!=10 || strlen(buffer)!=6)
SendMessage(hwnd,WM_SETTEXT,(WPARAM)0,(LPARAM)"");
            DateToNumber(buffer,value);	// Verifico la correttezza
            if (!strcmp(value,""))
SendMessage(hwnd,WM_SETTEXT,(WPARAM)0,(LPARAM)"");
	         else
SendMessage(hwnd,WM_SETTEXT,(WPARAM)0,(LPARAM)buffer);
         }
         break;
      case WM_LBUTTONDBLCLK:
SendMessage(GetParent(hwnd),WM_PARENTNOTIFY,MAKEWPARAM(WM_LBUTTONDBLCLK,id),(LPARAM)hwnd);
         break;
   }
   EditProc=(WNDPROC)GetWindowLong(hwnd,GWL_USERDATA);
return(CallWindowProc((WNDPROC)EditProc,hwnd,message,wParam,lParam));
}
Stefano "HappyMan" (Lago Maggiore - NO)
--
Personal Web 
http://www.sgr.info
Email 
happyman...@libero.it
 [Togliere nospam per scrivermi]
Salsa Web 
http://happyman.n3.net
 [Foto salseri/e & I.A.B.L.A. Ring]

 Giovanni
Ti suggerisco di utilizzare la tua wndproc come filtro e non come editor.
Di seguito trovi una bozza di come potrebbe essere la tua edtproc, assumo
che in DefEdtProc abbia registrata la vecchia proc del controllo.
(il codice non l'ho comunque testato)
Buon Lavoro.
LRESULT APIENTRY EdtProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam)
{
 HWND hwndParent ;
 switch (uMsg)
 {
 case WM_CHAR:
  switch (wParam){
  case 48: /* Serie di case per cui non voglio sia scritto il carattere */
  case 49:
  case 50:
  case 51:
  case 52:
  case 53:
  case 54:
  case 55:
  case 56:
  case 57:
   return (TRUE)    ;    /* esco senza fare nulla */
 default:
   break ;   /* non faccio nulla sarà la vecchia proc ad occuparsi della
scrittura */
  }
  break;
 case WM_GETDLGCODE:
  return (DLGC_WANTALLKEYS | DLGC_HASSETSEL) ;
 }
   return (CallWindowProc(DefEdtProc, hwnd, uMsg,wParam, lParam)); /*
riposto il messaggio alla vecchia proc */
}