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.
Version imprimable
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:
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: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:
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: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.
Citation:
|| 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 Winforms :(.Citation:
il vaudrait mieux gérer l'évènement Paint de la TextBox pour dessiner le trait à l'endroit voulu.
Mouais... dans ce cas je l'aurais écrit comme ça, c'est plus lisible :
Code:
1
2
3
4
5 if (!CaretHidden) { HideCaret(); CaretHidden = true; }
Ah oui c'est vrai... en fait l'évènement existe, mais il est masqué car il n'est pas utilisé, vu que c'est l'OS qui dessine le contrôle.
+1, dans mon code j'écris comme tu l'indiques (et surtout pas l'instuction que j'avais proposée pour le fun).Citation:
Mouais... dans ce cas je l'aurais écrit comme ça, c'est plus lisible :
les solutions ne marchent pas !
Lesquelles : 1, 2 ou 3 ?Citation:
les solutions ne marchent pas !
Citation:
Graffito :
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,
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.
je n'arrive pas a cacher la barre ( | )
As-tu tenu compte de la remarque de tomlev :
Citation:
EDIT: j'ai fait le test ; chez moi ça ne marche pas sur l'évènement Enter, par contre ça marche sur GotFocus.