zoukankan      html  css  js  c++  java
  • 在窗体上创建自己的光标并输入文字

    我们知道在文本框等可以接收输入的组件中,我们可以看到闪烁的光标,并可以输入文字,如果我们在,比如窗体上时,因为不支持输入,也无法显示闪烁的光标,那我们 有办法做自己的输入吗?当然可以,下面我们演示在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.
    View Code
  • 相关阅读:
    HearthBuddy投降插件2019-11-01的使用
    正则表达式在线分析 regex online analyzer
    Tips to write better Conditionals in JavaScript
    The fileSyncDll.ps1 is not digitally signed. You cannot run this script on the current system.
    Cannot capture jmeter traffic in fiddler
    JMETER + POST + anti-forgery token
    input type color
    HearthBuddy修改系统时间
    What are all the possible values for HTTP “Content-Type” header?
    UDK性能优化
  • 原文地址:https://www.cnblogs.com/key-ok/p/3429860.html
Copyright © 2011-2022 走看看