|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2001
Città: Modugno (BA)
Messaggi: 165
|
[C++] Intercettare movimento cursore in un editor
Ho un editor di testo. In realtà è quello che si ottiene nell'ambiente Visual C++ 6 quando con il wizard si crea una nuova applicazione MFC single document, scegliendo la CEditView come classe base per la vista.
A questo editor ho aggiunto delle funzioni accessibili da menù per fare delle elaborazioni sui file di testo aperti. Ma questo non è importante ora. Ciò che vorrei sapere è come poter visualizzare il numero di linea (e magari di colonna) corrispondenti alla posizione del cursore, nella status bar in basso (come nel notepad, tanto per capirci). Diciamo che a ricavare il numero di riga dalla posizione del cursore, ci sono più o meno riuscito. Però questo calcolo dovrebbe essere fatto ad ogni spostamento del cursore, quindi mi servirebbe intercettare l'evento di spostamento del cursore. Infine dovrei mandare l'informazione alla status bar (ma penso che a questo ci penserò dopo). Spero di essermi spiegato bene, non saprei come meglio rendere il concetto, avendo poca esperienza di programmazione. Grazie per eventuali suggerimenti. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Provo a ti faccio sapere...comunque con MFC non ti aspettare di poter fare grandi cose
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Prov. Bari
Messaggi: 1771
|
mi iscrivo, dato che la cosa interessa anche me
__________________
Слава Україні! |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Mi sa che ho trovato un altro metodo...un attimo...
Ultima modifica di cionci : 06-02-2007 alle 14:49. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ecco qua:
CEdit &edit = this->GetEditCtrl(); int startchr, endchr; edit.GetSel(startchr, endchr); edit.LineFromChar(endchr) //per la riga endchr-edit.LineIndex(edit.LineFromChar(endchr)) //per la colonna |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2001
Città: Modugno (BA)
Messaggi: 165
|
Uhm, cionci grazie. Purtroppo non è quello che mi serve. ^^
Ti spiego. Il numero di linea sono riuscito a ricavarmelo, il problema è che quando muovi il cursore con i tasti freccia, con il mouse o in altro modo, ogni volta va ricalcolato il numero di linea. Quello che mi serve appunto, come dicevo nel primo post, è un evento (appartenente al ceditview, al cedit, al cframe, al cwnd o quello che è) che risponda agli spostamenti del cursore, in modo da richiamare ogni volta le operazioni che hai detto anche tu. Ho visto che nel cwnd ci sono metodi, tipo OnKeyUp, che forse potrebbero essere associati alla pressione dei tasti freccia, ma sinceramente non capisco bene come funzionano (per l'esatezza nn capisco gli argomenti) e non so se fanno al caso mio. Comunque grazie ancora per esserti sbattuto. Se dovessi avere qualche altra idea sono tutto orecchie. Ultima modifica di ArtificialBoy : 06-02-2007 alle 17:20. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
Codice:
void CTuaView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
POINT pt;
GetCursorPos( &pt );
TRACE2("pos: x=%d - y=%d\n", pt.x, pt.y);
CView::OnMouseMove(nFlags, point);
}
ciao |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2001
Città: Modugno (BA)
Messaggi: 165
|
Grazie anche a te per l'intervento. Purtroppo muovere il mouse sulla finestra non equivale a muovere il cursore. Dovrei clickare col sinistro per spostare il cursore altrove. Credo ci sia anche l'evento per il click sinistro ma non ne capisco gli arogmenti come per OnKeyUp.
Inoltre dovrei comunque implementare altri eventi legati alla frecce direzionali o alla pressione del tasto Invio che manda a capo e sposta il cursore o anche dei tasti Home e Fine. Magari però esiste un modo più semplcie di tutto questo e nella mia ignoranza non so vederlo. °° |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
sono un po fuso ho letto cursore e ho pensato al mouse
cerco ancora... |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
ok, ho la mente lucida ora:
Codice:
void CTuaView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if (nChar == VK_PRIOR)
TRACE0("pgup\n");
else if (nChar == VK_NEXT)
TRACE0("pgdown\n");
else if (nChar == VK_UP)
TRACE0("arrowup\n");
else if (nChar == VK_DOWN)
TRACE0("arrowdown\n");
else if (nChar == VK_RETURN)
TRACE0("return\n");
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Tanto vale aggiornarlo per ogni tasto rilasciato e per ogni click.
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Oct 2001
Città: Modugno (BA)
Messaggi: 165
|
Uh, ecco, allora funziona così quell'evento. °° A guardarlo così codificato mi pare debba essere quello che mi serve, dunque domani proverò a implementarlo.
Grazie. Se tutto va bene, poi magari vi chiedo come mandare le info alla status bar. Ovviamente prima ci proverò da solo. |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Mi sa che ti serve OnKeyUp anche perchè altrimenti rilevi il valore prima dell'inserimento del carattere
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
Quote:
per la status bar guardati in giro, esistono molti esempi in rete i miei siti di riferimento sono: codeproject e codeguru edit: http://msdn2.microsoft.com/en-us/lib...y6(VS.80).aspx per i parametri della funzione onkeyup Ultima modifica di vizzz : 06-02-2007 alle 20:08. |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Oct 2001
Città: Modugno (BA)
Messaggi: 165
|
Sì, avevo pensato anche io di usare il KeyUp.
Terrò presente quei due siti. Grazie. E comunque aggiornerò sui risultati. |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Comunque non basta quell'evento e nemmeno quelli per il mouse a meno di gestire una combinazione di eventi...in ogni caso ci deve essere qualcos'altro...un messaggio magari che viene lanciato per qualsiasi modifica fatta nell'edit box...compreso il cambiamento di posizione del cursore...
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Allora...il migliore è:
ON_CONTROL_REFLECT_EX(EN_CHANGE, OnEditChange) In combinazione con WM_KEYUP per prendere i tasti freccia... Il problema ora è il mouse... |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Oct 2001
Città: Modugno (BA)
Messaggi: 165
|
Effettivamente se io faccio un paste da menù o da tasto destro dle mouse, non intercetterebbe lo spostamento. Ora guardo quest'altro evento che mi dici.
Comunque, prima di chiedere qui, non riuscivo a capire come funzionasse l'OnKeyUp perché non ci pensavo che venisse chiamato dal framework e quindi i parametri non dovessi passarli io. EDIT: cmq a me sembra strano che nn esista un metodo un po' più rapido per fare il tutto °° Ultima modifica di ArtificialBoy : 07-02-2007 alle 15:24. |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
L'evento che ti ho detto serve anche per catturare le ripetizioni dei tasti...se tenevi premuto un tasto WM_KEYUP non aggiornava il conteggio.
Per aggiornare la status bar ho aggiunto un indicator e poi con un messaggio utente (con costante WM_USER + 1) ho usato la SendMessage per notificarlo dal CEditView al CFrameWnd. |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Oct 2001
Città: Modugno (BA)
Messaggi: 165
|
Quote:
Sinceramente non ho capito bene come funziona sta cosa dei messaggi riflessi. °° Effettivamente in questo modo mi intercetta eventuali paste da menù e ripetizioni di tasti, solo che non mi chiama più il SaveModified() quando chiudo l'editor o anche solo i ldocumento. °° Ultima modifica di ArtificialBoy : 07-02-2007 alle 16:16. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:59.



















