Positionnement fin fenêtre d'édition

Résolu
yepla75 Messages postés 34 Date d'inscription jeudi 19 octobre 2006 Statut Membre Dernière intervention 13 juin 2007 - 2 nov. 2006 à 14:22
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

12 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 nov. 2006 à 11:34
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
3
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
2 nov. 2006 à 15:13
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.
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
2 nov. 2006 à 15:15
Oups, au fait, esceque tu rafraichis l'affichage à chaque ligne ?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
2 nov. 2006 à 15:33
Mettre le curseur à la fin de hEdit:

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

_____________________________________
Un éditeur de ressources gratuit pour Windows
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yepla75 Messages postés 34 Date d'inscription jeudi 19 octobre 2006 Statut Membre Dernière intervention 13 juin 2007
3 nov. 2006 à 10:27
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);
   }

...
}
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 nov. 2006 à 11:05
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
0
yepla75 Messages postés 34 Date d'inscription jeudi 19 octobre 2006 Statut Membre Dernière intervention 13 juin 2007
3 nov. 2006 à 11:17
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+
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 nov. 2006 à 11:22
Je voudrais bien t'expliquer mais je ne comprends pas non plus pourquoi ca ne marche pas

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
yepla75 Messages postés 34 Date d'inscription jeudi 19 octobre 2006 Statut Membre Dernière intervention 13 juin 2007
3 nov. 2006 à 11:25
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+
0
yepla75 Messages postés 34 Date d'inscription jeudi 19 octobre 2006 Statut Membre Dernière intervention 13 juin 2007
3 nov. 2006 à 12:03
Nickel ; WM_APP+1, c'est quoi (en gros) ? bon we
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 nov. 2006 à 12:37
C'est un message que tu choisis. Tous les WM_APP+X sont libres

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
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
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
0
Rejoignez-nous