C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[757] [Win32] 시스템 메뉴 내맘대로 1
장성호 [nasilso] 9087 읽음    2008-03-17 18:51
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

+ -

관련 글 리스트
757 [Win32] 시스템 메뉴 내맘대로 1 장성호 9087 2008/03/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.