终于找到了,可以用CreateCaret,ShowCaret来改变光标,这里想问问,到底需不需要用DestroyCaret来释放它?我看说明,如果不是创建的HWND有焦点,那么DestroyCaret无效,也就是说,不能在关闭窗口时使用DestroyCaret,那么它该怎么用?

解决方案 »

  1.   

    用CreateCaret需要为每一个文本框加代码,还得为鼠标、键盘等不同操作做设置,太繁琐了。请教如何能直接替换整个程序的文本框光标?
      

  2.   

    面向对象是用来干嘛的,自己继承一个文本框TEdit或Tmemo不就行了,什么为鼠标键盘做不同操作设置什么的只要写一次另外,换行符是什么,能显示换行符?
      

  3.   

    如果自己继承个子类实在不会或是太懒,可以用万能的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;
      

  4.   

    谢谢sololie的思路,主要是这是要修改原来的软件,文本框太多。要显示换行符的目的和 ms word 一样,让用户不会忽略末尾有这类不可见的符号(在应用中是要使用到的)