隐藏编辑框光标

原文:http://hi.baidu.com/yuri_life/blog/item/618d271e111f3acda68669fb.html

需要去掉一个Edit上获得焦点时候显示在上面的光标...
查了下才知道,原来是这么个过程.

引用:“闪烁的光标”,英文里叫Caret,在Windows里,在同一个时刻,只有一个窗 
口拥有(或者说显示)它。所以,Windows的控件Edit(包括BCB的TEdit和TMemo),在收到 
消息WM_SETFOCUS(TMemo的OnEnter与这个消息相对应)之后,会调用API函数ShowCaret显示 
Caret。所以如果你想要隐藏Caret,必须要等到控件处理完消息WM_FOCUS之后再调用API函数 
HideCaret来隐藏Caret。上面的代码,就是在消息WM_FOCUS里,用PostMessage发送一个消息 
到消息队列,这样处理完WM_FOCUS之后才处理这个消息。如果用SendMessage的话,那么就变 
成了在消息WM_FOCUS没有处理完就处理自定义的这个消息了,Windows处理完WM_FOCUS之后, 
又会显示Caret,这样就达不到效果了。

基本上通过重载Form的消息处理函数就可以达到效果

例子如下:

例子是memo的,任何编辑框也都是相同的道理

class TForm1 : public TForm 

__published: // IDE-managed Components 
TMemo *Memo1; 
void __fastcall Memo1Enter(TObject *Sender); //Memo1的OnEnter事件 
private: // User declarations 
protected: 
void __fastcall WndProc(TMessage& Msg); //重载TForm的消息处理函数 
public: // User declarations 
__fastcall TForm1(TComponent* Owner); 
}; 

void __fastcall TForm1::Memo1Enter(TObject *Sender) 

//这儿一定要用PostMessage,不能用SendMessage 
PostMessage(Handle, WM_APP, 0, (long)Memo1->Handle); 

//--------------------------------------------------------------------------- 
void __fastcall TForm1::WndProc(TMessage& Msg) 

TForm::WndProc(Msg); //必须调用原来的消息处理函数 
if (Msg.Msg==WM_APP) HideCaret((HWND)Msg.LParam); 
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值