j'aimerai bien savoir comment changer le format de focus dans un textBox ?
Précisément je veux le focus suivant : ( _ ) et non pas celui par defaut ( | )
. Je vous remercie d'avance.
j'aimerai bien savoir comment changer le format de focus dans un textBox ?
Précisément je veux le focus suivant : ( _ ) et non pas celui par defaut ( | )
. Je vous remercie d'avance.
Oops, impossible à priori !
Il existe éventuellement une solution acrobatique.
1) cacher le Caret (la barre verticale)
2) crééer une toute petite picturebox horiziontale (ou un panel) en avant plan de la textbox pour figurer la barre horizontale,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [DllImport("user32")] private static extern bool HideCaret(IntPtr hWnd); public void HideCaret(){ HideCaret(MyTextBox.Handle);}
3) gérer les events keyUp KeyDown mouseUp et mouse down pour récupérer le SelectionStart et ainsi déplacer hrizontalement la pictureBox ou le panel, le décalage horizontal dépendant de la Width rendue par une fonction TextRenderer.MeasureText du texte en début de TextBox jusqu'àu selectionStart.
Attention, pour que ça fonctionne la TextBox doit être suffisament large pour afficher tout le texte entré par l'utilisateur : utiliser la propriété MaxLength de la TextBox.Sinon utiliser :
Code : Sélectionner tout - Visualiser dans une fenêtre à part MyTextBox.GetRectFromCharacterIndex(MyTextBox.SelectionStart)
Avec la methode que vous m'avez envoyez le signe ( | ) ne se cahce pas, il reste toujours visible !!
En faisant le HideCaret sur l'event Enter de la TextBox , cela fonctionne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 bool CaretHidden = false ; private void textBox1_Enter(object sender, EventArgs e) { CaretHidden=CaretHidden || HideCaret(textBox1.Handle) || true ; }
Pourquoi une PictureBox ? Ce n'est pas très adapté, il vaudrait mieux gérer l'évènement Paint de la TextBox pour dessiner le trait à l'endroit voulu.
Sinon cette ligne n'a pas beaucoup de sens :
|| true fait que le résultat sera toujours true...
Code : Sélectionner tout - Visualiser dans une fenêtre à part CaretHidden=CaretHidden || HideCaret(textBox1.Handle) || true ;
Et même sans ça, en faisant le OU avec la valeur actuelle de CaretHidden, ça fait qu'une fois que CaretHidden vaut true il ne repassera plus jamais à false
EDIT: j'ai fait le test ; chez moi ça ne marche pas sur l'évènement Enter, par contre ça marche sur GotFocus.
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
|| true fait que le résultat sera toujours true...
Ca parait bizarre comme écriture, mais c'est intentionnel et necessaire :
- je ne voulais faire le HideCaret() qu'une seule fois, car j'ai lu que les appels s'empilaient et que pour revenir à la situation initiale il fallait autant de ShowCaret() que de HideCaret(),
- dans mes tests, le HideCaret me renvoyait false, même quand il faisait ce qu'on lui demandait.
C'était aussi ma première idée, mais pas d'event Paint ou d'équivalent pour une TextBox Winformsil vaudrait mieux gérer l'évènement Paint de la TextBox pour dessiner le trait à l'endroit voulu.
.
Partager