隐藏编辑框光标

原文: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); 
}


你可能感兴趣的:(windows,api,user,Class)