툴버튼 대신 폼에 패널 하나랑 타이머만 올리고 테스트 해봤습니다.
아래 코드는 툴버튼 마우스 엔터 이벤트에 타이머를 작동한 뒤 팝업메뉴를 툴 버튼의 가운데에 수동으로 띄우고
타이머에서는 현재 마우스 위치를 감지하면서 툴버튼이나 띄어진 팝업메뉴를 벗어나면 팝업메뉴를 닫고, 타이머를 끄는 내용입니다.
TPoint ToolBtnPos;
void __fastcall TForm1::Panel1MouseEnter(TObject *Sender)
{
ToolBtnPos.X=Panel1->Left+Form1->Left+8; // ToolBtn의 실제 화면상(모니터상)의 Left값
ToolBtnPos.Y=Panel1->Top+Form1->Top+30; // ToolBtn의 실제 화면상의 Top값
Timer1->Enabled=true;
PopupMenu1->Popup(Panel1->Width/2+ToolBtnPos.X,Panel1->Height/2+ToolBtnPos.Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (!((ToolBtnPos.X <= Mouse->CursorPos.X && Mouse->CursorPos.X <= ToolBtnPos.X+Panel1->Width)
&& (ToolBtnPos.Y <= Mouse->CursorPos.Y && Mouse->CursorPos.Y <= ToolBtnPos.Y+Panel1->Height)
// 마우스가 툴버튼 안에 있는지 확인하는 조건문
|| (PopupMenu1->PopupPoint.X <= Mouse->CursorPos.X && Mouse->CursorPos.X <= PopupMenu1->PopupPoint.X+100)
&& (PopupMenu1->PopupPoint.Y <= Mouse->CursorPos.Y && Mouse->CursorPos.Y <= PopupMenu1->PopupPoint.Y+200)))
// 마우스가 PopupMenu 안에 있는지 확인하는 조건문
{
PopupMenu1->CloseMenu();
Timer1->Enabled=false;
}
}
//---------------------------------------------------------------------------
제가 확실히 구하는 방법을 몰라서 상수로 입력한 값이 있는데
8 은 폼 테두리 크기고,
30 은 폼의 Caption이 들어가는 부분의 크기 이며,
100 은 PopupMenu의 Width 가 될 값이고,
200 은 PopupMenu의 Height 가 될 값입니다.
요 네개의 상수만 구할 수 있으면 원하시는대로 구현 될듯 싶습니다.
도움이 되었으면 하네요.
궁금이... 님이 쓰신 글 :
: 툴버튼에 팝업메뉴를 연결했습니다.
: 근데 툴버튼을 클릭해야 팝업메뉴가 보이잖아요
: 혹시 툴버튼에 마우스 오버되면 팝업메뉴가 보이고 리브되면 안보이게 할 수 없나요?
|