Delphi создает экземпляр собственного курсора в форме
Мы знаем, что в таких компонентах, как текстовые поля, которые могут получать ввод, мы можем видеть мигающий курсор и вводить текст. Если мы находимся, например, в форме, поскольку ввод не поддерживается и мигающий курсор не может отображаться, то мы знаем, что в таких компонентах, как текстовые поля, которые могут принимать ввод, мы можем видеть мигающий курсор и вводить текст. Есть ли способ внести свой собственный вклад? Конечно, можете. Ниже мы покажем, как вводить текст в форму.
Используемые функции API следующие:
Дельфи-код
модуль Unit1; интерфейс использует Windows, сообщения, SysUtils, варианты, классы, графику, элементы управления, формы, диалоги, StdCtrls; тип TForm1 = класс (TForm) процедура FormCreate (отправитель: TObject); процедура FormKeyPress (Sender: TObject; var Key: Char); процедура FormPaint (Отправитель: TObject); частный {Частные объявления} s:string; Публичные объявления; } end; var Form1: TForm1; реализация процедуры {$R *.dfm} TForm1.FormCreate(Sender: TObject); var //TTextMetric хранит информацию о шрифте tm:TTextMetric; Begin s := ''; GetTextMetrics(Self.Canvas. Дескриптор, тм); { NoteCreateCaret Второй параметр — это тип HBITMAP, поэтому в качестве формы курсора можно использовать собственное изображение. Следующие два параметра — это ширина и высота курсора по умолчанию, которые можно настроить} CreateCaret(Self.Handle,HBITMAP(nil), tm.tmAveCharWidth div 2,tm.tmHeight ShowCaret(Self.Handle); //Отображать SetCaretPos(10,10) в точке (10,,10); //Формируем событие ключа, при каждом нажатии клавиши значение s перезаписывается, а значение s изменяется в Событие OnPaint. Значение рисуется в процедуре формы TForm1.FormKeyPress(Sender: TObject; var Key: Char Begin); //Если это клавиша возврата, удалите предыдущий символ, если Ord(Key) = VK_BACK, затем начнем. if (s <> '') then Delete(s,Length(s),1); end else s := s + Key; //Redraw Self.Invalidate; Self.Canvas.TextOut(10,10,s); //Сбрасываем позицию курсора SetCaretPos(Self.Canvas.TextWidth(s)+10,10); end;Код ВК
//Глобальная строковая переменная CString s; //При инициализации устанавливаем курсор BOOL CTest_MFCDlg::OnInitDialog() { CDialog::OnInitDialog(); ShowSelfCaret() ... } //Добавляем функции в форму, Инициализируем курсор void; CTest_MFCDlg::ShowSelfCaret (void) {CClientDC dc (это); TEXTMETRIC тм; dc.GetTextMetrics(&tm); CreateSolidCaret(tm.tmAveCharWidth/2,tm.tmHeight); ShowCaret(); POINT p; py = 0; SetCaretPos(p); } //Перегрузка PreTranslateMessage BOOL CTest_MFCDlg:: PreTranslateMessage (СООБЩ* pMsg) { //Если клавиша нажата if (pMsg->message == WM_KEYDOWN) { //Если это клавиша возврата, удаляем последний символ if (pMsg->wParam == VK_BACK) { if (s.GetLength() ! = 0 ) { s.Delete(s.GetLength() - 1,1 } } else); //Добавляем символы s.Insert(s.GetLength(),(TCHAR)pMsg->wParam Invalidate(true); return CDialog::PreTranslateMessage(pMsg } //Саморисование, рисование содержимого s; в окно void CTest_MFCDlg::OnPaint() { CPaintDC dc(this); GetClientRect(&rect); CSize size = dc.GetTextExtent(s); px = size.cx; py = 0; dc.DrawText(s,s.GetLength(),rect,DT_LEFT); }Если у вас есть какие-либо вопросы, оставьте сообщение или зайдите в сообщество этого сайта, чтобы пообщаться и обсудить. Надеюсь, это поможет всем. Спасибо за вашу поддержку этого сайта!