WIN32 Edit box avec le style ES_NUMBER [Résolu]

Signaler
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
-
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
-
Bonjour à tous,

J'ai un Edit box qui possède le style ES_NUMBER.
J'aimerai, lorsque j'entre des chiffres, qu'il m'affiche un espace symbolisant  les milliers et les millions.
Par exemple je tape 1000000, j'aimerai avoir 1 000 000
Existe t'il un moyen de faire cela?

A+
________________________________________________________________________________
Mon site internet :   http://ImAnalyse.free.fr

4 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
18
J'ai fait un petit truc à la va vite, semble aller.
Me suis contenté de l'event killfocus, tu adapteras.

Une dialog avec 2 EDIT en ES_NUMBER :

WNDPROC OldProcEdNum;


void FrmtEditNbr(HWND hed)
{
  char buf[20], res[20], *c, *d, a;
  DWORD len;
  len = GetWindowText(hed, buf, 19);
  if(0 >= (long) len) return;
  c = buf;
  d = buf;
  while(a = *c) {
    c++;    if(a !32) *d++ a;
  }
  *d = 0;
  len = d - buf;
  c = buf;
  d = res;
  if(len < 4) {
    while(*d = *c) {c++; d++;}
    goto dispRES;
  }
  len %= 3;
  if(len) {
    do {
      *d++ = *c++;
    } while(--len);
    *d++ = 32;
  }
  while(*d++ = *c++) {
    if(++len == 3) {
      *d++ = 32;
      len = 0;
    }
  }
  *(d - 2) = 0;
dispRES: SetWindowText(hed, res);
}


LRESULT CALLBACK EdProcNbr(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)
{
  if(mssg == WM_PASTE) return 0;
  if(mssg == WM_KILLFOCUS) FrmtEditNbr(hwnd);
  return CallWindowProc(OldProcEdNum, hwnd, mssg, wParam, lParam);
}


void onInitDlg(HWND hdlg)
{
  HWND hctrl;
  SetClassLongPtr(hdlg, GCLP_HICON, (long)LoadIcon(0, IDI_APPLICATION));
  hctrl = GetDlgItem(hdlg, IDED_NBR1);
  SendMessage(hctrl, EM_LIMITTEXT, 13, 0);
  OldProcEdNum = (WNDPROC) SetWindowLong(hctrl, GWL_WNDPROC, (long) EdProcNbr);
  hctrl = GetDlgItem(hdlg, IDED_NBR2);
  SendMessage(hctrl, EM_LIMITTEXT, 13, 0);
  SetWindowLong(hctrl, GWL_WNDPROC, (long) EdProcNbr);
}

ciao...
BruNews, MVP VC++
Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
2
Bonjour,

La solution est de dériver une classe de CEdit que tu vas associer à ton contrôle. Dans cette classe, tu interceptes le message OnKeyDown et tu formattes ton texte comme tu veux avant de l'afficher dans le contrôle.

Il existe pas mal de classes pour ça, tu devrais en trouver une.

ed73
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
Merci beaucoup BruNews! C'est exactement ce que je cherchais.

Merci aussi ed73 pour avoir pris le temps de me répondre.

A+
________________________________________________________________________________
Mon site internet :   http://ImAnalyse.free.fr
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
Bonjour

J'ai une seconde petite question concernant les EDIT_BOX. J'aimerai que lorsque le contrôle gagne le focus, tout le texte soit sélectionné et mis en highlight.
J'ai fait cela:

LRESULT CALLBACK EdProcNbr(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)
{
  if(mssg == WM_PASTE) return 0;
  if(mssg == WM_KILLFOCUS) FrmtEditNbr(hwnd);
  if(mssg == WM_SETFOCUS) SendMessage(hwnd, EM_SETSEL, 0, -1); 
 
  return CallWindowProc(OldProcEdNum, hwnd, mssg, wParam, lParam);
}

Le texte est bien sélectionné mais il n'y a pas de highlight à l'affichage. Connaissez vous un moyen de le faire?
A+
_________________________________________________________________________
Mon site internet :http://ImAnalyse.free.fr 
http://ImAnalyse.free.fr