Προς το περιεχόμενο

Detect Scrolling


ntaryl

Προτεινόμενες αναρτήσεις

Δημοσ.

καλησπερα

παιδια εχω φτιαξει ενα μικρο παραδειγμα το οποιο αποτελειται απο ενα button και ενα Ritchtextbox .

πως μπορω να kανω Detect αν ο χρηστης σκρολαρει και διαβαζει στο τεχτ ως το τελος .

Με λιγα λογια το κουμπι οκ να ενεργοπιειτε οταν το scrolbar φατανει ως το τελος

καλο βραδυ

Επισυναπτω το παραδειγμα

test-scroll.zip

Δημοσ.

Το πώς γίνεται σε Visual BASIC 6 δεν γνωρίζω, σε Windows API πάντως πρέπει να στείλεις το μήνυμα EM_GETLINECOUNT ώστε να αποθηκεύσεις τον αριθμό των γραμμών που περιέχει το RichEdit control και ύστερα το μήνυμα EM_LINEFROMCHAR με “wParam = -1” ώστε να λάβεις το αριθμό της γραμμής στην οποία βρίσκεται ο cursor του control (ή την αρχή κάποιου επιλεγμένου block). Τώρα για να υπολογίσεις εάν ο cursor βρίσκεται στην τελευταία γραμμή του RichEdit θα πρέπει να αφαιρέσεις -1 από την τιμή που επιστρέφει η EM_GETLINECOUNT πριν την συγκρίνεις με εκείνη της EM_LINEFROMCHAR διότι η πρώτη ξεκινά το μέτρημα των γραμμών από το 1 ενώ η δεύτερη από το μηδέν.

 

Όλα αυτά αν κάνεις scroll με βάση την θέση του cursor - η διαδικασία με βάση τα ScrollBar είναι πιο περίπλοκη.

 

Πιστεύω ότι το control της Visual BASIC 6 πρέπει να παρέχει όλες τις παραπάνω κλήσεις ως properties καθιστώντας τον προγραμματισμό του εξαιρετικά απλό.

 

Ακολουθεί ένας ενδεικτικός κώδικας γραμμένος σε CodeGear Turbo C++, που παράγει έναν σύντομο ήχο από τα ηχεία του υπολογιστή μόλις φτάσουμε στην τελευταία γραμμή του RichEdit. Ο κώδικας είναι γραμμένος σε Windows API, δίχως να εκμεταλλεύεται τις ιδιότητες του RichEdit που προσφέρει η VCL.

 

Τέλος όπου “RichEdit1->Handle” θα πρέπει να βάζετε το HWND του RichEdit control σας.

 

>
// Detect if user scrolled to RichEdit last line and "beep" ...
int nRTF_MaxLine  = SendMessage(RichEdit1->Handle, EM_GETLINECOUNT, 0, 0L),
	nRTF_LinePos  = SendMessage(RichEdit1->Handle, EM_LINEFROMCHAR, -1, 0L);	

if(nRTF_MaxLine-1 == nRTF_LinePos)
	MessageBeep(-1);

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...