Delphi crée une instance de son propre curseur sur un formulaire
Nous savons que dans les composants tels que les zones de texte qui peuvent recevoir des entrées, nous pouvons voir le curseur clignotant et saisir du texte. Si nous sommes, par exemple, sur un formulaire, car la saisie n'est pas prise en charge et que le curseur clignotant ne peut pas être affiché, alors nous. Existe-t-il un moyen de faire ma propre contribution ? Bien sûr, vous le pouvez. Ci-dessous, nous montrons comment saisir du texte sur le formulaire.
Les fonctions API utilisées sont les suivantes :
Code Delphes
unité Unit1 ; l'interface utilise Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls ; type TForm1 = class(TForm) procédure FormCreate(Sender : TObject) ; procédure FormKeyPress(Sender : TObject ; var Key : Char); procédure FormPaint(Sender: TObject); private { Déclarations privées } s:string public { Déclarations publiques ; } end; var Form1 : TForm1 ; implémentation {$R *.dfm} procédure TForm1.FormCreate(Sender : TObject); var //TTextMetric stocke les informations sur la police tm:TTextMetric; start s := " ; Poignée,tm); { NoteCreateCaret Le deuxième paramètre est le type HBITMAP, vous pouvez donc utiliser votre propre graphique comme forme du curseur. Les deux paramètres suivants sont la largeur et la hauteur par défaut du curseur, qui peuvent être personnalisées} CreateCaret(Self.Handle,HBITMAP(nil), tm .tmAveCharWidth div 2,tm.tmHeight); ShowCaret(Self.Handle); //Affiche SetCaretPos(10,10) au point (10,,10); //Événement de touche de formulaire, chaque fois qu'une touche est enfoncée, la valeur de s est réécrite et la valeur de s est modifiée dans le Événement OnPaint. La valeur est dessinée sur la procédure du formulaire TForm1.FormKeyPress(Sender: TObject; var Key: Char);begin //S'il s'agit de la touche retour arrière, supprimez le caractère précédent si Ord(Key) = VK_BACK puis commencez. if (s <> '') then Delete(s,Length(s),1); end else s := s + Key; //Redraw Self.Invalidate end; Self.Canvas.TextOut(10,10,s); //Réinitialise la position du curseur SetCaretPos(Self.Canvas.TextWidth(s)+10,10);Code CV
//Variable de chaîne globale CString s; //Lors de l'initialisation, définir le curseur BOOL CTest_MFCDlg::OnInitDialog() { CDialog::OnInitDialog(); ... } //Ajouter des fonctions au formulaire, Initialiser le curseur void(); CTest_MFCDlg::ShowSelfCaret(void) { CClientDC dc(this); dc.GetTextMetrics(&tm); CreateSolidCaret(tm.tmAveCharWidth/2,tm.tmHeight); POINT p; py = 0; SetCaretPos(p); (MSG* pMsg) { //Si la touche est enfoncée if (pMsg->message == WM_KEYDOWN) { //S'il s'agit de la touche retour arrière, supprimez le dernier caractère if (pMsg->wParam == VK_BACK) { if (s.GetLength() ! = 0 ) { s.Delete(s.GetLength() - 1,1 } } else); //Ajouter des caractères s.Insert(s.GetLength(),(TCHAR)pMsg->wParam); Invalidate(true); } return CDialog::PreTranslateMessage(pMsg); //Auto-dessiner, dessiner le contenu de s. à la fenêtre void CTest_MFCDlg::OnPaint() { CPaintDC dc(this CRect); GetClientRect(&rect); CSize size = dc.GetTextExtent(s); px = size.cx; SetCaretPos(p); }Si vous avez des questions, n'hésitez pas à laisser un message ou à vous rendre dans la communauté de ce site pour communiquer et discuter. Merci d'avoir lu, j'espère que cela pourra aider tout le monde. Merci pour votre soutien à ce site !