2010-09-03 16 views
4

Important: nous avons vraiment besoin de la fonctionnalité indiquée, donc ne commencez pas à suggérer des alternatives.Création d'une zone de texte sans fenêtre et zoomable qui permet de créer une zone de texte Winforms réelle en C#

Nous essayons d'afficher et de saisir du texte sur un contrôle WinForms personnalisé qui inclut des zones de texte et des zones non textuelles - en d'autres termes, un canevas moderne.

Nous devons être en mesure d'afficher le texte et le curseur sur le contrôle personnalisé à différents niveaux de zoom et en utilisant d'autres effets personnalisés. Cependant, nous ne voulons pas (ou n'avons pas les moyens) d'écrire du code de méthode d'entrée pour le clavier et la souris, du code de services, etc. - la solution doit supporter toutes les langues supportées par la TextBox standard. Par conséquent, l'approche que nous considérons est d'utiliser une zone de texte cachée, et d'y router les événements du clavier et de la souris après une traduction appropriée, et d'utiliser ses accesseurs publics pour déterminer comment les caractères sont disposés. Cela nous permettrait théoriquement de mettre en évidence le texte sélectionné, de dessiner un caret, d'effectuer les bonnes actions lorsque l'utilisateur appuie sur une touche (y compris la sélection et la suppression de texte avec le clavier). la zone de texte cachée. Le résultat est que nous construisons sur la fonctionnalité de la zone de texte tout en surmontant ses limitations telles que le zoom, etc.

Nous pensons que la partie d'affichage est faisable mais l'entrée du clavier et de la souris est probablement très délicate.

Questions: Cela a-t-il déjà été essayé avec succès? Tout code de travail serait excellent.

Mise à jour: Une expérience rapide et incorrecte semble indiquer que la zone de texte ne respecte pas les coordonnées de la souris envoyées dans les messages de la souris, mais semble lire directement la position actuelle de la souris. Par conséquent, une nouvelle question:

Est-il possible de convertir tous les événements de souris TextBox en termes d'actions Direct TextBox, d'une manière qui fonctionnerait dans toutes les langues? Notre supposition que la méthode de test hit GetCharIndexFromPosition avec la méthode de sélection de texte Select, devrait suffire. Est-ce que cela semble raisonnable?

+0

Très intéressant! Tenez-nous au courant sur le sujet si vous atteignez des objectifs! – Michael

Répondre

1

Je vous recommande d'utiliser une TextBox cachée comme vous le suggérez, puis de lui envoyer des messages WM_PRINT afin que son contenu soit dessiné sur un bitmap. Ensuite, vous pouvez dessiner ce bitmap sur la zone d'intérêt réel et en faisant appliquer des changements tels que le zoom ou la rotation et ainsi de suite. Tous les messages du clavier peuvent être simplement transférés vers le TextBox caché et ainsi le caret et le contenu seront mis à jour comme prévu par l'utilisateur. La partie délicate est juste la manipulation de la souris. Vous devez prendre la coordonnée du client et ensuite utiliser la transformation inverse (zoom, rotation, etc.) pour obtenir du client les coordonnées réelles du TextBox caché.

+0

Merci, vient d'ajouter une mise à jour demandant de transformer les événements de la souris en actions de la zone de texte. – bright