MFC(Microsoft Foundation Class)의 팝업 메뉴(CMenu)에서 MENUITEM의 텍스트를 동적으로 변경하려면, 메뉴가 화면에 표시되기 직전에 ModifyMenu 또는 SetMenuItemInfo 함수를 사용하여 텍스트를 수정해야 합니다.
주로 팝업 메뉴를 띄우는 TrackPopupMenu 호출 직전이나, 메뉴 활성화 메시지인 WM_INITMENUPOPUP 핸들러 내에서 작업을 수행합니다. 아래에 가장 직관적이고 널리 쓰이는 두 가지 방법을 정리해 드립니다.
방법 1. TrackPopupMenu 호출 직전에 변경 (추천)
우클릭 이벤트(예: OnContextMenu 또는 OnRButtonUp) 등에서 팝업 메뉴를 로드하고 띄우기 전에 특정 ID를 가진 메뉴 아이템의 텍스트를 직접 변경하는 방법입니다.
C++
void CMyView::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu menu;
if (!menu.LoadMenu(IDR_POPUP_MENU)) // 리소스에서 메뉴 로드
return;
CMenu* pSubMenu = menu.GetSubMenu(0); // 첫 번째 서브 메뉴(팝업 메뉴) 가져오기
if (pSubMenu == NULL)
return;
// 동적으로 변경할 텍스트 준비
CString strNewText = _T("동적 변경된 메뉴(&D)");
// ModifyMenu를 이용해 ID_MY_MENU_ITEM의 텍스트 변경
pSubMenu->ModifyMenu(
ID_MY_MENU_ITEM, // 변경할 메뉴 아이템 ID
MF_BYCOMMAND | MF_STRING, // ID 기준(BYCOMMAND) 및 문자열 지정
ID_MY_MENU_ITEM, // ID는 그대로 유지
strNewText // 새로운 텍스트 전달
);
// 팝업 메뉴 표시
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}
방법 2. WM_INITMENUPOPUP 메시지 핸들러에서 변경
메뉴가 열리기 직전에 프레임워크가 던져주는 WM_INITMENUPOPUP 메시지를 가로채서 처리하는 방식입니다. 메뉴가 호출되는 경로가 여러 곳이거나, 메뉴 상태를 일괄적으로 관리할 때 유용합니다.
- 클래스 마법사나 메세지 맵을 통해 WM_INITMENUPOPUP 핸들러(OnInitMenuPopup)를 추가합니다.
- 아래와 같이 특정 ID를 체크하여 변경합니다.
C++
void CMyFrameWnd::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
if (pPopupMenu != NULL && !bSysMenu)
{
// 메뉴 내에 해당 ID를 가진 아이템이 존재하는지 확인
UINT nState = pPopupMenu->GetMenuState(ID_MY_MENU_ITEM, MF_BYCOMMAND);
if (nState != 0xFFFFFFFF) // 존재한다면 (-1이 아니라면)
{
CString strNewText = _T("상태에 따른 새 텍스트");
pPopupMenu->ModifyMenu(
ID_MY_MENU_ITEM,
MF_BYCOMMAND | MF_STRING,
ID_MY_MENU_ITEM,
strNewText
);
}
}
}
💡 구현 팁 및 주의사항
- MF_BYCOMMAND vs MF_BYPOSITION: 위 예제에서는 메뉴 아이템의 고유 ID를 타겟팅하기 위해 MF_BYCOMMAND를 사용했습니다. 만약 ID가 없고 순서(인덱스)로 접근해야 한다면 MF_BYPOSITION을 사용하고 첫 번째 인자에 0, 1, 2... 같은 인덱스 번호를 넣어야 합니다.
- 단축키 지정: 텍스트 뒤에 (&D) 형태로 붙여주면 Alt + D 와 같은 메뉴 진입 단축키가 동적으로 함께 지정됩니다.
LIST
'MFC' 카테고리의 다른 글
| "xsd.exe"이(가) 종료되었습니다(코드: 1) 해결 방법 (0) | 2026.05.22 |
|---|---|
| Visual Studio 2022 이후 버전에서 .props 파일 대체 방법 (1) | 2026.05.20 |
| MFC 예외 객체(CException)가 해제되지 않아 메모리 누수가 발생 (0) | 2025.12.23 |
| MSXML에서 createElement를 사용할 때 자동으로 xmlns="" 속성이 붙는 이유와 막는 방 (0) | 2025.12.19 |
| BluetoothFindFirstDevice Example (0) | 2024.10.21 |