void CDialog::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu *pMenu, *pSubmenu;
pMenu = new CMenu();
pMenu->LoadMenu(IDR_MNU_MAIN_POPUP);
pSubmenu = pMenu->GetSubMenu(0);
pSubmenu->TrackPopupMenu(
TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x, point.y, this);
}
========================================
메뉴의 체크표시
1. 메뉴에 체크표시 여부 알아내기
// MainFrame을 찾는다.
CMainFrame *pFrame = (CMainFrame*) AfxGetMainWnd();
// 메뉴의 상태를 알아보자.
UINT state = pFrame->GetMenu()->GetMenuState(ID_FILE_NEW, MF_BYCOMMAND);
// 메뉴의 체크 여부 확인
if(state & MF_CHECKED)
{
// 메뉴에 체크 표시 됨.
}
else
{
// 메뉴에 체크 표시 안됨.
}
2. 메뉴에 체크 표시하기
CheckMenuItem(::GetMenu(pFrame->m_hWnd), ID_FILE_NEW, MF_CHECKED);
3. 메뉴에 체크 표시 지우기
CheckMenuItem(::GetMenu(pFrame->m_hWnd), ID_FILE_NEW, MF_UNCHECKED);
=========================================
HINSTANCE hOld = AfxGetResourceHandle();
AfxSetResourceHandle(g_hInstance);
LPCSTR szDllName; // DLL명만 넣는다.
//메뉴 생성
CMenu menu;
menu.CreatePopupMenu();
//
char szTemp[64];
long lPosAll = 0;
long lSize = 0;
//KHD : Popup Menu 추가 , 임의 ID 부여
menu.AppendMenu(MF_STRING,(UINT)10001,"지표최적화");
menu.AppendMenu(MF_STRING,(UINT)10002,"시간최적화");
menu.AppendMenu(MF_STRING,(UINT)10003,"변수최적화");
//
UINT nFlagsForMenu = TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD;
CRect rect;
GetDlgItem(IDC_STOPTIMA)->GetWindowRect(rect);
int nRetValue = menu.TrackPopupMenu(nFlagsForMenu, rect.left, rect.bottom, this);
if(!nRetValue) return;
menu.DestroyMenu();
////
// 로드된 메뉴 Index에 따라 실행한다. 함수도 괜찮고... ^^;;
switch(nRetValue) {
case 10001:
szDllName = "IndexOptimizer";
break;
case 10002:
szDllName = "TimeOptimizer";
break;
case 10003:
szDllName = "VariableOptimizer";
break;
}
/////////////////////////////
CTabSystemTradingEx* pParentDlg = (CTabSystemTradingEx*)GetParent();
CDllDlg dlg(szDllName,szDllName, NULL, hOld);
dlg.DoModal();
if(dlg.m_hTradeInst) FreeLibrary(dlg.m_hTradeInst);
/////////////////////////////////////////////////////////////////////////
================================================================================
팝업 메뉴란 마우스 오른쪽 버튼을 눌렀을 때 나타나는 메뉴를 말한다.
상황과 위치에 따라 메뉴의 내용이 바뀌는 이런 메뉴를 컨텍스트 메뉴(Context menu)라고 하며 또한 화면의 임의위치에 불쑥 나타나기 때문에 팝업 메뉴라고도 한다.
팝업 메뉴튼 마우스 오른쪽 버튼을 누를 때 나타나므로 WM_RBUTTONDOWN메시지 핸들러에서 팝업 메뉴를 나타내면 된다.
또는 팝업 메뉴 전용의 WM_CONTEXTMENU 메시지를 사용해도 된다.
메뉴 리소스를 읽어오고 읽어온 메뉴에서 팝업으로 사용할 메뉴 리스트를 선택한다.
BOOL LoadMenu( UINT nlDResource );
CMenu* GetSubMenu( int nPos ) const;
위 두 함수는 CMenu의 멤버함수이다.
메뉴 리스트를 읽은 후 다음 함수로 메뉴를 화면에 출력
BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = 0 );
만드는 법
1. 리소스 스크립트를 이용해서 팝업 메뉴를 만든다. 굳이 설명을 하지 않아도 알 것이라 생각한다.
2. 팝업 메뉴를 뷰에 붙일 것이므로 뷰에 WM_CONTEXTMENU에시지 핸들러 만들어 다음과 같이 코드를 작성
void CPopupView::OnContextMenu(CWnd* pWnd, CPoint point )
{
CMenu popup;
CMenu *MyMenu;
popup.LoadMenu(IDR_MENU1);
MyMenu=popup.GetSubMenu(0); //'1'로 하면 두번째 메뉴가 나타난다.
MyMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );
}
3. 메뉴항목에 대한 핸들러를 작성한다. TrackPopupMenu의 네 번째 인수가 this, 즉 뷰로 지정되어 있으므로 팝업 메뉴로 부터 발생하는 메시지는 뷰가 받게 된다. 그래서 뷰에 팝업 메뉴항목의 핸들러를 만들고 다음과 같이 코드를 작성한다. 편집상 문자열 두 줄로 표시했지만 실제 코드로는 한 줄에 써넣어야 한다.
void CPopupView::OnPopupTitle1()
{
AfxGetMainWnd()->SetWindowText(" 첫 번재 팝업 메뉴항목을 선택했습니다");
}
만약 WM_CONTEXTMENU를 사용하지 않고 WM_RBUTTONDOWN을 사용한다면 한줄을 더 추가해줘야 한다.
즉 TrackPopupMenu함수가 사용하는 좌표는 전체화면의 좌측상단을 기준으로 하고 있기 때문에 두 좌표의 실제의미는 다르다.
그래서 ClientScreen 함수를 사용하여 point의 값을 전체화면을 기준 좌표로 변경해 주는 코드가 추가
즉 CLientToScreen(&point);
===================================================================================
CMenu 클래스는 윈도우 HMENU가 캡슐화된 것이다. 이것은 메뉴의 생성, 추적, 갱신, 소멸에 관한 멤버 함수를 제공한다.
로컬로서 정적 프레임에 CMenu 객체를 생성하고, 필요한 새로운 메뉴를 조작하는 멤버 함수를 호출하라. 다음으로, 윈도우에 메뉴를 설정하기위해 CWnd::SetMenu를 호출하고, 곧바로 CMenu 객체의 Detach 멤버 함수를 호출이 뒤따른다. CWnd::SetMenu 멤버 함수는 윈도우의 메뉴에 새로운 메뉴를 설정하고, 메뉴의 변화를 반영하여 다시 그려지도록 윈도우에 메뉴의 소유권을 넘긴다. Detach의 호출은 CMenu객체로부터 HMENU를 분리하고, 그럼으로써 CMenu 변수가 범위를 벗어날 때 CMenu객체의 소멸자가 더이상 소유하지 않는 메뉴를 소멸하려고 하지 않도록 한다. 메뉴 그 차제는 자동으로 윈도우가 소멸될 때 같이 소멸된다.
메모리의 템플릿에서 메뉴를 생성하기 위해 LoadMenuIndirect 멤버 함수를 사용할 수 있으나, LoadMenu를 호출함으로써 리소스로부터 메뉴를 생성된 메뉴는 쉽게 조작할 수 있고, 메뉴 리소스 자체가 메뉴 에디터를 통하여 생성되고 수정될 수 있다.
#include <afxwin.h>
CMenu Class Members
데이버 멤버
m_hMenu |
CMenu 객체에 부가된 윈도우 메뉴에 대한 핸들을 지정한다. |
생성자
Cmenu |
CMenu 객체를 생성한다. |
Initialization
Attach |
CMenu 객체에 윈도우 메뉴 핸들을 붙인다. |
Detach |
CMenu 객체로부터 윈도우 메뉴 핸들을 분리하고, 핸들을 반환한다. |
FromHandle |
윈도우 메뉴 핸들을 부여한 CMenu 객체에 대한 포인터를 반환한다. |
GetSafeHmenu |
CMenu 객체에 의해 보호된 m_hMenu를 반환한다. |
DeleteTempMap |
FromHandle 멤버 함수에 의해 생성된 임시 CMenu 객체를 삭제한다. |
CreateMenu |
빈 메뉴를 생성하고 이것을 CMenu객체에 부가한다. |
CreatePopupMenu |
빈 팝업 메뉴를 생성하고 이것을 CMenu 객체에 부가한다. |
LoadMenu |
실행 가능한 파일로부터 메뉴 리소스를 로드하고 이것을 CMenu 객체에 부가한다. |
LoadMenuIndirect |
메모리의 메뉴 템플릿으로부터 메뉴를 로드하고 이것을 CMenu 객체에 부가한다. |
DestroyMenu |
CMenu객체에 부가된 메뉴를 소멸시키고 메뉴가 차지하고 있던 메모리를 해제한다. |
Menu Operations
DeleteMenu |
메뉴에서 특정 아이템을 삭제한다. 만약 메뉴 아이템에 연결된 팝업 메뉴가 존재한다면, 팝업 메뉴의 핸들을 소멸하고, 이것에 의해 사용된 메모리를 해제한다. |
TrackPopupMenu |
특정 위치에서 떠있는 팝업 메뉴를 보여주고, 팝업 메뉴에서 아이템의 선택을 추적한다. |
Menu Item Operations
AppendMenu |
현재 메뉴의 끝에 새로운 아이템을 추가한다. |
CheckMenuItem |
팝업 메뉴의 아이템 옆에 체크 마크를 표시하던가 또는 체크 마크를 삭제한다. |
CheckMenuRadioItem |
팝업 메뉴의 아이템 옆에 라디오 버튼을 표시하고 그룹내에 있는 다른 메뉴에서는 라디오 버튼을 삭제한다. |
EnableMenuItem |
메뉴 아이템을 활성화, 비활성화, 또는 희미하게(회색) 만든다. |
GetMenuItemCount |
팝업 메뉴 또는 최상위 레벨 메뉴에 있는 아이템의 개수를 얻는다. |
GetMenuItemID |
지정된 위치에 존재하는 메뉴 아이템의 식별자를 얻는다. |
GetMenuState |
지정된 메뉴 아이템의 상태 또는 팝업 메뉴내의 아이템의 개수를 반환한다. |
GetMenuString |
지정된 메뉴 아이템의 레이블(문자열)을 가져온다. |
GetSubMenu |
팝업 메뉴의 포인터를 얻는다. |
InsertMenu |
지정된 위치에 새로운 메뉴 아이템을 삽입하고, 밑에 있는 아이템을 아래로 이동시킨다. |
ModifyMenu |
지정된 위치에 존재하는 메뉴 아이템을 변경한다. |
RemoveMenu |
지정된 메뉴에서 팝업 메뉴와 연관된 메뉴 아이템을 삭제한다. |
SetMenuItemBitmaps |
메뉴 아이템에 특정 체크 마크 비트맵을 연결시킨다. |
GetMenuContextHelpId |
메뉴와 연관된 help context ID를 가져온다. |
SetMenuContextHelpId |
메뉴와 연관되도록 help context ID를 설정한다. |
오버라이드 가능한 함수
DrawItem |
Called by the framework when a visual aspect of an owner-drawn menu hanges. |
MeasureItem |
Called by the framework to determine menu dimensions when an owner-drawn menu is created. |
CMenu::m_hMenu
Remarks
CMenu 객체에 부가된 윈도우 메뉴의 HMENU 핸들을 지정한다.
CMenu::CMenu
CMenu( );
Remarks
메뉴는 여러분이 CMenu의 생성 또는 로드 관련 함수를 호출하기 전까지는 생성되지 않는다:
l CreateMenu
l CreatePopupMenu
l LoadMenu
l LoadMenuIndirect
CMenu::Attach
BOOL Attach( HMENU hMenu );
반환값
제대로 동작했으면 0이 아닌 값; 그렇지 않으면 0.
파라미터
hMenu 윈도우 메뉴에 대한 핸들을 지정한다.
Remarks
CMenu 객체에 존재하는 윈도우 메뉴를 붙인다. 이 함수는 이미 어떠한 메뉴가 CMenu 객체에 붙어있으면 호출되어서는 안된다. 메뉴 핸들은 m_hMenu 데이터 멤버에 저장된다.
만약 여러분이 다루고자 하는 메뉴가 이미 윈도우와 연결되어있다면, 메뉴의 핸들을 얻기위해 CWnd::GetMenu 함수를 사용할 수 있다.
CMenu::Detach
HMENU Detach( );
반환값
성공하면 HMENU 타입의 윈도우 메뉴 핸들; 그렇지 않으면 NULL.
Remarks
CMenu 객체로부터 윈도우 핸들을 분리하고 핸들을 반환한다. m_hMenu 데이터 멤버는 NULL로 설정된다.
CMenu::FromHandle
static CMenu* PASCAL FromHandle( HMENU hMenu );
반환값
임시적 또는 영구적인 CMenu 의 포인터.
파라미터
hMenu 메뉴에 대한 윈도우 핸들.
Remarks
주어진 메뉴에 대한 윈도우 핸들의 CMenu 객체의 포인터를 반환한다. 만약 CMenu 객체가 아직 윈도우 메뉴 객체에 부여되지 않았다면, 임시 CMenu 객체가 생성되고 이것에 부가된다.
이 임시 CMenu 객체는 다음번 응용프로그램이 이벤트 루프에서 유휴 시간을 가질 때까지만 유효하고 그 시점에서 모든 임시 객체는 삭제된다.
CMenu::GetSafeHmenu
HMENU GetSafeHmenu( ) const;
Remarks
CMenu 객체에 의해 보호되는 HMENU, 또는 NULL CMenu 포인터를 반환한다.
CMenu::DeleteTempMap
static void PASCAL DeleteTempMap( );
Remarks
CWinApp 유휴 시간 핸들러에 의해 자동적으로 호출되고, DeleteTempMap은 FromHandle 멤버 함수에 의해 생성된 모든 임시 CMenu 객체를 삭제한다. DeleteTempMap은 CMenu 객체를 삭제하기 전에 임시 CMenu 객체에 부가된 윈도우 메뉴 객체를 분리시킨다.
CMenu::CreateMenu
BOOL CreateMenu( );
반환값
메뉴가 성공적으로 생성되면 0이 아닌 값; 그렇지 않으면 0.
Remarks
메뉴를 생성하고 이것을 CMenu 객체에 부가한다.
메뉴는 초기에는 비어있다. 메뉴 아이템은 AppendMenu 또는 InsertMenu 멤버 함수에 의해 추가될 수 있다.
만약 메뉴가 윈도우에 할당되면, 메뉴는 윈도우가 소멸될 때 자동으로 소멸된다.
만약 메뉴가 윈도우에 부가되지 않았다면, 응용프로그램은 종료하기 전에 반드시 메뉴와 연관된 시스템 리소스를 해제해야만 한다. 응용프로그램은 DestroyMenu 멤버 함수를 호출함으로써 메뉴를 해제한다.
CMenu::CreatePopupMenu
BOOL CreatePopupMenu( );
반환값
팝업 메뉴가 성공적으로 생성되면 0이 아닌 값; 그렇지 않으면 0.
Remarks
팝업 메뉴를 생성하고 이것을 CMenu 객체에 부여한다.
메뉴는 초기에는 비어있다. 메뉴 아이템은 AppendMenu 또는 InsertMenu 멤버 함수에 의해 추가될 수 있다. 응용프로그램은 기존의 메뉴나 팝업 메뉴에 팝업 메뉴를 추가할 수 있다. TrackPopupMenu 멤버 함수는 플로팅 팝업 메뉴로써 메뉴를 보여주고, 팝업 메뉴에서 선택을 추적하기위해 사용될 수 있다.
만약 메뉴가 윈도우에 할당되면, 메뉴는 윈도우가 소멸될 때 자동으로 소멸된다. 만약 메뉴가 기존의 메뉴에 추가되었다면, 기존 메뉴가 소멸될 때 자동으로 소멸된다.
만약 메뉴가 윈도우에 부가되지 않았다면, 응용프로그램은 종료하기 전에 반드시 메뉴와 연관된 시스템 리소스를 해제해야만 한다. 응용프로그램은 DestroyMenu 멤버 함수를 호출함으로써 메뉴를 해제한다.
CMenu::LoadMenu
BOOL LoadMenu( LPCTSTR lpszResourceName );
BOOL LoadMenu( UINT nIDResource );
반환값
메뉴 리소스가 성공적으로 로드되면 0이 아닌 값; 그렇지 않으면 0.
파라미터
lpszResourceName 로드될 메뉴 리소스의 이름을 담고있는 널문자로 종료된 문자열의 포인터.
nIDResource 로드될 메뉴 리소스의 메뉴 ID를 지정.
Remarks
응용프로그램의 실행 가능한 파일로부터 메뉴 리소스를 로드하여 이것을 CMenu 객체에 부여한다.
만약 메뉴가 윈도우에 부가되지 않았다면, 응용프로그램은 종료하기 전에 반드시 메뉴와 연관된 시스템 리소스를 해제해야만 한다. 응용프로그램은 DestroyMenu 멤버 함수를 호출함으로써 메뉴를 해제한다.
CMenu::LoadMenuIndirect
BOOL LoadMenuIndirect( const void* lpMenuTemplate );
반환값
메뉴 리소스가 성공적으로 로드되면 0이 아닌 값; 그렇지 않으면 0.
파라미터
lpMenuTemplate 메뉴 템플릿(단일 MENUITEMTEMPLATEHEADER 구조체와 하나 이상의 MENUITEMTEMPLATE 구조체의 콜렉션)의 포인터. 이 두개의 구조체에 대한 자세한 정보는 Win32 DSK Documentation을 참조하라.
Remarks
메모리의 메뉴 템플릿으로부터 리소스를 로드하여 이것을 CMenu 객체에 부여한다. 메뉴 템플릿은 하나 이상의 MENUITEMTEMPLATE 구조체(이것은 하나 이상의 메뉴 아이템과 팝업 메뉴를 포함한다)의 콜렉션에 따른 헤더이다.
버전 번호는 반드시 0이어야 한다.
mtOption 플래그는 주 리스트와 팝업 리스트의 마지막 아이템으로써 MF_END 플래그를 포함해야만 한다. 다른 플래그는 AppendMenu 멤버 함수를 참조하라. mtId 멤버는 MF_POPUP이 mtOption에 지정될 때 반드시 MENUITEMTEMPLATE 구조체에서 생략되어야 한다.
MENUITEMTEMPLATE 구조체를 위해 할당된 공간은 mtString이 메뉴 아이템의 이름을 간직할 수 있을 정도로 충분히 커야만 한다.
만약 메뉴가 윈도우에 부가되지 않았다면, 응용프로그램은 종료하기 전에 반드시 메뉴와 연관된 시스템 리소스를 해제해야만 한다. 응용프로그램은 DestroyMenu 멤버 함수를 호출함으로써 메뉴를 해제한다.
CMenu::DestroyMenu
BOOL DestroyMenu( );
반환값
메뉴가 소멸되면 0이 아닌 값; 그렇지 않으면 0.
Remarks
메뉴와 사용된 윈도우 리소스를 소멸시킨다. 메뉴는 소멸되기 전에 CMenu 객체로부터 분리된다. 윈도우의 DestroyMenu 함수는 CMenu 소멸자에서 자동으로 호출된다.
CMenu::DeleteMenu
BOOL DeleteMenu( UINT nPosition, UINT nFlags );
반환값
함수가 성공적으로 수행되면 0이 아닌 값; 그렇지 않으면 0.
파라미터
nPosition nFlags에 의해 결정되는, 지워질 메뉴 아이템을 지정한다.
nFlags 다음의 방식으로 nPosition을 해석할 때 사용된다:
nFlags |
nPosition의 해석 |
MF_BYCOMMAND |
기존 메뉴 아이템의 명령 ID를 부여하는 파라미터를 지정한다. MF_BYCOMMAND 또는 MF_BYPOSITION이 설정되어있지 않다면 이것이 디폴트이다. |
MF_BYPOSITION |
기존 메뉴 아이템의 위치를 부여하는 파라미터를 지정한다. 첫번째 아이템은 0에 위치한다. |
Remarks
메뉴에서 아이템을 삭제한다. 만약 메뉴 아이템이 팝업 메뉴와 연관되어있다면, DeleteMenu는 팝업 메뉴의 핸들을 소멸하고, 팝업 메뉴에 의해 사용되던 메모리를 해제한다.
윈도우에 상주하는 메뉴가 변경될 때(윈도우가 보여지거나 그렇지 않을 때), 응용프로그램은 반드시 CWnd::DrawMenuBar를 호출해야한다.
CMenu::TrackPopupMenu
BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );
반환값
함수가 성공적으로 수행되면 0이 아닌 값; 그렇지 않으면 0.
파라미터
nFlags 마우스 버튼 플래그와 스크린 위치 플래그를 지정한다. 스크린 위치 플래그는 다음중의 하나가 될 수 있다:
l TPM_CENTERALIGN x 좌표에 의해 지정된 위치에서 수평상으로 중앙에 팝업 메뉴를 위치시킨다.
l TPM_LEFTALIGN x 좌표에 의해 지정된 위치에서 왼편에 팝업 메뉴를 위치시킨다.
l TPM_RIGHTALIGN x 좌표에 의해 지정된 위치에서 오른편에 팝업 메뉴를 위치시킨다.
마우스 버튼 플래그는 다음 중의 하나이다:
l TPM_LEFTBUTTON 팝업 메뉴가 마우스 왼쪽 버튼을 따르도록 한다.
l TPM_RIGHTBUTTON 팝업 메뉴가 마우스 오른쪽 버튼을 따르도록 한다.
x 화면 좌표계에서 팝업 메뉴의 수평 위치를 지정한다. nFlags 파라미터 값에 따라, 메뉴는 이 위치에 상대적으로 왼쪽 정렬, 오른쪽 정렬 또는 가운데 정렬이 될 수 있다.
y 화면 좌표계에서 팝업 메뉴 최상위의 수직 위치를 지정한다.
pWnd 팝업 메뉴를 소유하는 윈도우를 지정한다. 이 윈도우가 메뉴로부터 WM_COMMAND 메시지를 받는다. 윈도우 3.1 이상 버전에서, 윈도우는 TrackPopupMenu가 리턴하기전까지는 WM_COMMAND 메시지를 받을 수 없다. 윈도우 3.0에서는 TrackPopupMenu가 리턴하기전에 윈도우가 WM_COMMAND 메시지를 받는다.
lpRect 사용자가 팝업 메뉴를 띄어놓은 채로 클릭할 수 있는 화면상 직사각 영역의 좌표를 담고 있는 RECT 구조체 또는 CRect 객체를 가리킨다. 만약 이 파라미터가 NULL이면, 사용자가 팝업 메뉴 바깥을 클릭할 때 팝업 메뉴는 사라진다. 윈도우 3.0에서는 반드시 NULL이었다.
윈도우 3.1 버전 이상에서는 다음 상수값을 사용할 수 있다:
l TPM_CENTERALIGN
l TPM_LEFTALIGN
l TPM_RIGHTALIGN
l TPM_RIGHTBUTTON
Remarks
지정된 위치에 플로팅 팝업 메뉴를 보여주고, 팝업 메뉴상의 아이팀의 선택을 추적한다. 플로팅 팝업 메뉴는 화면상 어디에서든 나타날 수 있다.
CMenu::AppendMenu
BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );
반환값
함수가 성공적으로 수행되면 0이 아닌 값; 그렇지 않으면 0.
파라미터
nFlags 메뉴에 추가될 때 새 메뉴 아이템의 상태에 대한 정보를 지정한다. 이것은 아래 Remarks 부분에 열거된 값의 한가지 이상으로 구성된다.
nIDNewItem 새 메뉴 아이템의 명령 ID 또는 nFlags가 MF_POPUP으로 설정되어있는 경우의 팝업 메뉴의 메뉴 핸들(HMENU)을 지정한다. 만약 nFlags가 MF_SEPARATOR로 설정되어있다면 nIDNewItem 파라미터는 무시된다(필요치 않다).
lpszNewItem 새 메뉴 아이템의 상태를 지정한다. nFlags 파라미터는 lpszNewItem을 다음의 방법으로 해석하는데 사용된다:
nFlags |
lpszNewItem의 해석 |
MF_OWNERDRAW |
메뉴 아이템과 관련된 추가 데이터를 포함하는데 사용될 수 있는 32비트 값을 제공하는 응용프로그램을 포함한다. 32비트 값은 WM_MEASUREITEM과 WM_DRAWITEM 메시지에 의해 제공된 구조체의 itemData 멤버내의 응용프로그램에 이용될 수 있다. 이 값은 메시지들과 함께 제공된 구조체의 itemData 멤버에 저장된다. |
MF_STRING |
널문자로 끝나는 문자열의 포인터를 포함한다. 이것이 디폴트 해석이다. |
MF_SEPARATOR |
lpszNewItem 파라미터가 무시된다(필요치 않다). |
pBmp 메뉴 아이템으로써 사용될 CBitmap 객체의 포인터.
Remarks
메뉴의 끝에 새로운 아이템을 추가한다. 응용프로그램은 nFlags에 값을 설정함으로써 메뉴 아이템의 상태를 지정할 수 있다. nIDNewItem이 팝업 메뉴를 지정할 때, 이것은 추가될 메뉴의 부분이 된다. 메뉴가 소멸된다면, 추가된 메뉴 또한 소멸된다. 추가된 메뉴는 충돌을 피하기 위해 CMenu객체로부터 분리되어야만 한다. MF_STRING과 MF_OWNERDRAW는 AppendMenu의 비트맵 버전에 대해서는 유효하지 않다.
다음 목록은 nFlags에 설정될 수 있는 플래그들이다:
l MF_CHECKED 아이템 옆에 디폴트 체크 마크를 하기위해 MF_UNCHECKED와 함께 토글(toggle)로써 사용된다. 응용프로그램이 체크 마크 비트맵을 지원하면(SetMenuItemBitmaps 멤버 함수를 참고하라.), "체크 마크 켜짐(check mark on)" 비트맵이 디스플레이된다.
l MF_UNCHECKED 아이템 옆에 디폴트 체크 마크를 제거하기위해 MF_CHECKED와 함께 토글(toggle)로써 사용된다. 응용프로그램이 체크 마크 비트맵을 지원하면(SetMenuItemBitmaps 멤버 함수를 참고하라.), "체크 마크 꺼짐(check mark off)" 비트맵이 디스플레이된다.
l MF_DISABLED 메뉴 아이템을 사용 불능으로 만들어 선택될 수 없도록 한다. 그러나, 흐리게 하진 않다.
l MF_ENABLED 메뉴 아이템을 사용 가능으로 만들어 선택할 수 있도록 하고, 사용 불능 상태로부터 회복시킨다.
l MF_GRAYED 메뉴 아이템을 사용 불능으로 만들어 선택할 수도 없도록 하고, 흐리게 만든다.
l MF_MENUBARBREAK 새로운 라인에 아이템을 정적 메뉴로 대체하거나 새 열에 아이템을 팝업 메뉴 대신에 둔다. 새 팝업 메뉴 열은 수직 분리하는 라인에 의해 이전 열에서 분리된다.
l MF_MENUBREAK 새 라인에 아이템을 정적 메뉴로 대체하거나 새 열에 아이템을 팝업 메뉴로 대체한다. 열 사이에 분리 라인은 없다.
l MF_OWNERDRAW 아이템을 오너-드로우 아이템으로 지정한다. 메뉴가 맨 처음 디스플레이될 때, 메뉴를 소유하는 윈도우는 메뉴 아이템의 폭과 높이를 검색하는WM_MEASUREITEM 메시지를 받는다. WM_DRAWITEM 메시지는 소유자가 메뉴 아이템의 외형을 갱신할 때마다 발생한다. 이 홉션은 최상위 레벨의 메뉴 아이템에는 적용되지 않는다.
l MF_POPUP 연관된 팝업 메뉴를 가지는 메뉴 아이템을 지정한다. ID 파라미터는 아이템과 연관될 팝업 메뉴에 핸들을 지정한다. 이것은 탑 레벨 팝업 메뉴 또는 계층적 팝업 메뉴를 추가하기 위해 사용된다.
l MF_SEPARATOR 수평 분리 라인을 그린다. 팝업 메뉴 안에서만 사용될 수 있다. 이 라인은 흐려지거나, 사용 불능 또는 강조될 수 없다. 다른 파라미터는 무시된다.
l MF_STRING 문자 스트링이 있는 메뉴 아이템을 지정한다.
다음 그룹 각각은 함께 사용될 수 없고, 서로 배제되는 플래그 목록이다:
l MF_DISABLED, MF_ENABLED, 그리고 MF_GRAYED
l MF_STRING, MF_OWNERDRAW, MF_SEPARATOR, 그리고 비트맵 버전
l MF_MENUBARBREAK 그리고 MF_MENUBREAK
l MF_CHECKED 그리고 MF_UNCHECKED
윈도우에 상주하는 메뉴가 변경될 때마다(윈도우가 보여지거나 그렇지 않을 때) , 응용프로그램은 반드시 CWnd::DrawMenuBar를 호출해야만 한다.
CMenu::CheckMenuItem
UINT CheckMenuItem( UINT nIDCheckItem, UINT nCheck );
반환값
아이템의 이전 상태: MF_CHECKED 또는 MF_UNCHECKED, 또는 메뉴 아이템이 존재하지 않으면0xFFFFFFFF.
파라미터
nIDCheckItem nCheck에 의해 결정되어, 체크될 메뉴 아이템을 지정한다.
nCheck 메뉴 아이템을 체크하는 방법과 메뉴에 아이템의 위치를 결정하는 방법을 지정한다. nCheck 파라미터는 MF_BYPOSITION 또는 MF_BYCOMMAND 플래그를 가진 MF_CHECKED 또는 MF_UNCHECKED의 결합일 수 있다. 그것들은 다음과 같은 의미를 가진다:
l MF_BYCOMMAND 기존 메뉴 아이템의 명령ID를 부여하는 파라미터를 지정한다.
l MF_BYPOSITION 기존 메뉴 아이템의 위치를 부여하는 파라미터. 첫번째 파라미터는 0의 위치를 가진다.
l MF_CHECKED 아이템 옆에 디폴트 체크 표시를 놓기 위해 MF_UNCHECKED와 함께 토글로써 작동한다.
l MF_UNCHECKED 아이템 옆에 체크 표시를 제거하기 위해 MF_CHECKED와 함께 토글로써 작동한다.
Remarks
팝업 메뉴의 메뉴 아이템에 체크 마크를 추가하거나 제거한다. nIDCheckItem 파라미터는 수정될 아이템을 지정한다.
nIDCheckItem 파라미터는 메뉴 아이템뿐만 아니라 팝업 메뉴 아이템도 식별할 수 있다. 팝업 메뉴를 체크하기 위한 특별한 단계는 필요하지 않다. 최상위 레벨 메뉴 아이템은 체크될 수 없다. 팝업 메뉴 아이템은 그것과 연관된 메뉴 아이템 식별자를 갖지 않기 때문에 위치(position)에 의해 체크되어야 한다.
CMenu::CheckMenuRadioItem
BOOL CheckMenuRadioItem( UINT nIDFirst, UINT nIDLast, UINT nIDItem, UINT nFlags );
반환값
성공하면 0이 아닌 값; 아니면 0.
파라미터
nIDFirst 라디오 버튼 그룹에 있는 첫번째 메뉴 아이템을 지정한다.(nFlags의 값에 의존하는 ID 또는 옵셋으로써)
nIDLast 라디오 버튼 그룹에 있는 마지막 메뉴 아이템을 지정한다.(nFlags의 값에 의존하는 ID 또는 옵셋으로써)
nIDItem 라디오 버튼에 의해 체크될 그룹내에 있는 아이템을 지정한다.(nFlags의 값에 의존하는 ID 또는 옵셋으로써)
nFlags nIDFirst, nIDLast 그리고 nIDItem 을 다음과 같은 방법으로 해석한다:
nFlags |
해석 |
MF_BYCOMMAND |
파라미터가 기존의 메노 아이템의 명령 ID를 준다는 것을 지정한다. MF_BYCOMMAND 또는 MF_BYPOSITION 이 설정되어있지 않으면 이것이 디폴트가 된다. |
MF_BYPOSITION |
파라미터가 있는 메뉴 아이템의 위치를 준다는 것을 지정한다. 첫번째 아이템은 0에 위치한다. |
Remarks
지정된 메뉴 아이템을 체크하고 라디오 아이템을 만든다. 동시에, 관련 그룹 내의 다른 메뉴 아이템은 체크를 해제하고 라디오 아이템 타입의 플래그를 없앤다. 체크된 아이템은 체크 마크 비트맵 대신에 라디오 버튼(작은 점)을 이용하여 표시된다.
CMenu::EnableMenuItem
UINT EnableMenuItem( UINT nIDEnableItem, UINT nEnable );
반환값
이전 상태(MF_DISABLED, MF_ENABLED, 또는 MF_GRAYED) 또는 유효하지 않은 경우는 –1.
파라미터
nIDEnableItem nEnable에 따라, 사용 가능하게 할 메뉴 아이템을 지정한다. 이 파라미터는 표준 메뉴 아이템 뿐만아니라 팝업 메뉴 아이템도 지정할 수 있다.
nEnable 실행할 동작을 지정한다. 이것은 MF_BYCOMMAND 또는 MF_BYPOSITION 과 MF_DISABLED, MF_ENABLED, 또는 MF_GRAYED의 결합일 수 있다. 이러한 값은 비트 OR 연산에 의해 결합될 수 있다. 이것들은 다음과 같은 의미를 가지고 있다:
l MF_BYCOMMAND 기존 메뉴 아이템의 명령ID를 부여하는 파라미터를 지정한다.
l MF_BYPOSITION 기존 메뉴 아이템의 위치를 부여하는 파라미터. 첫번째 파라미터는 0의 위치를 가진다.
l MF_DISABLED 메뉴 아이템을 사용 불능으로 만들어 선택될 수 없도록 한다. 그러나, 흐리게 하진 않다.
l MF_ENABLED 메뉴 아이템을 사용 가능으로 만들어 선택할 수 있도록 하고, 사용 불능 상태로부터 회복시킨다.
l MF_GRAYED 메뉴 아이템을 사용 불능으로 만들어 선택할 수도 없도록 하고, 흐리게 만든다.
Remarks
메뉴 아이템을 활성화, 비활성화, 또는 흐리게 만든다. CreateMenu, InsertMenu, ModifyMenu, 그리고 LoadMenuIndirect 멤버 함수에서도 메뉴 아이템의 상태(활성, 비활성, 흐리게)를 설정할 수 있다.
MF_BYPOSITION 값을 사용하여 응용프로그램이 정확한 CMenu를 사용하게 요구한다. 만약 메뉴바의 CMenu가 사용되면 최상위 메뉴 아이템이 영향을 받게된다. 위치에 따라 팝업 메뉴나 중첩 팝업 메뉴에 있는 아이템의 상태를 설정하기 위해 응용프로그램은 팝업 메뉴의 CMenu를 지정해 주어야 한다.
응용프로그램이 MF_BYCOMMAND 플래그를 설정하면, 윈도우는 CMenu에 종속된 팝업 메뉴, 아이템 모두를 체크한다. 그러므로, 중복 메뉴 아이템이 나타나지 않으면 메뉴 바의 CMenu를 사용하는 것으로도 충분하다.
CMenu::GetMenuItemCount
UINT GetMenuItemCount( ) const;
반환값
함수가 성공하면 메뉴의 아이템 개수; 그렇지 않으면 –1.
Remarks
팝업 또는 최상위 레벨 메뉴에 속한 아이템의 개수를 얻는다.
CMenu::GetMenuItemID
UINT GetMenuItemID( int nPos ) const;
반환값
함수가 성공하면 팝업 메뉴 내의 지정한 아이템의 ID. 만약 지정된 아이템이 팝업 메뉴라면(팝업 메뉴 내의 아이템이 아닌), 반환값은 -1이다. 만약 nPos가 SEPARATOR 메뉴 아이템을 가리키면 0을 반환한다.
파라미터
nPos 구하려는 ID를 가진 메뉴 아이템의 위치(0부터 시작)를 지정한다.
Remarks
nPos로 정의한 자리에 위치한 메뉴 아이템에 대한 메뉴 아이템 식별자를 얻는다.
CMenu::GetMenuState
UINT GetMenuState( UINT nID, UINT nFlags ) const;
반환값
지정한 아이템이 존재하지 않으면 0xFFFFFFFF을 반환. 만약 nID가 팝업 메뉴를 가리키면, 상위 바이트는 팝업 메뉴 내의 아이템 수를 포함하고, 하위 바이트는 팝업 메뉴와 연관된 메뉴 플래그를 포함한다. 그렇지 않으면, 반환값은 다음 리스트에 있는 값의 마스크 값(논리값 OR)이다.(이 마스크는 nID가 지정하는 메뉴 아이템의 상태를 나타낸다.)
l MF_CHECKED 아이템 옆에 디폴트 체크 마크를 하기위해 MF_UNCHECKED와 함께 토글(toggle)로써 사용된다. 응용프로그램이 체크 마크 비트맵을 지원하면(SetMenuItemBitmaps 멤버 함수를 참고하라.), "체크 마크 켜짐(check mark on)" 비트맵이 디스플레이된다.
l MF_DISABLED 메뉴 아이템을 사용 불능으로 만들어 선택될 수 없도록 한다. 그러나, 흐리게 하진 않다.
l MF_ENABLED 메뉴 아이템을 사용 가능으로 만들어 선택할 수 있도록 하고, 사용 불능 상태로부터 회복시킨다. 이 상수값이 0임을 명심하라; 이 값을 사용할 때 응용프로그램은 0에 대하여 테스트하면 안된다.
l MF_GRAYED 메뉴 아이템을 사용 불능으로 만들어 선택할 수도 없도록 하고, 흐리게 만든다.
l MF_MENUBARBREAK 새로운 라인에 아이템을 정적 메뉴로 대체하거나 새 열에 아이템을 팝업 메뉴 대신에 둔다. 새 팝업 메뉴 열은 수직 분리하는 라인에 의해 이전 열에서 분리된다.
l MF_MENUBREAK 새 라인에 아이템을 정적 메뉴로 대체하거나 새 열에 아이템을 팝업 메뉴로 대체한다. 열 사이에 분리 라인은 없다.
l MF_SEPARATOR 수평 분리 라인을 그린다. 팝업 메뉴 안에서만 사용될 수 있다. 이 라인은 흐려지거나, 사용 불능 또는 강조될 수 없다. 다른 파라미터는 무시된다.
l MF_UNCHECKED 아이템 옆에 디폴트 체크 마크를 제거하기위해 MF_CHECKED와 함께 토글(toggle)로써 사용된다. 응용프로그램이 체크 마크 비트맵을 지원하면(SetMenuItemBitmaps 멤버 함수를 참고하라.), "체크 마크 꺼짐(check mark off)" 비트맵이 디스플레이된다. 이 상수값이 0임을 명심하라; 이 값을 사용할 때 응용프로그램은 0에 대하여 테스트하면 안된다.
파라미터
nID nFlags에 의해 결정된 것에 따라, 메뉴 아이템의 ID를 지정한다.
nFlags nID의 속성을 지정한다. 이것은 다음 중에서 하나를 가질 수 있다:
l MF_BYCOMMAND 기존 메뉴 아이템의 명령ID를 부여하는 파라미터를 지정한다.
l MF_BYPOSITION 기존 메뉴 아이템의 위치를 부여하는 파라미터. 첫번째 파라미터는 0의 위치를 가진다.
Remarks
지정한 메뉴 아이템의 상태 또는 팝업 메뉴의 아이템 개수를 반환한다.
CMenu::GetMenuString
int GetMenuString( UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags ) const;
int GetMenuString( UINT nIDItem, CString& rString, UINT nFlags ) const;
반환값
널 문자를 포함하지 않고, 버퍼에 복사된 실제 바이트 수.
파라미터
nIDItem nFlags에 따라 메뉴 아이템의 정수 식별자나 옵셋을 가리킨다.
lpString 레이블을 받기위한 버퍼의 포인터.
rString 복사된 메뉴 문자열을 받기 위한 CString 객체에 대한 참조.
nMaxCount 복사될 레이블의 바이트 단위 최대 길이를 지정. 만약 레이블이 nMaxCount에서 지정한 최대 숫자보다 길면, 나머지는 잘려버린다.
nFlags nItem을 어떻게 해석할 것인가를 지정하며 다음 중 하나의 값을 가진다:
nFlags |
nIDItem의 해석 |
MF_BYCOMMAND |
파라미터가 기존의 메뉴 아이템의 명령 ID를 준다는 것을 지정한다. MF_BYCOMMAND 또는 MF_BYPOSITION 가 설정되어있지 않다면 이것이 디폴트가 된다. |
MF_BYPOSITION |
파라미터가 기존의 메뉴 아이템의 위치를 준다는 것을 지정한다. 첫번째 아이템은 0에 위치한다. |
Remarks
지정된 메뉴 아이템의 레이블을 지정된 버퍼에 복사한다.
nMaxCount 파라미터는 문자열의 종결을 나타내는 널문자까지 포함해야하므로 레이블의 문자수보다 더 큰 값을 가져야한다.
CMenu::GetSubMenu
CMenu* GetSubMenu( int nPos ) const;
반환값
만약 팝업 메뉴가 주어진 위치에 존재하면 팝업 메뉴의 핸들을 나타내는 m_hMenu 멤버를 가지는CMenu 객체의 포인터; 그렇지 않으면 NULL. 만약 CMenu 객체가 존재하지 않으면, 임시로 하나가 생성된다. 반환된 CMenu 포인터는 저장되어서는 안된다.
파라미터
nPos 메뉴에 포함된 팝업 메뉴의 위치를 지정. 첫번째 메뉴 아이템에 대해서 0이 부여된다. 팝업 메뉴의 식별자가 이 함수에 사용되어서는 안된다.
Remarks
팝업 메뉴의 CMenu 객체를 얻는다.
CMenu::InsertMenu
BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );
반환값
함수가 성공하면 0이 아닌 값; 그렇지 않으면 0.
파라미터
nPosition 삽입될 메뉴 아이템 앞에 위치하는 메뉴 아이템을 지정. nFlags파라미터는 nPosition의 해석을 다음과 같은 방법으로 한다.:
nFlags |
nPosition의 해석 |
MF_BYCOMMAND |
파라미터가 기존의 메뉴 아이템의 명령 ID를 준다는 것을 지정한다. MF_BYCOMMAND 또는 MF_BYPOSITION 가 설정되어있지 않다면 이것이 디폴트가 된다. |
MF_BYPOSITION |
파라미터가 기존의 메뉴 아이템의 위치를 준다는 것을 지정한다. 첫번째 아이템은 0에 위치한다. |
nFlags nPosition이 해석되는 방법을 지정하며 새로운 메뉴 아이템이 메뉴에 추가될 때 이 아이템의 상태 정보를 지정한다. 설정될 수 있는 플래그 리스트에 대해서는 AppendMenu 멤버 함수를 참조하라. 하나의 값 이상을 지정하기 위해서는 MF_BYCOMMAND 또는 MF_BYPOSITION 플래그와 비트 OR 연산을 이용하여 조합한다.
nIDNewItem 새로운 메뉴 아이템의 명령 ID를 지정하거나 nFlags가 MF_POPUP으로 설정되면 팝업 메뉴의 메뉴 핸들을 지정한다. nFlags가 MF_SEPARATOR로 설정되면 이 파라미터는 무시된다.
lpszNewItem 새 메뉴 아이템을 지정한다. nFlags 파라미터는 이 변수를 해석하는 방법을 제공한다:
nFlags |
lpszNewItem의 해석 |
MF_OWNERDRAW |
메뉴 아이템과 관련된 추가 데이터를 포함하는데 사용될 수 있는 32비트 값을 제공하는 응용프로그램을 포함한다. 32비트 값은 WM_MEASUREITEM과 WM_DRAWITEM 메시지에 의해 제공된 구조체의 itemData 멤버내의 응용프로그램에 이용될 수 있다. 이러한 메시지는 메뉴 아이템이 초기에 디스플레이 되거나 변경될 때 보내진다. |
MF_STRING |
널로 종결된 문자열에 대한 long 포인터를 포함한다. 이것이 디폴트 해석이다. |
MF_SEPARATOR |
lpszNewItem 파라미터를 무시한다(필요치 않다). |
pBmp 메뉴 아이템으로 사용될 CBitmap 객체의 포인터
Remarks
nPosition에 의해 지정된 위치에 새로운 아이템을 삽입하고 다른 아이템은 아래로 이동로 이동시킨다. 응용프로그램은 nFlags에서 값을 설정함으로써 메뉴 아이템의 상태를 지정할 수 있다.
윈도우에 상주하는 메뉴가 변경될 때마다 응용프로그램은 CWnd::DrawMenuBar를 호출해야만 한다.
nIDNewItem이 팝업 메뉴를 지정하면 이 팝업 메뉴는 삽입되는 메뉴의 일부분이 된다. 만약 메뉴가 소멸되면 삽입된 메뉴도 또한 소멸된다. 삽입된 메뉴는 충돌을 피하기 위해 CMenu 객체로부터 분리되어야 한다.
만약 다중 문서 인터페이스(MDI)의 활성 차일드 윈도우가 최대화되고 응용프로그램이 이 함수를 호출하고 MF_BYPOSITION 플래그를 지정함으로써 MDI 응용프로그램의 메뉴에 팝업 메뉴를 삽입하면 예상했던 위치보다 멀리 떨어진 자리에 삽입되게 된다. 이것은 활성 차일드 윈도우의 콘트롤 메뉴가 MDI 프레임 윈도우 메뉴바의 첫번째 자리에 삽입되기 때문이다. 메뉴를 적절히 배치하려면 응용프로그램은 다른 것이 사용되지 않는 한 한자리 값에 1을 더해주어야한다. 응용프로그램은 WM_MDIGETACTIVE메시지를 사용하여 현재의 활성 차일드 윈도우가 최대화되었는지의 여부를 결정할 수 있다.
CMenu::ModifyMenu
BOOL ModifyMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
BOOL ModifyMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );
반환값
함수가 성공하면 0이 아닌 값; 그렇지 않으면 0.
파라미터
nPosition 변경될 메뉴 아이템을 지정한다. nFlags 파라미터는 다음과 같은 방법으로 nPosition의 해석에 사용될 수 있다:
nFlags |
nPosition의 해석 |
MF_BYCOMMAND |
파라미터가 기존의 메뉴 아이템의 명령 ID를 준다는 것을 지정한다. MF_BYCOMMAND 또는 MF_BYPOSITION 가 설정되어있지 않다면 이것이 디폴트가 된다. |
MF_BYPOSITION |
파라미터가 기존의 메뉴 아이템의 위치를 준다는 것을 지정한다. 첫번째 아이템은 0에 위치한다. |
nFlags nPosition이 해석되는 방법을 지정하고 메뉴 아이템의 변경 사항에 대한 정보를 지정한다. 설정될 수 있는 플래그의 리스트는 AppendMenu 멤버 함수를 참조하라.
nIDNewItem 새로운 메뉴 아이템의 명령 ID를 지정하거나 nFlags가 MF_POPUP으로 설정되면 팝업 메뉴의 메뉴 핸들을 지정한다. nFlags가 MF_SEPARATOR로 설정되면 이 파라미터는 무시된다.
lpszNewItem 새 메뉴 아이템의 내용을 지정한다. nFlags 파라미터는 다음과 같은 방법으로 lpszNewItem의 해석에 사용될 수 있다:
nFlags |
lpszNewItem의 해석 |
MF_OWNERDRAW |
메뉴 아이템과 관련된 추가 데이터를 포함하는데 사용될 수 있는 32비트 값을 제공하는 응용프로그램을 포함한다. 이 32비트 값은 MF_MEASUREITEM 과 MF_DRAWITEM을 응용프로그램이 다를 경우에 유효하다. |
MF_STRING |
널문자로 끝나는 문자열이나 CString의 long 타입 포인터를 포함한다. |
MF_SEPARATOR |
lpszNewItem 파라미터가 무시된다(필요치 않다). |
pBmp 메뉴 아이템으로 사용될 CBitmap 객체의 포인터
Remarks
nPosition에 의해 지정된 위치에 메뉴 아이템을 변경한다. 응용프로그램이 nFlags에서 값을 설정함으로써 메뉴 아이템의 새로운 상태를 지정할 수 있다. 만약 이 함수가 메뉴 아이템과 관련된 팝업 메뉴를 대체한다면 이전의 팝업 메뉴를 소멸시키고 팝업 메뉴에 의해 사용되었던 메모리도 해제한다.
nIDNewItem이 팝업 메뉴를 지정하면 이 팝업 메뉴는 삽입되는 메뉴의 일부분이 된다. 만일 메뉴가 소멸되면 삽입된 팝업 메뉴도 소멸될 것이며 삽입된 메뉴는 충돌을 피하기위해 CMenu객체로부터 분리되어야 한다.
윈도우에 상주하는 메뉴가 변경될 때마다(윈도우가 디스플레이 되거나 안될 때) 응용프로그램은 CWnd::DrawMenuBar를 호출해야만 한다. 기존 메뉴 아이템의 속성을 바꾸기위해서는 CheckMenuItem과 EnableMenuItem 멤버 함수를 이용하는 것이 더 빠르다.
CMenu::RemoveMenu
BOOL RemoveMenu( UINT nPosition, UINT nFlags );
반환값
함수가 성공하면 0이 아닌 값; 그렇지 않으면 0.
파라미터
nPosition 변경될 메뉴 아이템을 지정한다. nFlags 파라미터는 다음과 같은 방법으로 nPosition의 해석에 사용될 수 있다:
nFlags |
Interpretation of nPosition |
MF_BYCOMMAND |
파라미터가 기존의 메뉴 아이템의 명령 ID를 준다는 것을 지정한다. MF_BYCOMMAND 또는 MF_BYPOSITION 가 설정되어있지 않다면 이것이 디폴트가 된다. |
MF_BYPOSITION |
파라미터가 기존의 메뉴 아이템의 위치를 준다는 것을 지정한다. 첫번째 아이템은 0에 위치한다. |
nFlags nPosition이 해석되는 방법을 지정한다.
Remarks
메뉴에서 팝업 메뉴와 관련된 메뉴 아이템을 삭제한다. 이것은 팝업 메뉴의 핸들을 소멸하는 것이 아니며, 그렇기 때문에 메뉴는 재사용될 수 있다. 이 함수를 호출하기전에, 응용프로그램은 재사용을 위해 팝업 CMenu객체를 얻는 GetSubMenu 함수를 호출한다.
윈도우에 상주하는 메뉴가 변경될 때마다(윈도우가 디스플레이 되거나 안될 때) 응용프로그램은 CWnd::DrawMenuBar를 호출해야만 한다.
CMenu::SetMenuItemBitmaps
BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );
반환값
함수가 성공하면 0이 아닌 값; 그렇지 않으면 0.
파라미터
nPosition 변경될 메뉴 아이템을 지정한다. nFlags 파라미터는 다음과 같은 방법으로 nPosition의 해석에 사용될 수 있다:
nFlags |
nPosition의 해석 |
MF_BYCOMMAND |
파라미터가 기존의 메뉴 아이템의 명령 ID를 준다는 것을 지정한다. MF_BYCOMMAND 또는 MF_BYPOSITION 가 설정되어있지 않다면 이것이 디폴트가 된다. |
MF_BYPOSITION |
파라미터가 기존의 메뉴 아이템의 위치를 준다는 것을 지정한다. 첫번째 아이템은 0에 위치한다. |
nFlags nPosition이 해석되는 방법을 지정한다.
pBmpUnchecked 체크되지 않은 메뉴 아이템에 사용할 비트맵을 지정한다.
pBmpChecked 체크할 메뉴 아이템에 사용할 비트맵을 지정한다.
Remarks
메뉴 아이템과 지정된 비트맵을 연관시킨다. 메뉴 아이템이 체크되었든 않았든, 윈도우는 메뉴 아이템 옆에 적절한 비트맵을 출력한다.
만약 pBmpUnchecked 또는 pBmpChecked이 NULL이면, 윈도우는 일치하는 속성에 대한 메뉴 아이템 옆에 아무것도 출력하지 않는다. 만일 두 파리미터가 모두 NULL이면, 윈도우는 아이템이 체크될 때는 디폴트 체크마크를 사용하고 아이템의 체크를 없앨 때에는 체크 마크를 삭제한다.
메뉴가 소멸될 때 이러한 비트맵들은 같이 소멸하지 않는다; 응용프로그램은 반드시 이것을 소멸시켜야만 한다.
윈도우 GetMenuCheckMarkDimensions 함수는 메뉴 아이템을 위해 사용된 디폴트 체크 표시의 치수를 검색한다. 응용프로그램은 이 함수로 제공된 비트맵에 대한 적절한 크기를 결정하기위해 이러한 값들을 사용한다. 크기를 확보하고, 비트맵을 생성한 후, 그 값을 설정한다.
CMenu::GetMenuContextHelpId
DWORD GetMenuContextHelpId( ) const;
반환값
CMenu에 연결된 문맥 도움말 ID. 연결되어있지 않으면 0.
Remarks
CMenu에 연결된 문맥 도움말을 얻으려면 이 함수를 호출하라.
CMenu::SetMenuContextHelpId
BOOL SetMenuContextHelpId( DWORD dwContextHelpId );
반환값
함수가 성공하면 0이 아닌 값; 그렇지 않으면 0.
파라미터
dwContextHelpId CMenu에 연관된 문맥 도움말 ID.
Remarks
CMenu와 문맥 도움말 ID를 연관시키려면 이 함수를 호출하라. 메뉴에 있는 모든 아이템들이 이 식별자를 공유하게 된다.
CMenu::DrawItem
virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );
파라미터
lpDrawItemStruct 요구되는 그리기 타입에 대한 정보를 가지고 있는 DRAWITEMSTRUCT 구조체의 포인터.
Remarks
소유 객체에 의해 그려진 메뉴의 모습을 변경할 때 프레임워크에 의해 호출된다. DRAWITEMSTRUCT 구조체의 ItemAction 멤버는 실행될 그리기 동작을 정의한다. 소유 객체에 의해 그려진 CMenu 객체에 대한 그리기를 수행하기 위해 이 멤버 함수를 오버라이드 한다. 응용프로그램은 이 멤버 함수를 종료하기전에 lpDrawItemStruct에 제공된 디스플레이 컨텍스트를 위해 선택된 GDI 객체를 복원해야만 한다.
DRAWITEMSTRUCT 구조체에 대한 설명은 CWnd::OnDrawItem을 참조하라.
CMenu::MeasureItem
virtual void MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct );
파라미터
lpMeasureItemStruct MEASUREITEMSTRUCT 구조체의 포인터
Remarks
소유 객체에 의해 그려진 메뉴가 생성될 때 프레임워크에 의해 호출된다. 디폴트로 이 멤버 함수는 아무 일도 하지 않는다. 윈도우에 메뉴의 치수를 알리려면 이 멤버 함수를 오버라이드하여 MEASUREITEMSTRUCT 구조체를 채워라.
MEASUREITEMSTRUCT 구조체에 대한 설명은 CWnd::OnMeasureItem 를 참조하라
'C & C++ > MFC 컨트롤' 카테고리의 다른 글
[Button] 버튼에 이미지, 아이콘 적용 (0) | 2011.04.15 |
---|---|
[Ctrl] 컨트롤 색상, 폰트 변경 (0) | 2011.04.14 |
[List] 리스트 컨트롤 정렬 (0) | 2011.04.14 |
[Tip] 한라인씩 자동 스트롤 (0) | 2011.04.14 |
[Tip] Ribbon Interface (0) | 2011.04.14 |
댓글