编辑状态下,光标的改变(150分)

  • 主题发起人 主题发起人 ksec
  • 开始时间 开始时间
K

ksec

Unregistered / Unconfirmed
GUEST, unregistred user!
我打算编一个带有字符编辑功能的控件,比如说是一个的edit,但我希望这个控件得到焦点时,光标不是像通常的编辑光标是一段小竖线,我希望它是我可以自定义的别种形式的光标。最好是能结合VCL的源码解答,非常感谢!
 
CreateCaret可以用一个Bitmap作光标。
 
cursor属性
 
cursor属性不能改变在编辑状态下光标的形状,这我早已试过。
鼠标的光标的形状变了,但是编辑框里闪动的仍然是小竖线
 
o*o说的是改变caret(编辑的光标,不是鼠标的光标),不是改变cursor
他给的api是对的
 
sorry,你要的是光标。不是鼠标。
不过我还没看见有那个程序的光标是其他形状的。
举个例?
 
我查阅了Win32Api参考,CreateCaret是改变插字苻的函数,我用如下格式调用时编译可以通过,但一旦执行,Dephi报类型转换错误,如果我将creatcaret的HBITMAP改为1,程序执行正常。我不知是什么原因,还望各位高人指点。谢谢。
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateCaret(edit1.Handle,loadbitmap (Null,OBM_RGARROW), edit1.width,edit1.height);
showcaret(edit1.handle);
end;


 
loadbitmap (hInstance,OBM_RGARROW)
 
sorry, is

loadbitmap (0,OBM_RGARROW)?
 
哎,老是顺嘴胡说。
这回是对的。

loadbitmap(0, MAKEINTRESOURCE(OBM_RGARROW))
 
你的方法我试过了,插字苻是变了,但是又遇到新的问题,当Edit接受到焦点时,插字苻又变回原样。只好再次讨教。
 
procedure TForm1.Edit1Enter(Sender: TObject);
begin
CreateCaret(edit1.handle,loadbitmap(0,MAKEINTRESOURCE(OBM_RGARROW)),0,0);
showcaret(edit1.handle);
end;

procedure TForm1.Edit1Click(Sender: TObject);
begin
invalidaterect(edit1.handle,nil,false);
CreateCaret(edit1.handle,loadbitmap(0,MAKEINTRESOURCE(OBM_RGARROW)),0,0);
showcaret(edit1.handle);
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
destroycaret;
end;
 
o*o你的方法有问题,当不用鼠标而是按下tab键切换的时候,只激发onenter事件,而onenter事件里的createcaret并不起作用,可能是tedit响应setfocus消息
后调用onenter事件后,才刷新edit control,显示caret,
所以我改用rxlib里的rxwindowhook给edit1挂了个aftermessage消息钩子就可以了
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,toolsapi,
StdCtrls, ExtCtrls, Buttons, RxHook, AppEvnts;

const
wm_newcaret=wm_user+1;
type
TForm1 = class(TForm)
Edit1: TEdit;
Image1: TImage;
RxWindowHook1: TRxWindowHook;
procedure RxWindowHook1AfterMessage(Sender: TObject; var Msg: TMessage;
var Handled: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.RxWindowHook1AfterMessage(Sender: TObject;
var Msg: TMessage; var Handled: Boolean);
begin
if msg.Msg=wm_setfocus then
begin
CreateCaret(edit1.Handle,image1.Picture.Bitmap.Handle,edit1.width,edit1.height);
showcaret(edit1.handle);
handled:=true;
end;
end;
 
一种更简单的方法,不用rxwindowhook
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
const
wm_newcaret=wm_user+1;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Image1: TImage;
procedure Edit1Enter(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure newcaret(var msg:Tmessage);message wm_newcaret;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Edit1Enter(Sender: TObject);
begin
postmessage(handle,wm_newcaret,0,0);
end;

procedure TForm1.newcaret(var msg: Tmessage);
begin
edit1.setfocus;
CreateCaret(edit1.Handle,image1.Picture.Bitmap.Handle,edit1.width,edit1.height);
showcaret(edit1.handle);
end;

end.
//利用onenter事件,用postmessage发出一个自定义消息
//在自定义消息中,用sendmessage强制setfocus后,再createcaret就可以了
 
>而onenter事件里的createcaret并不起作用,

当然起作用。

BTW:有wm_newcaret这个消息吗?
 
wm_newcaret=wm_user+1呀
在onenter事件里,刚进入是起作用,但你移动一下光标就会发现
,光标还是原来的光标(不知道为什么)
 
sorry,没看到wm_user+1

可以结束了,这分该你得。
 
诸位大侠,你们的方法我都试过了,只是Edit收到焦点时,光标是变了,但一旦我键入字符,光标又变回原样。我想知道如何在编辑文字时,光标一直不变(自定义的)
 
我替HUB兄说了吧。
procedure TForm1.Edit1Change(Sender: TObject);
begin
postmessage(handle,wm_newcaret,0,0);
end;
 
只要响应application.onactivate事件可以了
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, AppEvnts;
const
wm_newcaret=wm_user+1;
type
TForm1 = 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;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Edit1Enter(Sender: TObject);
begin
postmessage(handle,wm_newcaret,0,0);
end;

procedure TForm1.newcaret(var msg: Tmessage);
begin
edit1.setfocus;
CreateCaret(edit1.Handle,image1.Picture.Bitmap.Handle,edit1.width,edit1.height);
showcaret(edit1.handle);
end;

procedure TForm1.ApplicationEvents1Activate(Sender: TObject);
begin
CreateCaret(edit1.Handle,image1.Picture.Bitmap.Handle,edit1.width,edit1.height);
showcaret(edit1.handle);
end;

end.
 
后退
顶部