Share via


DYNAMENU 샘플: 동적으로 메뉴 업데이트

업데이트: 2007년 11월

DYNAMENU 샘플에서는 컴파일 타임에 처리 명령이 인식되는지 여부와 상관없이 메뉴 및 상태 표시줄을 동적으로 수정하는 방법을 보여 줍니다. DYNAMENU에서는 다음 기능을 보여 줍니다.

  • 메뉴에 있는 항목 목록을 동적으로 업데이트

  • 컴파일 타임에 ID가 인식되지 않는 메뉴 명령에 대해 ON_COMMANDON_UPDATE_COMMAND_UI 처리기에 해당하는 처리기 구현. 이 샘플에서 보여 주는 구현 방법은 사용자가 구성할 수 있는 메뉴 등의 보다 복잡한 경우에도 적용할 수 있습니다.

  • 컴파일 타임에 ID가 인식되지 않는 명령에 대해 상태 표시줄 명령 프롬프트 업데이트

보안 정보:

이 샘플 코드는 개념을 보여 주기 위해 제공되며 가장 안전한 코드 작성 방법을 제시하지 않을 수 있으므로 응용 프로그램이나 웹 사이트에서 사용할 수 없습니다. Microsoft는 샘플 코드를 원래 용도 이외의 다른 용도로 사용하는 경우 발생하는 부수적이나 파생적인 손해에 대해 책임을 지지 않습니다.

샘플 및 이를 설치하기 위한 지침을 가져오려면

  • Visual Studio의 도움말 메뉴에서 샘플을 클릭합니다.

    자세한 내용은 샘플 파일 찾기를 참조하십시오.

  • 최신 버전 및 전체 샘플 목록은 Visual Studio 2008 Samples 페이지에서 온라인으로 사용할 수 있습니다.

  • 컴퓨터의 하드 디스크에서도 샘플을 찾을 수 있습니다. 기본적으로 샘플과 추가 정보 파일은 \Program Files\Visual Studio 9.0\Samples\ 아래의 폴더에 복사됩니다. Visual Studio Express Edition의 경우에는 모든 샘플이 온라인에 있습니다.

샘플 빌드 및 실행

DYNAMENU 샘플을 빌드하고 실행하려면

  1. 솔루션 파일인 dynamenu.sln을 엽니다.

  2. 빌드 메뉴에서 빌드를 클릭합니다.

  3. 디버그 메뉴에서 디버깅하지 않고 시작을 클릭합니다.

DYNAMENU는 처음에 "This text is displayed in the current color."라는 텍스트가 표시된 창을 표시합니다. Color 메뉴에 처음 표시되는 Black, Red, Purple 또는 Blue 네 개 항목 중 하나를 선택하여 표시된 텍스트의 색을 변경할 수 있습니다.

DYNAMENU의 동적 메뉴 업데이트 기능을 테스트하려면 Color 메뉴에서 Change Options를 클릭합니다. 이렇게 하면 Change Color Options 대화 상자가 열립니다. Black, Red, Purple 및 Blue의 확인란을 사용하여 Color 메뉴에 동적으로 표시되는 색을 선택할 수 있습니다. 예를 들어, Red와 Purple의 선택을 취소하고 Color 메뉴로 돌아가면 Black과 Blue 항목만 메뉴에 표시됩니다.

상태 표시줄의 표시 방식을 확인합니다. 예를 들어, Color 메뉴의 검정 항목에 포커스가 있으면 "Set current color text to Black"이라는 텍스트가 표시됩니다.

메뉴에 있는 항목 목록을 동적으로 업데이트

Mdichild.cpp의 CDynaMDIChildWnd 클래스는 Color 메뉴에 있는 항목의 동적 업데이트 기능을 구현합니다. 사용 가능한 색 목록이 업데이트되거나 업데이트 후 MDI 자식 창이 활성화되면 CDynaMDIChildWnd::RefreshColorMenu 함수는 CMenu::DeleteMenu를 호출하여 메뉴에서 각 색 항목을 삭제한 다음 CMenu::AppendMenu를 사용하여 현재 활성화된 색을 메뉴에 추가합니다.

동적 메뉴 항목에 대한 명령 처리기 구현

DYNAMENU는 색에 대한 명령 ID(ID_COLOR_BLACK, ID_COLOR_RED 등)의 고정 목록을 예약하여 구현할 수 있습니다. 이러한 경우, 일반적으로 ON_COMMANDON_UPDATE_COMMAND_UI 처리기는 색상 명령에 대해 구현됩니다. 이 방법은 DYNAMENU를 구현하는 가장 간단한 방법입니다.

그러나 DYNAMENU에서는 이러한 명령 처리기의 구현 방법을 보여 주기 위해 고정 명령 ID를 사용하지 않습니다. 대신 DYNAMENU에서는 컴파일 타임에 인식되지 않으며 메뉴 항목과 연결되지 않은 명령 ID를 동적으로 할당합니다. 이 샘플에서 보여 주는 구현 방법은 사용자가 구성할 수 있는 메뉴 등의 보다 복잡한 경우에도 적용할 수 있습니다.

ON_COMMANDON_UPDATE_COMMAND 메시지 맵 처리와 같은 기능을 하는 처리기는 해당 문서의 CCmdTarget::OnCmdMsg를 재정의하여 구현됩니다. OnCmdMsg 함수가 AFX_CMDHANDLERINFO* 매개 변수에 대해 NULL 포인터를 사용하여 호출되면 이는 해당 명령에 대해 메시지 맵 엔트리가 발견되지 않았음을 나타냅니다. 이 경우 OnCmdMsg를 재정의하면 첫 번째 매개 변수로 전달된 명령 ID가 해당 색 메뉴 항목에 대해 동적으로 할당된 명령 ID인지 여부를 확인할 수 있습니다. 이 조건이 충족되면 재정의 함수는 OnCmdMsg에 전달된 두 번째 매개 변수가 MFC에서 정의한 CN_COMMAND인지 CN_UPDATE_COMMAND_UI인지 여부에 따라 명령 처리기(DoSelectColor) 또는 명령 사용자 인터페이스 처리기(DoUpdateSelectColor)를 호출합니다.

동적 메뉴 항목에 대한 상태 표시줄 명령 프롬프트 업데이트

DYNAMENU에서 MDI 자식 창(CDynaMDIChildWnd)에는 상태 표시줄이 있습니다. 기본 구현된 CFrameWnd::GetMessageString은 현재 표시된 명령 ID, 즉 메뉴에서 현재 포커스가 있는 항목의 명령 ID를 사용하여 해당 명령에 맞는 문자열 리소스를 가져오고 이를 상태 표시줄의 첫 번째 창에 표시합니다. DYNAMENU에서는 GetMessageString을 재정의하여 동적으로 정의된 명령에 대한 명령 프롬프트를 표시합니다.

키워드

이 샘플에서는 다음의 키워드를 보여 줍니다.

AfxFormatString1, AfxGetMainWnd, CCmdTarget::OnCmdMsg, CDialog::DoModal, CDialog::OnInitDialog, CDocument::GetFirstViewPosition, CDocument::GetNextView, CDocument::OnNewDocument, CDocument::UpdateAllViews, CFrameWnd::Create, CFrameWnd::GetActiveDocument, CFrameWnd::GetMessageString, CFrameWnd::LoadFrame, CMenu::AppendMenu, CMenu::DeleteMenu, CMenu::GetMenuItemCount, CMenu::GetMenuItemID, CMenu::GetSubMenu, CObject::AssertValid, CObject::Dump, CObject::Serialize, CString::LoadString, CView::DoPreparePrinting, CView::GetDocument, CView::OnBeginPrinting, CView::OnDraw, CView::OnEndPrinting, CView::OnPreparePrinting, CWinApp::AddDocTemplate, CWinApp::EnableShellOpen, CWinApp::InitInstance, CWinApp::LoadStdProfileSettings, CWinApp::RegisterShellFileTypes, CWnd::CenterWindow, CWnd::DoDataExchange, CWnd::GetClientRect, CWnd::GetDlgItem, CWnd::GetMenu, CWnd::GetParentFrame, CWnd::OnCreate, CWnd::SetWindowText, CWnd::ShowWindow, CWnd::UpdateWindow, DragAcceptFiles, DrawText, LoadBitmap, RGB, SetBkMode, SetTextColor

참고:

이 샘플을 비롯한 일부 샘플은 Visual C++ 마법사, 라이브러리 및 컴파일러의 변경 내용을 반영하도록 수정되지 않았지만 해당 작업의 수행 방법을 보여 줍니다.

참고 항목

기타 리소스

MFC 샘플