像dos下那种效果,我查到CreateCaret及相关函数,但用起来没效果

解决方案 »

  1.   

    ////////////////////////////////////////////////////////////////////
    // 下面是段简化的程序
    // 你需要加入WM_CHAR事件的控制,WM_KILLFOCUS的控制,就比较完美了:-)
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
    TMyEdit = class(TEdit)
      private
       FCaret: TBitmap;
       procedure OnEnter(var msg: TMessage); message WM_SETFOCUS;
      public
       constructor Create(AOwner: TComponent); override;
      end;  TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        FEdit: TMyEdit;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TMyEdit }constructor TMyEdit.Create(AOwner: TComponent);
    begin
      inherited;
      FCaret := TBitmap.Create;
      FCaret.Height := FCaret.Canvas.TextHeight('>');
      FCaret.Width := FCaret.Canvas.TextWidth('>');
      FCaret.Canvas.TextOut(0,0,'>');
    end;procedure TMyEdit.OnEnter(var msg: TMessage);
    begin
    CreateCaret(Handle,FCaret.Handle,FCaret.Width,FCaret.Height);
      ShowCaret(Handle);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      FEdit := TMyEdit.Create(Self);
      FEdit.Parent := Self;
    end;end.
      

  2.   

    {From 超级猛料}//利用onenter事件,用postmessage发出一个自定义消息//在自定义消息中,用sendmessage强制setfocus后,再createcaret就可以了//Edit收到焦点时,光标是变了,但一旦我键入字符,光标又变回原样。我想知道如何在编辑文字时,光标一直不变(自定义的)//只要响应application.onactivate事件可以了unit Unit1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, ExtCtrls, AppEvnts;constwm_newcaret=wm_user+1;typeTForm1 = class(TForm)Edit1: TEdit;Edit2: TEdit;Image1: TImage;ApplicationEvents1: TApplicationEvents;procedure Edit1Enter(Sender: TObject);procedure ApplicationEvents1Activate(Sender: TObject);private{ Private declarations }public{ Public declarations }procedure newcaret(var msg:Tmessage);message wm_newcaret;end;varForm1: TForm1;implementation{$R *.DFM}procedure TForm1.Edit1Enter(Sender: TObject);beginpostmessage(handle,wm_newcaret,0,0);end;procedure TForm1.newcaret(var msg: Tmessage);beginedit1.setfocus;CreateCaret(edit1.Handle,image1.Picture.Bitmap.Handle,edit1.width,edit1.height);showcaret(edit1.handle);end;procedure TForm1.ApplicationEvents1Activate(Sender: TObject);beginCreateCaret(edit1.Handle,image1.Picture.Bitmap.Handle,edit1.width,edit1.height);showcaret(edit1.handle);end;end.