다음을 통해 공유


CMDIFrameWnd 클래스

창 관리 멤버와 함께 Windows MDI(다중 문서 인터페이스) 프레임 창 기능을 제공합니다.

구문

class CMDIFrameWnd : public CFrameWnd

멤버

공용 생성자

속성 설명
CMDIFrameWnd::CMDIFrameWnd CMDIFrameWnd를 생성합니다.

공용 메서드

이름 설명
CMDIFrameWnd::CreateClient 이에 CMDIFrameWnd대한 Windows MDICLIENT 창을 만듭니다. 의 멤버 함수에 OnCreate 의해 호출됩니다 CWnd.
CMDIFrameWnd::CreateNewChild 새 자식 창을 만듭니다.
CMDIFrameWnd::GetWindowMenuPopup 창 팝업 메뉴를 반환합니다.
CMDIFrameWnd::MDIActivate 다른 MDI 자식 창을 활성화합니다.
CMDIFrameWnd::MDICascade 모든 자식 창을 계단식 형식으로 정렬합니다.
CMDIFrameWnd::MDIGetActive 자식이 최대화되었는지 여부를 나타내는 플래그와 함께 현재 활성 MDI 자식 창을 검색합니다.
CMDIFrameWnd::MDIIconArrange 최소화된 모든 문서 자식 창을 정렬합니다.
CMDIFrameWnd::MDIMaximize MDI 자식 창을 최대화합니다.
CMDIFrameWnd::MDINext 현재 활성 자식 창 바로 뒤에 자식 창을 활성화하고 현재 활성 자식 창을 다른 모든 자식 창 뒤에 배치합니다.
CMDIFrameWnd::MDIPrev 이전 자식 창을 활성화하고 현재 활성 자식 창을 바로 뒤에 배치합니다.
CMDIFrameWnd::MDIRestore 최대화되거나 최소화된 크기에서 MDI 자식 창을 복원합니다.
CMDIFrameWnd::MDISetMenu MDI 프레임 창의 메뉴, 창 팝업 메뉴 또는 둘 다를 바꿉니다.
CMDIFrameWnd::MDITile 모든 자식 창을 타일 형식으로 정렬합니다.

설명

애플리케이션에 대한 유용한 MDI 프레임 창을 만들려면 .에서 CMDIFrameWnd클래스를 파생합니다. 파생 클래스에 멤버 변수를 추가하여 애플리케이션과 관련된 데이터를 저장합니다. 파생 클래스에서 메시지 처리기 멤버 함수 및 메시지 맵을 구현하여 메시지가 창에 전달될 때 수행되는 작업을 지정합니다.

의 Create 또는 LoadFrame 멤버 함수CFrameWnd호출하여 MDI 프레임 창을 생성할 수 있습니다.

호출하거나 LoadFrameCCreate++ new 연산자를 사용하여 힙에서 프레임 창 개체를 생성해야 합니다. 호출 Create 하기 전에 AfxRegisterWndClass 전역 함수를 사용하여 창 클래스를 등록하여 프레임의 아이콘 및 클래스 스타일을 설정할 수도 있습니다.

멤버 함수를 Create 사용하여 프레임의 생성 매개 변수를 즉각적인 인수로 전달합니다.

LoadFrame 에는 보다 Create적은 인수가 필요하고 대신 프레임의 캡션, 아이콘, 액셀러레이터 테이블 및 메뉴를 포함하여 리소스에서 대부분의 기본값을 검색합니다. 액세스 LoadFrame하려면 이러한 모든 리소스에 동일한 리소스 ID(예: IDR_MAINFRAME)가 있어야 합니다.

파생 MDIFrameWnd 되었지만 파생된 CFrameWnd프레임 창 클래스 CMDIFrameWnd 는 .로 선언 DECLARE_DYNCREATE할 필요가 없습니다.

클래스에서 CMDIFrameWnd 기본 구현 CFrameWnd의 대부분을 상속 합니다. 이러한 기능에 대한 자세한 목록은 CFrameWnd 클래스 설명을 참조하세요. 클래스에는 CMDIFrameWnd 다음과 같은 추가 기능이 있습니다.

  • MDI 프레임 창은 MDICLIENT 창을 관리하여 컨트롤 막대와 함께 위치를 변경합니다. MDI 클라이언트 창은 MDI 자식 프레임 창의 직접 부모입니다. 사용자가 MDI 클라이언트 영역을 스크롤할 수 있도록 주 프레임 창이 아닌 MDI 클라이언트 창에 CMDIFrameWnd 적용에 지정된 WS_HSCROLL 및 WS_VSCROLL 창 스타일입니다(예: Windows 프로그램 관리자에서와 같이).

  • MDI 프레임 창에는 활성 MDI 자식 창이 없는 경우 메뉴 모음으로 사용되는 기본 메뉴가 있습니다. 활성 MDI 자식이 있는 경우 MDI 프레임 창의 메뉴 모음이 자동으로 MDI 자식 창 메뉴로 바뀝다.

  • MDI 프레임 창이 있는 경우 현재 MDI 자식 창과 함께 작동합니다. 예를 들어 명령 메시지는 MDI 프레임 창 앞에 현재 활성 MDI 자식에 위임됩니다.

  • MDI 프레임 창에는 다음 표준 창 메뉴 명령에 대한 기본 처리기가 있습니다.

    • ID_WINDOW_TILE_VERT

    • ID_WINDOW_TILE_HORZ

    • ID_WINDOW_CASCADE

    • ID_WINDOW_ARRANGE

  • 또한 MDI 프레임 창에는 ID_WINDOW_NEW 구현되어 현재 문서에서 새 프레임과 보기를 만듭니다. 애플리케이션은 이러한 기본 명령 구현을 재정의하여 MDI 창 처리를 사용자 지정할 수 있습니다.

C++ delete 연산자를 사용하여 프레임 창을 삭제하지 마세요. 대신 CWnd::DestroyWindow를 사용하세요. 이 구현 PostNcDestroyCFrameWnd 창이 제거될 때 C++ 개체를 삭제합니다. 사용자가 프레임 창을 닫으면 기본 OnClose 처리기가 호출 DestroyWindow됩니다.

자세한 내용은 CMDIFrameWnd프레임 창을 참조 하세요.

상속 계층 구조

CObject

CCmdTarget

CWnd

CFrameWnd

CMDIFrameWnd

요구 사항

헤더: afxwin.h

CMDIFrameWnd::CMDIFrameWnd

CMDIFrameWnd 개체를 생성합니다.

CMDIFrameWnd();

설명

또는 LoadFrame 멤버 함수를 Create 호출하여 표시되는 MDI 프레임 창을 만듭니다.

예시

// Create main MDI Frame window. CMainFrame is a CMDIFrameWnd-derived
// class. The default CFrameWnd::PostNcDestroy() handler will delete this
// object when destroyed.
CMainFrame *pMainFrame = new CMainFrame;

CMDIFrameWnd::CreateClient

개체를 관리하는 MDI 클라이언트 창을 만듭니다 CMDIChildWnd .

virtual BOOL CreateClient(
    LPCREATESTRUCT lpCreateStruct,
    CMenu* pWindowMenu);

매개 변수

lpCreateStruct
CREATESTRUCT 구조체에 대한 긴 포인터입니다.

pWindowMenu
창 팝업 메뉴에 대한 포인터입니다.

Return Value

성공하면 0이 아니고, 그렇지 않으면 0입니다.

설명

멤버 함수를 직접 재정의하는 경우 이 멤버 함수를 OnCreate 호출해야 합니다.

예시

// The code below is from winmdi.cpp. It shows how to
// call CMDIFrameWnd::CreateClient(). CMainFrame is a
// CMDIFrameWnd-derived class.
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext * /*pContext*/)
{
   CMenu *pMenu = NULL;
   if (m_hMenuDefault == NULL)
   {
      // default implementation for MFC V1 backward compatibility
      pMenu = GetMenu();
      ASSERT(pMenu != NULL);
      // This is attempting to guess which sub-menu is the Window menu.
      // The Windows user interface guidelines say that the right-most
      // menu on the menu bar should be Help and Window should be one
      // to the left of that.
      int iMenu = pMenu->GetMenuItemCount() - 2;

      // If this assertion fails, your menu bar does not follow the guidelines
      // so you will have to override this function and call CreateClient
      // appropriately or use the MFC V2 MDI functionality.
      ASSERT(iMenu >= 0);
      pMenu = pMenu->GetSubMenu(iMenu);
      ASSERT(pMenu != NULL);
   }

   return CreateClient(lpcs, pMenu);
}

CMDIFrameWnd::CreateNewChild

새 자식 창을 만듭니다.

CMDIChildWnd* CreateNewChild(
    CRuntimeClass* pClass,
    UINT nResource,
    HMENU hMenu = NULL,
    HACCEL hAccel = NULL);

매개 변수

pClass
만들 자식 창의 런타임 클래스입니다.

nResource
자식 창과 연결된 공유 리소스의 ID입니다.

hMenu
자식 창의 메뉴입니다.

hAccel
자식 창의 액셀러레이터입니다.

설명

이 함수를 사용하여 MDI 프레임 창의 자식 창을 만듭니다.

예시

// CMainFrame is a CMDIFrameWnd-derived class,
// OnNewDraw is a menu command handler,
// CDrawFrame is a CMDIChildWnd-derived class.
void CMainFrame::OnNewDraw()
{
   CreateNewChild(RUNTIME_CLASS(CDrawFrame), IDR_DRAW, m_hDrawMenu,
                  m_hDrawAccel);
}

CMDIFrameWnd::GetWindowMenuPopup

이 멤버 함수를 호출하여 "창"이라는 현재 팝업 메뉴(MDI 창 관리를 위한 메뉴 항목이 있는 팝업 메뉴)에 대한 핸들을 가져옵니다.

virtual HMENU GetWindowMenuPopup(HMENU hMenuBar);

매개 변수

hMenuBar
현재 메뉴 모음입니다.

Return Value

창 팝업 메뉴(있는 경우)입니다. 그렇지 않으면 NULL입니다.

설명

기본 구현은 ID_WINDOW_NEW 및 ID_WINDOW_TILE_HORZ 같은 표준 창 메뉴 명령이 포함된 팝업 메뉴를 찾습니다.

표준 메뉴 명령 ID를 사용하지 않는 창 메뉴가 있는 경우 이 멤버 함수를 재정의합니다.

예시

// CMainFrame::OnActivateFirstMDIChild() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived class.
// It looks for the caption of the first created MDI child window from
// the Window popup menu, and then activate the child window.
void CMainFrame::OnActivateFirstMDIChild()
{
   // Get handle to the Window pop-up menu.
   CMenu *menubar = GetMenu();
   CMenu *wmenu = CMenu::FromHandle(GetWindowMenuPopup(menubar->GetSafeHmenu()));
   if (wmenu == NULL)
      return;

   // Get the caption of the first created MDI child window.
   CString caption;
   if (!wmenu->GetMenuString(AFX_IDM_FIRST_MDICHILD, caption, MF_BYCOMMAND))
      return;

   // Get the actual name of the first created MDI child window by
   // getting rid of the number and space, e.g. "&1 MDI 1".
   int pos = caption.FindOneOf(_T(" "));
   if (pos == -1)
      return;

   caption = caption.Right(caption.GetLength() - (pos + 1));

   // Get the CWnd* of the first created MDI child window by comparing
   // the caption of each MDI child window in the MDI application.
   // Activate the first created MDI child window if found.
   CMDIChildWnd *child = MDIGetActive();
   do
   {
      CString str;
      child->GetWindowText(str);
      if (str == caption)
      {
         child->MDIActivate(); // or MDIActivate(child);
         break;
      }

      child = (CMDIChildWnd*)child->GetWindow(GW_HWNDNEXT);
   } while (child);
}

CMDIFrameWnd::MDIActivate

다른 MDI 자식 창을 활성화합니다.

void MDIActivate(CWnd* pWndActivate);

매개 변수

pWndActivate
활성화할 MDI 자식 창을 가리킵니다.

설명

이 멤버 함수는 활성화되는 자식 창과 비활성화 중인 자식 창 모두에 WM_MDIACTIVATE 메시지를 보냅니다.

사용자가 마우스 또는 키보드를 사용하여 MDI 자식 창으로 포커스를 변경하는 경우 전송되는 것과 동일한 메시지입니다.

참고 항목

MDI 자식 창은 MDI 프레임 창과 독립적으로 활성화됩니다. 프레임이 활성화되면 마지막으로 활성화된 자식 창이 WM_NCACTIVATE 메시지를 보내 활성 창 프레임과 캡션 표시줄을 그리지만 다른 WM_MDIACTIVATE 메시지를 받지 않습니다.

예시

CMDIFrameWnd::GetWindowMenuPopup에 대한 예제를 참조하세요.

CMDIFrameWnd::MDICascade

모든 MDI 자식 창을 계단식 형식으로 정렬합니다.

void MDICascade();
void MDICascade(int nType);

매개 변수

nType
연계 플래그를 지정합니다. 비활성화된 MDI 자식 창이 계단식으로 배열되지 않도록 하는 MDITILE_SKIPDISABLED 플래그만 지정할 수 있습니다.

설명

매개 변수가 없는 첫 번째 버전은 MDICascade비활성화된 창을 포함하여 모든 MDI 자식 창을 계단식으로 배열합니다. nType 매개 변수에 대한 MDITILE_SKIPDISABLED 지정하는 경우 두 번째 버전은 필요에 따라 비활성화된 MDI 자식 창을 계단식으로 사용하지 않도록 설정하지 않습니다.

예시

// CMainFrame::OnWindowCommand() is a menu command handler for
// CMainFrame class, which is a CMDIFrameWnd-derived
// class. It handles menu commands for the Windows pop-up menu.
// Its entries in the message map are of the following form:
//    ON_COMMAND_EX(ID_WINDOW_ARRANGE, &CMainFrame::OnWindowCommand)
BOOL CMainFrame::OnWindowCommand(UINT nID)
{
   switch (nID)
   {
   case ID_WINDOW_ARRANGE: // For Window\Arrange Icons menu item, arrange
      MDIIconArrange();    // all minimized document child windows.
      break;

   case ID_WINDOW_CASCADE: // For Window\Cascade menu item, arrange
      MDICascade();        // all the MDI child windows in a cascade format.
      break;

   case ID_WINDOW_TILE_HORZ:       // For Window\Tile Horizontal menu item,
      MDITile(MDITILE_HORIZONTAL); // tile MDI child windows so that
      break;                       // one window appears above another.

   case ID_WINDOW_TILE_VERT:     // For Window\Tile Vertical menu item,
      MDITile(MDITILE_VERTICAL); // tile MDI child windows so that
      break;                     // one window appears beside another.
   }

   return TRUE;
}

CMDIFrameWnd::MDIGetActive

자식 창이 최대화되었는지 여부를 나타내는 플래그와 함께 현재 활성 MDI 자식 창을 검색합니다.

CMDIChildWnd* MDIGetActive(BOOL* pbMaximized = NULL) const;

매개 변수

pbMaximized
BOOL 반환 값에 대한 포인터입니다. 창이 최대화되면 반환 시 TRUE로 설정합니다. 그렇지 않으면 FALSE입니다.

Return Value

활성 MDI 자식 창에 대한 포인터입니다.

예시

CMDIChildWnd::MDIMaximize에 대한 예제를 참조하세요.

CMDIFrameWnd::MDIIconArrange

최소화된 모든 문서 자식 창을 정렬합니다.

void MDIIconArrange();

설명

최소화되지 않은 자식 창에는 영향을 주지 않습니다.

예시

CMDIFrameWnd::MDICascade에 대한 예제를 참조하세요.

CMDIFrameWnd::MDIMaximize

지정된 MDI 자식 창을 최대화합니다.

void MDIMaximize(CWnd* pWnd);

매개 변수

pWnd
최대화할 창을 가리킵니다.

설명

자식 창이 최대화되면 Windows에서 크기를 조정하여 클라이언트 영역이 클라이언트 창을 채우도록 합니다. Windows는 사용자가 자식 창을 복원하거나 닫을 수 있도록 프레임의 메뉴 모음에 자식 창의 컨트롤 메뉴를 배치합니다. 또한 자식 창의 제목을 프레임 창 제목에 추가합니다.

현재 활성 MDI 자식 창이 최대화될 때 다른 MDI 자식 창이 활성화되면 Windows는 현재 활성 자식 창을 복원하고 새로 활성화된 자식 창을 최대화합니다.

예시

CMDIChildWnd::MDIMaximize에 대한 예제를 참조하세요.

CMDIFrameWnd::MDINext

현재 활성 자식 창 바로 뒤에 자식 창을 활성화하고 현재 활성 자식 창을 다른 모든 자식 창 뒤에 배치합니다.

void MDINext();

설명

현재 활성 MDI 자식 창이 최대화되면 멤버 함수는 현재 활성 자식이 복원되고 새로 활성화된 자식이 최대화됩니다.

예시

// CMainFrame::OnActivateNextWindow() is a menu command handler for
// CMainFrame class, which in turn is a CMDIFrameWnd-derived class.
// It activates the child window immediately behind the currently
// active child window and places the currently active child window
// behind all other child windows.
void CMainFrame::OnActivateNextWindow()
{
   MDINext();
}

CMDIFrameWnd::MDIPrev

이전 자식 창을 활성화하고 현재 활성 자식 창을 바로 뒤에 배치합니다.

void MDIPrev();

설명

현재 활성 MDI 자식 창이 최대화되면 멤버 함수는 현재 활성 자식이 복원되고 새로 활성화된 자식이 최대화됩니다.

CMDIFrameWnd::MDIRestore

최대화되거나 최소화된 크기에서 MDI 자식 창을 복원합니다.

void MDIRestore(CWnd* pWnd);

매개 변수

pWnd
복원할 창을 가리킵니다.

예시

CMDIChildWnd::MDIRestore에 대한 예제를 참조하세요.

CMDIFrameWnd::MDISetMenu

MDI 프레임 창의 메뉴, 창 팝업 메뉴 또는 둘 다를 바꿉니다.

CMenu* MDISetMenu(
    CMenu* pFrameMenu,
    CMenu* pWindowMenu);

매개 변수

pFrameMenu
새 프레임 창 메뉴의 메뉴를 지정합니다. NULL이면 메뉴가 변경되지 않습니다.

pWindowMenu
새 창 팝업 메뉴의 메뉴를 지정합니다. NULL이면 메뉴가 변경되지 않습니다.

Return Value

이 메시지로 대체된 프레임 창 메뉴에 대한 포인터입니다. 해당 포인터는 임시적이며, 나중에 사용하려고 저장하면 안됩니다.

설명

호출 MDISetMenu후 애플리케이션은 메뉴 모음을 업데이트하기 위해 DrawMenuBar 멤버 함수 CWnd 를 호출해야 합니다.

이 호출이 창 팝업 메뉴를 대체하면 이전 창 메뉴에서 MDI 자식 창 메뉴 항목이 제거되고 새 창 팝업 메뉴에 추가됩니다.

MDI 자식 창이 최대화되고 이 호출이 MDI 프레임 창 메뉴를 대체하면 컨트롤 메뉴 및 복원 컨트롤이 이전 프레임 창 메뉴에서 제거되고 새 메뉴에 추가됩니다.

프레임워크를 사용하여 MDI 자식 창을 관리하는 경우 이 멤버 함수를 호출하지 마세요.

예시

// CMdiView::OnReplaceMenu() is a menu command handler for CMdiView
// class, which in turn is a CView-derived class. It loads a new
// menu resource and replaces the main application window's menu
// bar with this new menu.
void CMdiView::OnReplaceMenu()
{
   // Load a new menu resource named IDR_SHORT_MENU. m_hDefaultMenu is
   // a member variable of CMdiDoc class (a CDocument-derived class).
   // Its type is HMENU.
   CMdiDoc *pdoc = (CMdiDoc*)GetDocument();
   pdoc->m_hDefaultMenu =
       ::LoadMenu(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_SHORT_MENU));
   if (pdoc->m_hDefaultMenu == NULL)
      return;

   // Get the parent window of this view window. The parent window is
   // a CMDIChildWnd-derived class. We can then obtain the MDI parent
   // frame window using the CMDIChildWnd*. Then, replace the current
   // menu bar with the new loaded menu resource.
   CMDIFrameWnd *frame = ((CMDIChildWnd*)GetParent())->GetMDIFrame();
   frame->MDISetMenu(CMenu::FromHandle(pdoc->m_hDefaultMenu), NULL);
   frame->DrawMenuBar();
}

 

// GetDefaultMenu() is an undocumented virtual function for
// CDocument class. It allows the document to determine which
// menu to display. m_hDefaultMenu is of type HMENU. Its value
// is initialized to NULL either in the constructor or
// CDocument::OnNewDocument(). And the menu resource is destroyed
// in the destructor to avoid having too many menus loaded at once.
HMENU CMdiDoc::GetDefaultMenu()
{
   if (m_hDefaultMenu)
      return m_hDefaultMenu;

   return COleServerDoc::GetDefaultMenu();
}

// Initialize member variable(s) in the constructor. CMdiDoc is
// a CDocument-derived class.
CMdiDoc::CMdiDoc()
{
   // Use OLE compound files
   EnableCompoundFile();

   m_hDefaultMenu = NULL; // initialize to NULL
}

// Destroy menu resource in CMdiDoc's destructor. CMdiDoc is
// a CDocument-derived class.
CMdiDoc::~CMdiDoc()
{
   if (m_hDefaultMenu)
      ::DestroyMenu(m_hDefaultMenu);
}

CMDIFrameWnd::MDITile

모든 자식 창을 타일 형식으로 정렬합니다.

void MDITile();
void MDITile(int nType);

매개 변수

nType
타일링 플래그를 지정합니다. 이 매개 변수는 다음 플래그 중 하나일 수 있습니다.

  • 한 창이 다른 창 위에 표시되도록 타일 MDI 자식 창을 MDITILE_HORIZONTAL.

  • MDITILE_SKIPDISABLED 비활성화된 MDI 자식 창이 타일화되지 않도록 방지합니다.

  • 타일 MDI 자식 창을 MDITILE_VERTICAL 한 창이 다른 창 옆에 표시되도록 합니다.

설명

매개 변수가 없는 첫 번째 버전은 MDITileWindows 버전 3.1 이상에서 창을 세로로 타일로 바둑판화합니다. 두 번째 버전 타일은 nType 매개 변수의 값에 따라 세로 또는 가로로 창을 표시합니다.

예시

CMDIFrameWnd::MDICascade에 대한 예제를 참조하세요.

참고 항목

MFC 샘플 MDI
MFC 샘플 MDIDOCVW
MFC 샘플 SNAPVW
CFrameWnd 클래스
계층 구조 차트
CWnd 클래스
CMDIChildWnd 클래스