|
네.. 저도 잘 알지는 못하지만 간단하게 제가 아는데로 설명을 드리도록 하겠습니다.
알고 계시겠지만, 윈도우즈에서는 모든것을 메세지라는 개념을 사용해서 이루어집니다.
예를들면 폼에 에디터를 하나 두고 실행시킬경우 마우스가 에디터에 들어가거나 나오거나 혹은 클릭을하거나 하는 경우 모두 그에 해당하는 메세지를 발생시키고 그 메세지를 운영체제가 받아서 커서를 바꾸거나 에디터에 캐럿을 그리거나 하는 방식이죠.
Unit1.h
//---------------------------------------------------------------------------
#define WM_FORMLOADED WM_USER + 5050 <-- 윈도우즈의 수 많은 메세지에 내가 원하는 메세지를 하나 추가 시킵니다. WM_USER 는 그러한 메세지를 개발자가 만들 수 있도록하기 위해서 운영체제에서 준비 해 놓은 메세지이고, 여기에 다른것들과 중복되지 않게 내가 원하는 메세지를 만듭니다. 그러니까 꼭 5050 이 아니더라도 아무 숫자나 갖다 붙이면 되겠죠.
class TForm1 : public TForm
{
__published: // IDE-managed Components
void __fastcall FormShow(TObject *Sender);
private: // User declarations
void __fastcall wmFormLoaded(TMessage& Msg);
BEGIN_MESSAGE_MAP <-- 이 부분은 메세지맵에 대해서 공부를.. 좀 방대해서요..
VCL_MESSAGE_HANDLER(WM_FORMLOADED, TMessage, wmFormLoaded); <-- 내가 발생시킨 메세지를 만나면(?) wmFormLoaded 함수를 실행하겠다는 겁니다.
END_MESSAGE_MAP(TForm)
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
Unit1.cpp
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
PostMessage(Handle, WM_FORMLOADED, 0, 0); <-- 운영체제의 메세지큐에 나의 메세지를 덧붙입니다. SendMessage 와 PostMessage의 차이에 대해 알아보시구요...
}
//---------------------------------------------------------------------------
void __fastcall TForm1::wmFormLoaded(TMessage& Msg) <-- 내가 발생시킨 메세지를 처리하는 함수입니다.
{
Application->ProcessMessages(); <-- 앞에 발생하는 모든 메세지를 다 처리하라는 말.. (주로 화면 갱신이 늦어 지는것을 방지하기위해 많이 사용하죠..
Sleep(1000);
ShowMessage("폼 다 떴시다~~!");
}
//---------------------------------------------------------------------------
어느정도 도움이 되셨는지 모르겠군요. 메세지 발생과 메세지맵에 관해 공부하시면 아주 간단한 거라고 생각이 되실겁니다. 메세지는 윈도우즈 프로그래밍을 하시면 늘 사용하게 될 것이기 때문에 이 기회에 공부 해 두시면 좋을겁니다. ^^;
그럼 수고하세요.
용준 님이 쓰신 글 :
: falco 님 잘 이해가 안가는데요..간단하게라도 설명 좀 부탁드립니다.
: postMessage 가 뭔지도 모르겠구요...WM_USER + 5050 이 의미하는 것도 모르겠군요..
: 전반적으로 어떤 방식으로 돌아가는건지 설명 좀 부탁드립니다.
|