티스토리 뷰
MFC 메뉴2
메뉴관련 리소스 파일은 '프로젝트명.rc' 이다.
프로젝트 솔루션 탐색기에서 해당 파일을 열면 IDR_MAINFRAME 과 IDR_프로젝트명TYPE 두가지가 있다.
1. IDR_MAINFRAME
응용 프로그램에 열린 document 가 없을때 적용된다.
2. IDR_프로젝트명TYPE
하나 이상의 document가 열릴때 적용된다.
메뉴 관련 메시지 처리기는 메시지 형식에 따라 COMMAND 와 UPDATE_COMMAND_UI 두가지가 있다.
1. COMMAND
메뉴가 선택되었을때 메시지 발생된다. 이벤트 처리기는 선택되는 메뉴 항목에 해당하는 적절한 기능을 제공해야 한다.
2. UPDATE_COMMAND_UI
메뉴가 업데이트 되어야 할때 그 상태(체크 또는 체크 해제 등)에 따라 발생된다.
이 메시지는 팝업 메뉴가 표시되기 전에 발생하므로 사용자가 보기 전에 메뉴 항목의 모양을 설정할 수 있다.
==============
메뉴 항목을 수정할때 주의
1
2
3
4
5
6
7
8
9
10
11
12 |
void CCMenuTestDlg::OnBnClickedButton1()
{
CMenu* pMenu = GetMenu(); // link되어 있는 menu를 가져온다.
int pos = FindMenuItem(pMenu, "메뉴"); // 위의 그림에서 맨 위에 있는 문자열이다. FindMenuItem는 CMainFrame 에서 사용가능한듯..
CMenu* submenu = pMenu->GetSubMenu(pos);
pos = FindMenuItem(submenu, "메뉴1"); // 변경하고 싶은 원래 문자열
if (pos > -1)
{
UINT id = submenu->GetMenuItemID(pos);
submenu->ModifyMenu(id, MF_BYCOMMAND, id, "&Save Selection"); // 새로운 문자열로 변경한다.
}
} |
cs |
위 코드는 몌뉴1 에서 &Save Selection 으로 메뉴를 변경한다.
아래 코드의 24행 처럼 POSITION 으로 수정하면 메뉴의 이벤트 처리가 안된다.
처음 디자인한 메뉴는 1억, 2억, 3억.... 으로 메뉴 표시되는데, 1억(42,643개), 2억(85,287개), 3억(127,931) 로 메뉴 항목을 바꿔 표시한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 |
void CDlg::메뉴수량표시(int n기준)
{
CMenu* pContextMenu;
pContextMenu = m_Menu.GetSubMenu(0)->GetSubMenu(_일반위치값); // 서브 팝업메뉴가 있는 일반/공격매수 메뉴선택, 구분선까지 포함해서 위치값을 지정한다. 0 부터 시작
int nCnt = pContextMenu->GetMenuItemCount();
CString str, str가격, str가격temp;
INT64 n수량;
CNumEdit Num;
int nPos = 0;
UINT nID = 0;
for (int i = 1; i < nCnt; i++)
{
pContextMenu->GetMenuString(i, str가격, MF_BYPOSITION);
str가격temp = str가격;
nPos = str가격.Find(TEXT("억"));
str가격temp = str가격.Left(nPos);
n수량 = _ttoi(str가격temp) * INT64(100000000) / n기준;
str.Format(TEXT("%d"), n수량);
str.Format(TEXT("%s억 (%s개)"), str가격temp, Num.InsertComma(str));
////////////////
//pContextMenu->ModifyMenu(i, MF_BYPOSITION | MF_STRING, i, str); // POSITION으로 하면 메뉴의 이벤트 처리 안된다.
nID = pContextMenu->GetMenuItemID(i);
pContextMenu->ModifyMenu(nID, MF_BYCOMMAND | MF_STRING, nID, str);
////////////////
}
} |
cs |