2012년 7월 25일 수요일

CMenu의 모든것


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.xpoint.ythis);
}
========================================
메뉴의 체크표시

   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 nFlagsint x, int y, CWndpWnd, 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 CBitmappBmp );

반환값
함수가 성공적으로 수행되면 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_OWNERDRAWAppendMenu 비트맵 버전에 대해서는 유효하지 않다.

다음 목록은 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   nIDFirstnIDLast 그리고 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
메뉴 아이템을 활성화비활성화또는 흐리게 만든다CreateMenuInsertMenuModifyMenu그리고 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 lpStringint nMaxCount, UINT nFlags ) const;
int GetMenuString( UINT nIDItemCStringrString, 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 CBitmappBmp );

반환값
함수가 성공하면 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 CBitmappBmp );

반환값
함수가 성공하면 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 CBitmappBmpUnchecked, 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  참조하라.



댓글 없음:

댓글 쓰기