Delphi 在窗体上创建自己光标的实例
发布时间 - 2026-01-11 03:05:22 点击率:次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);
}
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Delphi
# 光标
# 在窗体上创建光标
# Delphi 用DLL实现插件的简单实例
# Delphi 根据字符串找到函数并执行的实例
# Delphi提取PDF文本实例
# Delphi XE5 为Android应用制作签名的方法(图文)
# ListView 百分比进度条(delphi版)
# delphi制作wav文件的方法
# Delphi基本图像处理方法汇总
# Delphi实现截屏存盘的方法
# 自己的
# 输入文字
# 你可以
# 如有
# 希望能
# 第二个
# 可以看到
# 自定义
# 重写
# 不支持
# 按下
# 会把
# 谢谢大家
# 创建一个
# 点上
# 上时
# 文本框
# 疑问请
# 事件中
# StdCtrls
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
网站制作价目表怎么做,珍爱网婚介费用多少?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
javascript中闭包概念与用法深入理解
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
php打包exe后无法访问网络共享_共享权限设置方法【教程】
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
Laravel如何使用.env文件管理环境变量?(最佳实践)
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
Python制作简易注册登录系统
如何用已有域名快速搭建网站?
浅析上传头像示例及其注意事项
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
中国移动官方网站首页入口 中国移动官网网页登录
如何基于云服务器快速搭建个人网站?
潮流网站制作头像软件下载,适合母子的网名有哪些?
如何用搬瓦工VPS快速搭建个人网站?
如何在Windows环境下新建FTP站点并设置权限?
米侠浏览器网页背景异常怎么办 米侠显示修复
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
Laravel storage目录权限问题_Laravel文件写入权限设置
如何在万网开始建站?分步指南解析
JavaScript模板引擎Template.js使用详解
EditPlus 正则表达式 实战(3)
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
怎样使用JSON进行数据交换_它有什么限制
制作电商网页,电商供应链怎么做?
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
进行网站优化必须要坚持的四大原则
微信小程序 input输入框控件详解及实例(多种示例)
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
Laravel如何使用模型观察者?(Observer代码示例)
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
打造顶配客厅影院,这份100寸电视推荐名单请查收
LinuxShell函数封装方法_脚本复用设计思路【教程】
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
Java垃圾回收器的方法和原理总结
原生JS获取元素集合的子元素宽度实例
如何获取免费开源的自助建站系统源码?
Laravel如何处理文件下载请求?(Response示例)
Python面向对象测试方法_mock解析【教程】
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
网页设计与网站制作内容,怎样注册网站?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】

