VCL에서 작업표시줄(TaskBar)에 메뉴는 메인폼의 시스템 메뉴와 다르다
왜냐하면 VCL에서 Application은 또 다른 윈도우가 있다
Application->Handle의 System메뉴가 TaskBar에 나타나는 메뉴이다.
메인폼의 Caption에 나타나는 메뉴는 해당폼의 System메뉴이다.
[메뉴 제어 API]
메뉴를 마음대로 추가 / 삭제/ 수정하려면?
GetSystemMenu로 HMENU를 가져와서
EnableMenuItem
DeleteMenuItem
AppendMenuItem
DrawMenuBar
위와같은 api를 통해 제어할수 있다.
[캡션바 시스템 메뉴 추가 및 이벤트 받기]
추가는 아래와 같이 간단하게 된다.
const int SC_MyMenuItem1 = WM_USER + 2;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HMENU SysMenu=GetSystemMenu(Handle,false);
AppendMenu(SysMenu, MF_SEPARATOR, 0, "") ; //구분선 추가
AppendMenu(SysMenu, MF_STRING, SC_MyMenuItem1, "메인폼 시스템 메뉴") ;//메뉴 추가
}
그리고 이벤트를 받으려면?
WM_SYSCOMMAND에 WParam이 등록한 SC_MyMenuItem1 와 같은경우에 처리하면 된다.
void __fastcall TForm1::WMSysCommand(TWMSysCommand &Msg)
{
if(Msg.CmdType==SC_MyMenuItem1)
{
ShowMessage("캡션바 시스템 추가 메뉴 맞죠?");
}
else
{
TForm::Dispatch(&Msg);
}
}
void __fastcall TForm1::WMSysCommand(TWMSysCommand &Msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_SYSCOMMAND,TWMSysCommand,WMSysCommand)
END_MESSAGE_MAP(TForm);
[Task바 시스템 메뉴 추가 및 이벤트 받기]
작업표시줄에 메뉴추가는? 아래와 같이 간단하다.
위에 폼과 다른것은 Handle이 Application->Handle이라는것이다.
void __fastcall TForm1::Button2Click(TObject *Sender)
{
HMENU SysMenu=GetSystemMenu(Application->Handle,false);
AppendMenu(SysMenu, MF_SEPARATOR, 0, "") ; //구분선 추가
AppendMenu(SysMenu, MF_STRING, SC_MyMenuItem2, "작업표시줄 시스템 메뉴") ;//메뉴 추가
}
이벤트 받기는?
SystemMenu가 Application->Handle 과 연결된것이므로 Application에서 메세지를 받아서 처리해야 한다.
void *oldWndProc;
void *newWndProc;
const int SC_MyMenuItem1 = WM_USER + 2;
const int SC_MyMenuItem2 = WM_USER + 3;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
oldWndProc =(void *) GetWindowLong(Application->Handle, GWL_WNDPROC) ;
newWndProc = (void *)MakeObjectInstance(AppMessage) ;
SetWindowLong(Application->Handle, GWL_WNDPROC, LPARAM(newWndProc)) ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
SetWindowLong(Application->Handle, GWL_WNDPROC, LPARAM(oldWndProc)) ;
if (newWndProc) FreeObjectInstance(newWndProc) ;
newWndProc = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::AppMessage(TMessage &Msg)
{
if(Msg.Msg==WM_SYSCOMMAND && Msg.WParam==SC_MyMenuItem2)
{
ShowMessage("작업표시줄 시스템 추가 메뉴 맞죠?"); }
else
{
Msg.Result = CallWindowProc((FARPROC)oldWndProc, Application->Handle, Msg.Msg, Msg.WParam, Msg.LParam) ;
}
}
그럼..
참조하세요
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=8066