본문 바로가기
C & C++/MFC 컨트롤

[Dialog] 다이얼로그에 팝업메뉴 띄우기

by izen8 2011. 4. 14.
반응형

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 참조하라

반응형

댓글