|
원래, 컴포넌트에 마우스가 들어오고 나가는 것을 감지하기 위해서는 WM_MOUSEMOVE가 아니라
CM_MOUSEENTER와 CM_MOUSELEAVE의 두가지 메시지를 검사합니다. 그런데 이 두가지 메시지는 VCL
컴포넌트들 사이에서만(주로 스스로) 주고받는 거라서, Application.OnMessage에는 죽었다 깨어나도
걸리지 않습니다.
따라서, 원하시는 동작을 위해서는, TLabel 컴포넌트를 상속받아 새 컴포넌트를 만들어야 합니다.
조금 복잡하지만, 다음과 같이 해보세요.
1. 먼저 빌더의 메뉴에서 Component -> New Component 메뉴를 클릭하여 다이얼로그를 띄웁니다.
2. Ancestor Type에 TLabel을 입력합니다. 빌더가 6 버전이라면 콤보박스에 'TLabel [QStdCtrls]'와
'TLabel [StdCtrls]' 이렇게 두가지가 있는데, 아래의 'TLabel [StdCtrls]'를 선택해야 합니다.
3. 바로 아래 Class Name에 원하는 컴포넌트 이름을 입력합니다. (예를 들어 TK700Label?)
4. 그 아래의 Palette Page는 그대로 둬도 상관없습니다. 컴포넌트가 설치될 탭을 선택하는 건데,
기본적으로 Samples 탭이 선택되어 있습니다.
5. 그 아래의 Unit File Name에서는, 파일 이름은 그냥 두는 것이 보통이지만 소스가 저장될 경로를
지정해줍니다.
6. OK 버튼을 누르고 빠져나오면 기본적인 컴포넌트 소스가 생성됩니다.
7. 코드에디터에서 오른쪽 버튼을 눌러 나오는 메뉴에서 Open Source/Header File을 선택하여 헤더파일을
엽니다.
8. private 섹션에 다음과 같이 두줄을 코딩해줍니다.
void OnMouseEnter(TMessage &msg);
void OnMouseLeave(TMessage &msg);
9. 클래스 선언의 가장 아래, };으로 끝나기 직전에 엔터키를 몇개 쳐서 라인 여백을 좀 만들고, 다음과
같이 코딩합니다.
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, OnMouseEnter);
VCL_MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, OnMouseLeave);
END_MESSAGE_MAP(TLabel);
10. 그리고 이번에는 다시 팝업메뉴에서 Open Source/Header File를 선택하여 cpp파일을 엽니다.
11. 여기서 가장 아래쯤에 다음과 같이 코딩합니다.
void TK700Label::OnMouseEnter(TMessage &msg)
{
Font->Color = clBlue;
}
void TK700Label::OnMouseLeave(TMessage &msg)
{
Font->Color = clBlack;
}
12. 이제 컴포넌트 작성이 끝났습니다. 파일을 저장한 후 Component -> Install Component 메뉴를
선택하여 컴포넌트를 설치합니다.
13. Samples 탭에 새 레이블 컴포넌트가 생겼을 겁니다. 폼에 놓고 컴파일해보면, 마우스가 올라갈
때마다 원하시는 대로 색깔이 바뀔 겁니다.
위에서 컴포넌트 개발 중에 BEGIN_MESSAGE_MAP 어쩌구 하는 부분을 메시지맵이라고 합니다.
그럼...
강영준 님이 쓰신 글 :
: 강영준 님이 쓰신 글 :
: : 마우스로 버튼위에 가져 가면 글자 색이 바뀌게 할려면 어떻게 해야 하나요?
: :
: : 버튼을 벗어 나면 원래 색으로 돌아 가게 할려면..
: :
: : 방법을 알려 주세용.~~
:
: void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
: {
: if(Msg.message == WM_MOUSEMOVE){
: POINT p;
: GetCursorPos(&p);
: if(PtInRect(&(Label1->ClientRect),Label1->ScreenToClient(p))){
: if(Label1->Font->Color!=clBlue){
: Label1->Font->Color=clBlue;
: }
: }else{
: if(Label1->Font->Color!=clBlack){
: Label1->Font->Color=clBlack;
: }
: }
: Handled = true;
: }
:
: }
: void __fastcall TForm1::FormCreate(TObject *Sender)
: {
: Application->OnMessage = AppMessage;
: }
: 위와 같은 내용을 찾아서 버튼에 적용을 했드니 잘 되드군요..
: 그래서 기뻤죠.. 근데. 문제는...
:
: mousemove메시지를 모두 가로체기 때문에 ... 트랙바를 마우스로 끌어 당기지를 못하드군요.
:
: 특정 컴포넌트들에만 작용하게 할려면 어떻게 해야 하나요?
:
|