Delphi สร้างอินสแตนซ์ของเคอร์เซอร์ของตัวเองบนแบบฟอร์ม
เรารู้ว่าในส่วนประกอบต่างๆ เช่น กล่องข้อความที่สามารถรับอินพุตได้ เราจะเห็นเคอร์เซอร์กะพริบและป้อนข้อความได้ เช่น ถ้าเราอยู่ในฟอร์ม เนื่องจากไม่รองรับอินพุตและเคอร์เซอร์กะพริบไม่สามารถแสดงได้ เราก็จะ มีวิธีป้อนข้อมูลของตัวเองหรือไม่? แน่นอนคุณทำได้ ด้านล่างนี้เราจะสาธิตวิธีการป้อนข้อความในแบบฟอร์ม
ฟังก์ชั่น API ที่ใช้มีดังนี้:
รหัสเดลฟี
หน่วย Unit1; อินเทอร์เฟซใช้ Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ, StdCtrls; พิมพ์ TForm1 = class (TForm) ขั้นตอน FormCreate (ผู้ส่ง: TObject); Char); ขั้นตอน FormPaint (ผู้ส่ง: TObject); ส่วนตัว { ประกาศส่วนตัว } s: สตริง สาธารณะ { ประกาศสาธารณะ } สิ้นสุด; var Form1: TForm1; จัดการ tm); { NoteCreateCaret พารามิเตอร์ตัวที่สองคือประเภท HBITMAP ดังนั้นคุณสามารถใช้กราฟิกของคุณเองเป็นรูปร่างเคอร์เซอร์ได้ พารามิเตอร์สองตัวต่อไปนี้เป็นความกว้างและความสูงของเคอร์เซอร์เริ่มต้น ซึ่งสามารถปรับแต่งได้} CreateCaret(Self.Handle,HBITMAP(nil) tm .tmAveCharWidth div 2,tm.tmHeight); ShowCaret(ตัวจัดการด้วยตนเอง); //แสดง SetCaretPos(10,10) ที่จุด (10,,10); // สิ้นสุดคีย์ฟอร์ม แต่ละครั้งที่มีการกดคีย์ ค่าของ s จะถูกเขียนใหม่ และค่าของ s จะถูกเปลี่ยนใน เหตุการณ์ OnPaint ค่าจะถูกวาดบนขั้นตอนของแบบฟอร์ม TForm1.FormKeyPress(Sender: TObject; var Key: Char); start //หากเป็นคีย์ Backspace ให้ลบอักขระก่อนหน้าหาก Ord(Key) = VK_BACK จากนั้น start if (s <> '') จากนั้น 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.รหัสวีซี
//ตัวแปรสตริงส่วนกลาง CString s; //เมื่อเริ่มต้น ให้ตั้งค่าเคอร์เซอร์ BOOL CTest_MFCDlg::OnInitDialog() { CDialog::OnInitDialog(); ShowSelfCaret( ... } //เพิ่มฟังก์ชันให้กับฟอร์ม, เตรียมใช้งานเคอร์เซอร์เป็นโมฆะ CTest_MFCDlg::ShowSelfCaret (เป็นโมฆะ) { CClientDC dc (นี้); TEXTMETRIC tm; dc.GetTextMetrics(&tm); CreateSolidCaret(p) } // โอเวอร์โหลด PreTranslateMessage BOOL CTest_MFCDlg:: (ผงชูรส* ข้อความ) { //หากกดปุ่ม if (pMsg->message == WM_KEYDOWN) { //หากเป็นคีย์ Backspace ให้ลบอักขระตัวสุดท้าย if (pMsg->wParam == VK_BACK) { if (s.GetLength() ! = 0 ) { s.Delete(s.GetLength() - 1,1); } } อื่น ๆ // ผนวกอักขระ s.Insert(s.GetLength(),(TCHAR)pMsg->wParam); } return CDialog::PreTranslateMessage(pMsg); } //Self-draw, วาดเนื้อหาของ s ไปที่หน้าต่างเป็นโมฆะ CTest_MFCDlg::OnPaint() { CPaintDC dc(this); GetClientRect(&rect); CSize ขนาด = dc.GetTextExtent(s); POINT p; py = 0; SetCaretPos(p); }หากคุณมีคำถามใด ๆ โปรดฝากข้อความหรือไปที่ชุมชนของไซต์นี้เพื่อสื่อสารและหารือกัน ขอขอบคุณสำหรับการอ่าน ฉันหวังว่ามันจะช่วยทุกคนได้