如果自己继承个子类实在不会或是太懒,可以用万能的TApplicationEvents控件 var caretBmp: TBitmap; // 光标图片procedure TForm1.FormCreate(Sender: TObject); begin caretBmp := TBitmap.Create; caretBmp.LoadFromFile('1.bmp'); end;procedure TForm1.FormDestroy(Sender: TObject); begin caretBmp.Free; end;// 放一个 TApplicationEvents 控件,处理它的 OnMessage 事件procedure TForm1.aplctnvnts1Message(var Msg: tagMSG; var Handled: Boolean); var i: Integer; begin if Msg.message = WM_PAINT then begin // 遍历所有控件给它们设置 caret for i := 0 to ControlCount - 1 do begin // TCustomEdit 是 Tmemo、Tedit....等的父类 if Controls[i] is TCustomEdit then begin if DestroyCaret then begin // 这个 caret 光标图片根据自己的逻辑动态设定 CreateCaret(Msg.hwnd, caretBmp.Handle, 0, 0); SetCaretPos(Msg.pt.X, Msg.pt.Y); ShowCaret(Msg.hwnd); end; Break; end; end; end; end;
谢谢sololie的思路,主要是这是要修改原来的软件,文本框太多。要显示换行符的目的和 ms word 一样,让用户不会忽略末尾有这类不可见的符号(在应用中是要使用到的)
var
caretBmp: TBitmap; // 光标图片procedure TForm1.FormCreate(Sender: TObject);
begin
caretBmp := TBitmap.Create;
caretBmp.LoadFromFile('1.bmp');
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
caretBmp.Free;
end;// 放一个 TApplicationEvents 控件,处理它的 OnMessage 事件procedure TForm1.aplctnvnts1Message(var Msg: tagMSG; var Handled: Boolean);
var
i: Integer;
begin
if Msg.message = WM_PAINT then
begin
// 遍历所有控件给它们设置 caret
for i := 0 to ControlCount - 1 do
begin
// TCustomEdit 是 Tmemo、Tedit....等的父类
if Controls[i] is TCustomEdit then
begin
if DestroyCaret then
begin
// 这个 caret 光标图片根据自己的逻辑动态设定
CreateCaret(Msg.hwnd, caretBmp.Handle, 0, 0);
SetCaretPos(Msg.pt.X, Msg.pt.Y);
ShowCaret(Msg.hwnd);
end;
Break;
end;
end;
end;
end;