티스토리 뷰

프로그래밍/MFC

MFC 메뉴2

에어버스 2018. 4. 29. 14:59

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

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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 30