|
한성수 님이 쓰신 글 :
: 먼져 임프님에게 머쯤 무러보구시픈데여~ ^^
:
: CM_MOUSEENTER 하고 CM_MOUSELEAVE가 어디에 어떻게 정의되어있는지요? ^^
:
: 요것즘 알려주세요~ 그리구 맨 마지막즘 봐주시겠어요? ^^
:
: 5일간의 머리 쥐어짭을 깨고 이렇게 해결했습니다. ^^
:
: 먼져 해더파일에 요렇게 정의해주죠~
:
: void __fastcall WndProc(Messages::TMessage &Message);
:
: 그담엔 cpp 화일에다가 이렇게 정의 했습니다.
:
: void __fastcall TOViewWW::WndProc(Messages::TMessage &Message)
: {
: if(Message.Msg == CM_MOUSEENTER)
: {
: Width = 100;
: Height = 100;
: OVOpen = false;
: }
: else
: {
: TForm::WndProc(Message);
: }
: if(Message.Msg == CM_MOUSELEAVE)
: {
: Width = 100;
: Height = 0;
: OVOpen = true;
: }
: else
: {
: TForm::WndProc(Message);
: }
: }
:
: 그러니까 되네여 ^^ 기쁘다~ 구주 오셨네~ ^^ OVOpen은 제가 쓰는 bool 변수니까 따라하실필요까진~ ^^
:
: 아참~ 윈도 2000 에서는 CM_MOUSELEAVE이 98보다 좀 문제가 있더군요..
: 98에서는 가끔 마우스를 인식안해서버려 그게좀 문제구요~
: 2000에서는 폼1을 띄운 메인폼으로 마우스가 가야지만 CM_MOUSELEAVE를 인식하더군여
: 머 확실한건 아니지만~ ^^ 임프님아? 먼 방법이 있나여?
임펠리테리입니다.
CM_MOUSEENTER, CM_MOUSELEAVE 메시지는 vcl에서 정의된 사용자정의 메시지이며 controls.hpp(원래는 controls.pas)에 정의되어 있습니다. 이것으로 첫번째 질문에는 답변이 되었지요?
그리고... 두 메시지를 사용하신 코드를 보면.. 사용하신 방법이 맞습니다. 사용하신 방법은 TWinControl의 멤버인 WndProc() 함수를 오버라이드한거죠. 마지막에서 원래의 베이스클래스 함수를 호출해준 것까지 정확히 코딩하셨습니다.
이 방법외에도 메시지맵을 이용하는 방법도 있습니다.
메시지맵에 대해 질문하신 것은 아니고, 또 이 경우에 특별히 메시지맵이나 WndProc() 함수를 이용하는 방법 둘 중 어떤 게 낫다고 말할 수 없기 때문에 메시지맵의 작성법은 그냥 넘어가구요. 코딩하는 프로그래머의 편의상, 따로 처리하려는 메시지의 숫자를 기준으로 해서 두가지 중 한가지 방법을 택하면 적절할 겁니다.
마지막 질문. 당연합니다. 좀 복잡하게 처리되기는 합니다만, 결과적으로, CM_MOUSELEAVE 메시지는 자신이 아닌 다른 컨트롤로 마우스가 이동했을 때 그 다른 컨트롤에 의해 발생되기 때문이죠. 원래 이 두가지 메시지가 Win32 api 에 있는 것이 아니고 볼랜드에서 편의상 만들어놓은 것이기 때문에, vcl 컨트롤이 아닌 컨트롤들은 CM_MOUSELEAVE 메시지를 발생시키는 역할을 할수 없단 말입니다.
가장 무식하고도(?) 확실한 방법은, 일정시간마다 현재 마우스 위치의 컨트롤을 검사해주는 겁니다.
그럼 참고하시길...
|