delphi 在窗体上创建自己的光标并输入文字


本文整理自网络,侵删。

 

我们知道在文本框等可以接收输入的组件中,我们可以看到闪烁的光标,并可以输入文字,如果我们在,比如窗体上时,因为不支持输入,也无法显示闪烁的光标,那我们 有办法做自己的输入吗?当然可以,下面我们演示在Form上来输入文字。

    用到的API函数如下

 

GetTextMetrics:获取程序当前的字体信息,存放到TEXTMETRIC结构中

 

CreateCaret:为系统插入标记创建一个新的形状,并且将插入标记的属主关系指定给特定的窗口。插入标记的形状。可以是线、块或位图

 

ShowCaret:显示光标

 

SetCaretPos:设置光标的位置

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.


相关阅读 >>

Delphi xe5在zip文件中添加某个txt文件并写入文字

Delphi 查找并删除过期的日志目录

Delphi 实现英汉字典的转换

Delphi 16进制字符串转原字符串

Delphi做繁体简体转换

Delphi 枚举所有电脑磁盘

Delphixe 如何调用stringtojstring

Delphi memo1删除前n行

Delphi tsearchrec

github上通过星级评估排名前10的最受欢迎的开源Delphi项目

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...