아래의 예는 Edit 컨트롤에 없는 이벤트인 SETFOCUS이벤트를 사용하도록 하는 방법입니다.
그리고 서브클래싱의 리턴을위해 Dispatch(메세지)를 사용하였습니다.
저는 WindowsProc()보다는 Dispatch(메세지)를 주로 사용합니다.
이것을 사용해 해당메세지를 처리하고 내가 구현하고자하는 동작을 넣을 수도 있으며,
내가 구현하고자 하는 동작을 넣고, 다시 원래의 메세지 처리를 하도록 할 수 도 있습니다.
Edit나 Memo의 경우 아래의 서브클래싱을 사용하여,
SETFOCUS 메세지처리시 CreateCaret() API함수를 사용하여케럿(caret)의 모양등을 바꿔줄 수 도 있고,
아예 케럿을 없앨 수도 있습니다.
---------------------------------- 코딩 *.CPP ---
...
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit1->WindowProc=NewEditProc; // 새로운 처리함수 연결
}
void __fastcall TForm1::NewEditProc(TMessage &Message) // 새로운 처리함수 코딩
{
if (Message.Msg == WM_SETFOCUS)
{
Edit1->Dispatch(&Message); // 기존의 메세지 처리 (경우에 따라 처리)
// 새로운 코딩
Edit1->Dispatch(&Message); // 기존의 메세지 처리 (경우에 따라 처리)
}
else
{
Edit1->Dispatch(&Message); // 기존의 메세지 처리
}
}
...
-------------------------------------- 선언 *.H ---
...
class TForm1 : public TForm
{
__published: // IDE-managed Components
TEdit *Edit1;
void __fastcall FormCreate(TObject *Sender);
void __fastcall NewEditProc(TMessage &Message); // 새로운 처리함수 선언
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
...
|