Delphi cria uma instância de seu próprio cursor em um formulário
Sabemos que em componentes como caixas de texto que podem receber entrada, podemos ver o cursor piscando e inserir texto. Se estivermos, por exemplo, em um formulário, porque a entrada não é suportada e o cursor piscante não pode ser exibido, então nós. Existe uma maneira de fazer minha própria opinião? Claro que você pode. Abaixo demonstramos como inserir texto no Formulário.
As funções da API usadas são as seguintes:
Código Delphi
unidade Unit1; interface usa Windows, Mensagens, SysUtils, Variantes, Classes, Gráficos, Controles, Formulários, Diálogos, StdCtrls; tipo TForm1 = class(TForm) procedimento FormCreate(Sender: TObject); Char); procedimento FormPaint(Remetente: TObject); private { Declarações privadas } s:string public { Declarações públicas; } end; var Form1: TForm1; implementação {$R *.dfm} procedimento TForm1.FormCreate(Sender: TObject); var //TTextMetric armazena informações de fonte tm:TTextMetric; Handle,tm); { NoteCreateCaret O segundo parâmetro é do tipo HBITMAP, então você pode usar seu próprio gráfico como formato do cursor. Os dois parâmetros a seguir são a largura e a altura padrão do cursor, que podem ser personalizadas} CreateCaret(Self.Handle,HBITMAP(nil), tm .tmAveCharWidth div 2,tm.tmHeight); //Exibir SetCaretPos(10,10) no ponto (10,,10); //Evento de chave do formulário, cada vez que uma tecla é pressionada, o valor de s é reescrito e o valor de s é alterado no Evento OnPaint O valor é desenhado no procedimento do formulário TForm1.FormKeyPress(Sender: TObject; var Key: Char Begin); //Se for a tecla backspace, exclua o caractere anterior if Ord(Key) = VK_BACK então comece. if (s <> '') then Delete(s,Length(s),1); end else s := s + Key; //Redesenhar Self.Invalidate; Self.Canvas.TextOut(10,10,s); //Redefinir a posição do cursor SetCaretPos(Self.Canvas.TextWidth(s)+10,10);Código VC
//Variável de string global CString s; //Ao inicializar, definir o cursor BOOL CTest_MFCDlg::OnInitDialog() { CDialog::OnInitDialog(); CTest_MFCDlg::ShowSelfCaret(void) { CClientDC dc(este); dc.GetTextMetrics(&tm); CreateSolidCaret(tm.tmAveCharWidth/2,tm.tmHeight); (MSG* pMsg) { //Se a tecla for pressionada if (pMsg->message == WM_KEYDOWN) { //Se for a tecla backspace, exclua o último caractere if (pMsg->wParam == VK_BACK) { if (s.GetLength() ! = 0) { s.Delete(s.GetLength() - 1,1 } } senão); //Anexar caracteres s.Insert(s.GetLength(),(TCHAR)pMsg->wParam); Invalidate(true); return CDialog::PreTranslateMessage(pMsg); para a janela void CTest_MFCDlg::OnPaint() { CPaintDC dc(this); GetClientRect(&rect); CSize tamanho = dc.GetTextExtent(s); }Se você tiver alguma dúvida, deixe uma mensagem ou vá até a comunidade deste site para se comunicar e discutir. Obrigado pela leitura, espero que possa ajudar a todos.