Newsgroup: it.comp.programmare.win32
Titolo: domanda banale

come faccio a fare in modo che aggiungendo del testo di varie righe ad una
edit box multiline (contenente già altre righe di testo) mi vengano
visualizzate le ultime righe inserite anziché le prime? un po' come accade
nella finestra del log di qualsiasi programma di chat insomma... vorrei
evitare di usare la clipboard (ho visto un esempio su MSDN che lo
faceva... O_o') perché all'utente naturalmente il contenuto della
clipboard potrebbe servire, quindi non lo devo distruggere durante questa
operazione.
grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

visualizzate le ultime righe inserite anziché le prime?
Devi essere certo che l'edit box abbia il focus:
SetFocus (hWndEdit);
Sposti il cursore (caret) alla fine impostando una selezione il
cui inizio e fine sono mooooooolto oltre il probabile termine del
testo con:
SendMessage (hWndEdit,EM_SETSEL,50000,50000);
Usi REPLACESEL per inserire il testo:
SendMessage (hWndEdit,EM_REPLACESEL,
      (WPARAM) FALSE,(LPARAM) " fine.");

Goodidea ha scritto:
ti ringrazio :)
per il fatto di assicurarsi che il cursore sia alla fine non è un
problema, basta usare GetWindowLength; ma ho un dubbio: SetFocus funziona
sulla edit box anche se l'applicazione non è attiva?? perché il principio
è più o meno come quello di una chat: potrebbe arrivare testo da
aggiungere da un socket anche in un momento in cui l'utente locale sta
facendo qualsiasi altra cosa...


sulla edit box anche se l'applicazione non è attiva??
Si', SetFocus funziona anche se l'applicazione non e' in "primo
piano".
Il problema potrebbe nascere quando l'utente sta lavorando su un
dialogo o una voce di menu e si vede togliere il "focus" dalla
edit box. Peggio ancora se sta selezionando un testo da copiare e
la EM_SETSEL gli sposta tutto in fondo...

 la EM_SETSEL gli sposta tutto in fondo...
be' la edit box in questione è readonly, solo che ce ne sta un'altra in
cui l'utente deve scrivere... l'applicazione è multithreading: se a un
thread arrivasse dal socket testo da aggiungere mentre il thread primario
sta processando gli input da tastiera che vanno alla edit box su cui
l'utente scrive, l'utente perderebbe il focus? questo in effetti è un
problema, è proprio necessaria la SetFocus? non funziona senza?


problema, è proprio necessaria la SetFocus? non funziona senza?
Sicuro di voler continuare ad usare i thread e perderti in una "selva
oscura"?
Ci sono altri modi.
E ci sono anche dei toolkit grafici di piu' alto livello per
facilitare la programmazione.
In particolare, perche' hai la necessita' di avere piu' di un thread
primario?
Saluti  Manlio Perillo

problema, è proprio necessaria la SetFocus? non funziona senza?
Nel mio test, monothread, la SetFocus e' obbligatoria.
Altrimenti affidati al messaggio EM_LINESCROLL, contando le linee
con EM_LINESCROLL e *soprattutto* calcolare cosa sta mostrando
l'edit box.
Se le pagine di testo non sono moltissime, usa questa roba:
int f,b,a=-1;
for (f=0;f<1000;f++)
   {
   SendMessage (hWndRE,EM_SCROLL,SB_PAGEDOWN,0);
   b = SendMessage (hWndRE,EM_GETTHUMB,SB_PAGEDOWN,0);
   if (b != a)
      a = b;
   else
      break;
   }
Pero' ricorda che spostare il testo in fondo, ogni volta che lo
aggiorni, puo' essere fastidioso per chi sta leggendo una
porzione di esso, magari l'inizio...

dunque, grazie ad entrambi per l'interessamento; questa storia
dell'interfaccia utente e del displayare sempre il fondo della edit box è
un vero problema: la SetFocus potrebbe infastidire l'utente mentre scrive,
il messaggio per lo scroll manuale sarebbe poco elegante a vedersi, ma
anche ammettendo che la SetFocus non crei problemi se l'utente sta
leggendo al centro e gli si sposta all'improvviso al fondo risulta un po'
fastidioso oltre che complesso da gestire già così.
lo stesso client MSN Messenger ha problemi simili di gestione nel log
della chat: quando rileggo i miei log devo sempre dire all'altra persona
di non scrivere, ma la cosa fastidiosa è che (forse è un bug
dell'interfaccia) mentre leggo anche se l'altro non scrive a un certo
punto la visuale si sposta automaticamente a dove si trova il cursore di
testo (solitamente in fondo quindi), cosa abbastanza fastidiosa :P
di conseguenza, siccome quello che sto facendo è un'interfaccia per
gestire shell remote, piuttosto che le edit box aprirò delle console e ci
scriverò con WriteFile :)
a proposito, se ne possono aprire più d'una in uno stesso processo? se non
si può al limite va bene lo stesso, obbligo l'utente ad aprirne una per
volta e mi salvo il log in un buffer quando una viene chiusa.


 primario?
perché mentre l'utente scrive il thread primario deve processare gli input
dell'utente, e gli altri thread potrebbero dover ricevere dati dalle
rispettive connessioni; se uso un solo thread non posso scrivere mentre
ricevo dati :)



Io ti stavo consigliando tutt'altro :-).
Python + Twisted + pyGTK.
Saluti  Manlio Perillo

 nella finestra del log di qualsiasi programma di chat insomma...
Perchè non usi una listbox?
Ciao
E.G.

 Python + Twisted + pyGTK.
e non conosco nessuno dei 3 :|
faccio prima a scrivere tutto in Win32 (come ho fatto) che ad imparare
queste tre cose... ^^
a proposito, pyGTK cos'è una versione in Python delle GTK? be', quelle in
effetti avevo comunque intenzione di impararle prima o poi...


 Perchè non usi una listbox?
non ha il wordwrapping e il log che scrivo contiene linee anche *mooolto*
lunghe ^^


effetti avevo comunque intenzione di impararle prima o poi...
ho cominciato ad usarle sul serio da poco, e sono veramente molto ben
disegnate.
Unica 'pecca':
non sono state pensate per essere multipiattaforma (anche se
l'architettura a strati lo rende possibile molto facilmente), e quindi
tutti i "widget" sono stati creati da zero.
Quindi, in pratica, niente controlli nativi di Windows (come il
FileDialog o simili) e questo a molti (me incluso, in parte) non
piace...
Saluti  Manlio Perillo

 lunghe ^^
Allora: ho una dialog con MFC, sopra una text box IDC_EDIT_1 con questi 
stili:
Multiline si
Vertical scroll si, tutti gli altri scroll no
Inoltre ho un timer ogni secondo
Questo è il codice
void CLogTextDlg::OnTimer(UINT nIDEvent)
{
	static int i = 0;
	CString sNum;
	sNum.Format("%d", ++i);
	CEdit* pEd = (CEdit*)GetDlgItem(IDC_EDIT1);
	CString sTxt;
	pEd->GetWindowText(sTxt);
	sTxt += sNum + _T("Testo molto lungo bla bla bla bla bla bla bla bla 
bla bla bla bla bla bla bla bla \r\n");
	pEd->SetWindowText(sTxt);
	pEd->SetSel(INT_MAX, INT_MAX, FALSE);	
 
	CDialog::OnTimer(nIDEvent);
}
Ciao
E.G.