Positionnement fin fenêtre d'édition [Résolu]

Messages postés
34
Date d'inscription
jeudi 19 octobre 2006
Statut
Membre
Dernière intervention
13 juin 2007
- - Dernière réponse : yepla75
Messages postés
34
Date d'inscription
jeudi 19 octobre 2006
Statut
Membre
Dernière intervention
13 juin 2007
- 3 nov. 2006 à 15:57
Salut,

J'ai un programme qui crée une fenêtre type EDIT et écrit des données dedans.

Admettons que la fenêtre (munie d'un ascenceur vertical) puisse afficher 10 lignes de texte.

Quand les données écritent dépassent 10 lignes, la visu ne suit pas, c'est-à-dire qu'on voit à l'écran les 10 premières lignes, mais pour accéder aux autres, il faut utiliser l'ascenceur vertical.

J'aimerais que la visu se fasse automatiquement sur les lignes du bas (on voit ainsi défiler à l'écran les données envoyées).

Si quelqu'un a une idée,  (peut-être avec EM_SEL de SendMessage ?)

Merci
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
3
Merci
Oui, c'était juste pour montrer un exemple. Au pire tu fais un KillTimer au premier coup, comme ca plus de problème
En fait un simple PostMessage suffira:

  switch(uMsg)
  {
  case WM_CREATE :
    hed = CreateWindow("edit",0,
      WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_MULTILINE|ES_AUTOVSCROLL|ES_WANTRETURN,
      0,0,400,400,hWnd,NULL,g_hInst,NULL);
    PostMessage(hWnd, WM_APP + 1, 0, 0);
    break;
  case WM_APP + 1:
    for (k=0;k<50;k++)
    {
      SendMessage(hed,EM_SETSEL,l,l);
      SendMessage(hed,EM_REPLACESEL,0,(LPARAM)ch);
      l += strlen(ch);
    }
    break;

Attention à bien envoyer WM_APP avec PostMessage et pas SendMessage

_____________________________________
Un éditeur de ressources gratuit pour Windows

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 127 internautes nous ont dit merci ce mois-ci

Commenter la réponse de vecchio56
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
Normalement la propriété AutoVScroll à true fait cela, mais tu peux le simuler avec un SendMessage toutes les 10 lignes qui envoi la touche entrée (WantReturn) qui fait défiler vers le bas le texte.
Commenter la réponse de yann_lo_san
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
Oups, au fait, esceque tu rafraichis l'affichage à chaque ligne ?
Commenter la réponse de yann_lo_san
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
Mettre le curseur à la fin de hEdit:

int n = GetWindowTextLength(hEdit);
SendMessage(hEdit, EM_SETSEL, n, n);

_____________________________________
Un éditeur de ressources gratuit pour Windows
Commenter la réponse de vecchio56
Messages postés
34
Date d'inscription
jeudi 19 octobre 2006
Statut
Membre
Dernière intervention
13 juin 2007
0
Merci
Merci pour vos réponses, mais j'y arrive po... Je vous laisse un bout de code (de la fonction MainWndProc), si ça peut vous inspirer... merci

long l=0;
short k;
char ch[12] = "RAGNAGNA\r\n"";

switch(msg)
{
case WM_CREATE :
   hed = CreateWindow("edit","",WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_MULTILINE|ES_AUTOVSCROLL|ES_WANTRETURN,0,0,0,0,hwnd,NULL,hinst,NULL);
for (k=0;k<50;k++)
   {
   SendMessage(hed,EM_SETSEL,l,l);
   SendMessage(hed,EM_REPLACE_SEL,0,ch);
   l += strlen(ch);
   }

...
}
Commenter la réponse de yepla75
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
Effectivement ca ne marche pas, mais c'est seulement dû au fait que tu mettes ton code dans le WM_CREATE. Essaie ca:

  switch(uMsg)
  {
  case WM_CREATE :
    hed = CreateWindow("edit",0,
      WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_MULTILINE|ES_AUTOVSCROLL|ES_WANTRETURN,
      0,0,400,400,hWnd,NULL,g_hInst,NULL);
    SetTimer(hWnd, 0, 100, 0);
    break;
  case WM_TIMER:
    for (k=0;k<10;k++)
    {
      SendMessage(hed,EM_SETSEL,l,l);
      SendMessage(hed,EM_REPLACESEL,0,(LPARAM)ch);
      l += strlen(ch);
    }
    break;

_____________________________________
Un éditeur de ressources gratuit pour Windows
Commenter la réponse de vecchio56
Messages postés
34
Date d'inscription
jeudi 19 octobre 2006
Statut
Membre
Dernière intervention
13 juin 2007
0
Merci
Ca tourne ; si tu as 2mn, si tu peux m'expliquer pourquoi ca tourne avec WM_TIMER et pas avec WM_CREATE, ça m'avancerait le schmilblikk ; merci a+
Commenter la réponse de yepla75
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
Je voudrais bien t'expliquer mais je ne comprends pas non plus pourquoi ca ne marche pas

_____________________________________
Un éditeur de ressources gratuit pour Windows
Commenter la réponse de vecchio56
Messages postés
34
Date d'inscription
jeudi 19 octobre 2006
Statut
Membre
Dernière intervention
13 juin 2007
0
Merci
lol
Au fait, ça me fait pas plaisir, mais je retire la réponse acceptée ! Le problème avec ta soluce, c'est que toutes les 100ms, il m'affiche 10 fois le message, avec l'ascenceur en bas certes, mais je veux simplement afficher le message 10 fois (et pas 10 fois toutes les x secondes).
a+
Commenter la réponse de yepla75
Messages postés
34
Date d'inscription
jeudi 19 octobre 2006
Statut
Membre
Dernière intervention
13 juin 2007
0
Merci
Nickel ; WM_APP+1, c'est quoi (en gros) ? bon we
Commenter la réponse de yepla75
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
C'est un message que tu choisis. Tous les WM_APP+X sont libres

_____________________________________
Un éditeur de ressources gratuit pour Windows
Commenter la réponse de vecchio56
Messages postés
34
Date d'inscription
jeudi 19 octobre 2006
Statut
Membre
Dernière intervention
13 juin 2007
0
Merci
Rectificatif d'un de tes messages précédents : SendMessage marche bien avec WM_APP+X et même mieux !

En fait, dans mon programme, une fonction tourne en boucle, et je veux afficher dans la fenêtre EDIT : "traitement boucle i \n", avec i compteur de boucles dans la fonction.

Si je fais des SendMessage (i modulo 10 par exemple), j'aurais dans mon éditeur :
traitement boucle 0
traitement boucle 10
etc,
et ce durant l'exécution.

Si je fais un PostMessage (les messages poirotent dans la file d'attente je crois), une fois que ma fonction a fini de boucler, j'obtiens les lignes à l'écran. A moins que je me démerde mal...

en tout cas merci, ça cartonne ce WM_APP
Commenter la réponse de yepla75