Delphi는 폼에 자체 커서 인스턴스를 생성합니다.
입력을 받을 수 있는 텍스트 상자와 같은 구성 요소에서는 깜박이는 커서를 보고 텍스트를 입력할 수 있다는 것을 알고 있습니다. 예를 들어 양식에 있는 경우 입력이 지원되지 않고 깜박이는 커서를 표시할 수 없기 때문에 직접 입력할 수 있는 방법이 있나요? 물론 가능합니다. 아래에서는 양식에 텍스트를 입력하는 방법을 보여줍니다.
사용되는 API 함수는 다음과 같습니다.
델파이 코드
단위 Unit1; 인터페이스는 Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식, 대화 상자, StdCtrls를 사용합니다. type TForm1 = class(TForm) FormCreate(Sender: TObject); Procedure FormKeyPress(Sender: TObject; var Key: Char); 절차 FormPaint(Sender: TObject); private { 개인 선언 } s:string; } end; var Form1: TForm1; 구현 {$R *.dfm} TForm1.FormCreate(Sender: TObject); var //TTextMetric은 글꼴 정보를 저장합니다. s := ''; 핸들,tm) { NoteCreateCaret 두 번째 매개변수는 HBITMAP 유형이므로 사용자 고유의 그래픽을 커서 모양으로 사용할 수 있습니다. 다음 두 매개변수는 커서의 기본 너비와 높이로 사용자 정의할 수 있습니다.} CreateCaret(Self.Handle,HBITMAP(nil), tm .tmAveCharWidth div 2,tm.tmHeight); ShowCaret(Self.Handle); //(10,,10) 지점에 SetCaretPos(10,10) 표시; //폼 키 이벤트, 키를 누를 때마다 s 값이 다시 쓰여지며, OnPaint 이벤트. 값이 양식에 그려집니다. 프로시저 TForm1.FormKeyPress(Sender: TObject; var Key: Char); 시작 //백스페이스 키인 경우 Ord(Key) = VK_BACK이면 이전 문자를 삭제하고 시작합니다. if (s <> '') then Delete(s,Length(s),1); end else s := s + Key; //Redraw Self.Invalidate end; Self.Canvas.TextOut(10,10,s); //커서 위치 재설정 SetCaretPos(Self.Canvas.TextWidth(s)+10,10) end;VC 코드
//전역 문자열 변수 CString s; //초기화 시 커서 설정 BOOL CTest_MFCDlg::OnInitDialog() { CDialog::OnInitDialog() ... } //폼에 함수 추가, 커서 초기화 void CTest_MFCDlg::ShowSelfCaret(void) { CClientDC dc(this); dc.GetTextMetrics(&tm); CreateSolidCaret(tm.tmAveCharWidth/2,tm.tmHeight); POINT p; py = 0; SetCaretPos(p) } //PreTranslateMessage:: (MSG* 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) CRect; GetClientRect(&Rect); CSize 크기 = dc.GetTextExtent(s); POINT p; px = size.cx; SetCaretPos(p); dc.DrawText(s,s.GetLength(),DT_LEFT) }궁금한 점이 있으면 메시지를 남기거나 이 사이트의 커뮤니티에 가서 소통하고 토론하세요. 읽어주셔서 감사합니다. 이 사이트를 지원해 주셔서 감사합니다.