Delphi 在窗体上创建自己光标的实例
更新时间:2020年6月30日 23:43 点击:2295
Delphi 在窗体上创建自己光标的实例
我们知道在文本框等可以接收输入的组件中,我们可以看到闪烁的光标,并可以输入文字,如果我们在,比如窗体上时,因为不支持输入,也无法显示闪烁的光标,那我们 有办法做自己的输入吗?当然可以,下面我们演示在Form上来输入文字。
用到的API函数如下
- GetTextMetrics:获取程序当前的字体信息,存放到TEXTMETRIC结构中
- CreateCaret:为系统插入标记创建一个新的形状,并且将插入标记的属主关系指定给特定的窗口。插入标记的形状。可以是线、块或位图
- ShowCaret:显示光标
- SetCaretPos:设置光标的位置
Delphi代码
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure FormPaint(Sender: TObject); private { Private declarations } s:string; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var //TTextMetric存放字体信息 tm:TTextMetric; begin s := ''; GetTextMetrics(Self.Canvas.Handle,tm); { 注意 CreateCaret 的第二个参数是HBITMAP类型,所以你可以使用自己的图形作为光标形状,这里采用默认 后面两个参数是光标的宽度和高度,可以自定义 } CreateCaret(Self.Handle,HBITMAP(nil),tm.tmAveCharWidth div 2,tm.tmHeight); ShowCaret(Self.Handle); //在(10,,10)这个点上显示 SetCaretPos(10,10); end; //窗体按键事件,每次按一个键后,重写s的值,在OnPaint事件中会把s的值 画到窗体上 procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin //如果是退格键,则删除前一个字符 if Ord(Key) = VK_BACK then begin if (s <> '') then Delete(s,Length(s),1); end else s := s + Key; //重绘 Self.Invalidate; end; procedure TForm1.FormPaint(Sender: TObject); begin Self.Canvas.TextOut(10,10,s); //重新设置光标位置 SetCaretPos(Self.Canvas.TextWidth(s)+10,10); end; end.
VC代码
//全局字符串变量 CString s; //初始化时,设置光标 BOOL CTest_MFCDlg::OnInitDialog() { CDialog::OnInitDialog(); ShowSelfCaret(); ...... } //为窗体添加函数,初始化光标 void CTest_MFCDlg::ShowSelfCaret(void) { CClientDC dc(this); TEXTMETRIC tm; dc.GetTextMetrics(&tm); CreateSolidCaret(tm.tmAveCharWidth/2,tm.tmHeight); ShowCaret(); POINT p; p.x = 0; p.y = 0; SetCaretPos(p); } //重载PreTranslateMessage BOOL CTest_MFCDlg::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 rect; GetClientRect(&rect); CSize size = dc.GetTextExtent(s); POINT p; p.x = size.cx; p.y = 0; SetCaretPos(p); dc.DrawText(s,s.GetLength(),rect,DT_LEFT); }
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关文章
- 这篇文章主要介绍了pycharm 实现光标快速移动到括号外或行尾的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-06
- 这篇文章主要介绍了解决IDEA光标变成白色粗条的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-06
- 这篇文章主要介绍了Delphi远程连接Mysql的实现方法,需要的朋友可以参考下...2020-06-30
- 这篇文章主要介绍了Delphi常用关键字用法,包括了各个常用的关键字及其详细用法,需要的朋友可以参考下...2020-06-30
- 这篇文章主要介绍了delphi7连接mysql5的实现方法,需要的朋友可以参考下...2020-06-30
- 这篇文章主要介绍了Delphi 实现软件自动升级的功能的相关资料,希望通过本文能帮助到大家实现这样的功能,需要的朋友可以参考下...2020-06-30
- 这篇文章主要介绍了Delphi7中群发Email邮件的方法,涉及邮件服务器软件的使用,电子邮件的判断与发送功能的实现,是非常实用的技巧,需要的朋友可以参考下...2020-06-30
- 这篇文章主要介绍了delphi制作wav文件的方法,涉及Delphi操作多媒体文件的相关技巧,需要的朋友可以参考下...2020-06-30
- 这篇文章主要介绍了Delphi编程常用快捷键,对于提高Delphi编程的效率很有帮助,需要的朋友可以参考下...2020-06-30
- 这篇文章主要介绍了Delphi 常见文件处理及注册表文件的使用实例的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下...2020-06-30
- 这篇文章主要介绍了Delphi实现木马自我拷贝方法,对于研究木马的运行原理很有帮助,需要的朋友可以参考下...2020-06-30
- 这篇文章主要介绍了Delphi实现木马文件传输的方法,对于了解木马的运行原理有一定的帮助,需要的朋友可以参考下...2020-06-30
- 这篇文章主要介绍了Delphi使用大图标编译程序的方法,需要的朋友可以参考下...2020-06-30
- 这篇文章主要给大家介绍了关于Android中EditText光标的显示与隐藏以及Android之第一次不显示EditText光标的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下...2021-11-01
解决delphi TAdoQuery组件的close方法导致”列名无效“错误的问题
今天小编就为大家分享一篇解决delphi TAdoQuery组件的close方法导致”列名无效“错误的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-30- 这篇文章主要介绍了Delphi 在窗体上创建自己光标的实例的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下...2020-06-30
- 这篇文章主要介绍了Delphi实现窗体感知鼠标滑过并自动隐藏与显示窗口的方法,涉及Delphi操作窗口及鼠标事件的技巧,需要的朋友可以参考下...2020-06-30
- 这篇文章主要介绍了Delphi实现获取句柄并发送消息的方法,需要的朋友可以参考下...2020-06-30
Delphi中使用ISuperObject解析Json数据的实现代码
这篇文章主要介绍了Delphi中使用ISuperObject解析Json数据的实现代码,需要的朋友可以参考下...2020-06-30- 这篇文章主要介绍了Delphi 根据字符串找到函数并执行的实例的相关资料,希望通过本能帮助到大家实现这样的功能,需要的朋友可以参考下...2020-06-30