Bagikan melalui


Kelas CMDIFrameWnd

Menyediakan fungsionalitas jendela bingkai antarmuka beberapa dokumen (MDI) Windows, bersama dengan anggota untuk mengelola jendela.

Sintaks

class CMDIFrameWnd : public CFrameWnd

Anggota

Konstruktor Publik

Nama Deskripsi
CMDIFrameWnd::CMDIFrameWnd Membangun sebuah CMDIFrameWnd.

Metode Publik

Nama Deskripsi
CMDIFrameWnd::CreateClient Membuat jendela MDICLIENT Windows untuk ini CMDIFrameWnd. Dipanggil oleh OnCreate fungsi anggota dari CWnd.
CMDIFrameWnd::CreateNewChild Membuat jendela anak baru.
CMDIFrameWnd::GetWindowMenuPopup Mengembalikan menu pop-up Jendela.
CMDIFrameWnd::MDIActivate Mengaktifkan jendela anak MDI yang berbeda.
CMDIFrameWnd::MDICascade Mengatur semua jendela anak dalam format berskala.
CMDIFrameWnd::MDIGetActive Mengambil jendela anak MDI yang saat ini aktif, bersama dengan bendera yang menunjukkan apakah anak dimaksimalkan atau tidak.
CMDIFrameWnd::MDIIconArrange Mengatur semua jendela anak dokumen yang diminimalkan.
CMDIFrameWnd::MDIMaximize Memaksimalkan jendela anak MDI.
CMDIFrameWnd::MDINext Mengaktifkan jendela anak tepat di belakang jendela anak yang saat ini aktif dan menempatkan jendela anak yang saat ini aktif di belakang semua jendela anak lainnya.
CMDIFrameWnd::MDIPrev Mengaktifkan jendela anak sebelumnya dan menempatkan jendela anak yang saat ini aktif tepat di belakangnya.
CMDIFrameWnd::MDIRestore Memulihkan jendela anak MDI dari ukuran yang dimaksimalkan atau diminimalkan.
CMDIFrameWnd::MDISetMenu Mengganti menu jendela bingkai MDI, menu pop-up Jendela, atau keduanya.
CMDIFrameWnd::MDITile Mengatur semua jendela anak dalam format ubin.

Keterangan

Untuk membuat jendela bingkai MDI yang berguna untuk aplikasi Anda, dapatkan kelas dari CMDIFrameWnd. Tambahkan variabel anggota ke kelas turunan untuk menyimpan data khusus untuk aplikasi Anda. Terapkan fungsi anggota penangan pesan dan peta pesan di kelas turunan untuk menentukan apa yang terjadi ketika pesan diarahkan ke jendela.

Anda dapat membuat jendela bingkai MDI dengan memanggil fungsi anggota Buat atau LoadFrame dari CFrameWnd.

Sebelum memanggil Create atau LoadFrame, Anda harus membuat objek jendela bingkai pada tumpukan menggunakan operator C++ new . Sebelum memanggil Create , Anda juga dapat mendaftarkan kelas jendela dengan fungsi global AfxRegisterWndClass untuk mengatur ikon dan gaya kelas untuk bingkai.

Create Gunakan fungsi anggota untuk meneruskan parameter pembuatan bingkai sebagai argumen langsung.

LoadFrame membutuhkan lebih sedikit argumen daripada Create, dan sebaliknya mengambil sebagian besar nilai defaultnya dari sumber daya, termasuk keterangan bingkai, ikon, tabel akselerator, dan menu. Untuk diakses oleh LoadFrame, semua sumber daya ini harus memiliki ID sumber daya yang sama (misalnya, IDR_MAINFRAME).

Meskipun MDIFrameWnd berasal dari CFrameWnd, kelas jendela bingkai yang berasal dari CMDIFrameWnd tidak perlu dideklarasikan dengan DECLARE_DYNCREATE.

Kelas CMDIFrameWnd mewarisi banyak implementasi defaultnya dari CFrameWnd. Untuk daftar terperinci fitur-fitur ini, lihat deskripsi kelas CFrameWnd . Kelas CMDIFrameWnd ini memiliki fitur tambahan berikut:

  • Jendela bingkai MDI mengelola jendela MDICLIENT, memposisikannya kembali bersama dengan bilah kontrol. Jendela klien MDI adalah induk langsung dari jendela bingkai anak MDI. Gaya jendela WS_HSCROLL dan WS_VSCROLL yang ditentukan pada CMDIFrameWnd berlaku untuk jendela klien MDI daripada jendela bingkai utama sehingga pengguna dapat menggulir area klien MDI (seperti di Manajer Program Windows, misalnya).

  • Jendela bingkai MDI memiliki menu default yang digunakan sebagai bilah menu ketika tidak ada jendela anak MDI aktif. Ketika ada anak MDI aktif, bilah menu jendela bingkai MDI secara otomatis digantikan oleh menu jendela anak MDI.

  • Jendela bingkai MDI berfungsi bersama dengan jendela anak MDI saat ini, jika ada. Misalnya, pesan perintah didelegasikan ke anak MDI yang saat ini aktif sebelum jendela bingkai MDI.

  • Jendela bingkai MDI memiliki handler default untuk perintah menu Window standar berikut:

    • ID_WINDOW_TILE_VERT

    • ID_WINDOW_TILE_HORZ

    • ID_WINDOW_CASCADE

    • ID_WINDOW_ARRANGE

  • Jendela bingkai MDI juga memiliki implementasi ID_WINDOW_NEW, yang membuat bingkai baru dan tampilan pada dokumen saat ini. Aplikasi dapat mengambil alih implementasi perintah default ini untuk menyesuaikan penanganan jendela MDI.

Jangan gunakan operator C++ delete untuk menghancurkan jendela bingkai. Gunakan CWnd::DestroyWindow sebagai gantinya. Implementasi CFrameWndPostNcDestroy akan menghapus objek C++ saat jendela dihancurkan. Ketika pengguna menutup jendela bingkai, handler default OnClose akan memanggil DestroyWindow.

Untuk informasi selengkapnya tentang CMDIFrameWnd, lihat Bingkai Windows.

Hierarki Warisan

CObject

CCmdTarget

CWnd

CFrameWnd

CMDIFrameWnd

Persyaratan

Header: afxwin.h

CMDIFrameWnd::CMDIFrameWnd

Membuat CMDIFrameWnd objek.

CMDIFrameWnd();

Keterangan

Create Panggil fungsi atau LoadFrame anggota untuk membuat jendela bingkai MDI yang terlihat.

Contoh

// 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

Membuat jendela klien MDI yang mengelola CMDIChildWnd objek.

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

Parameter

lpCreateStruct
Pointer panjang ke struktur CREATESTRUCT .

pWindowMenu
Penunjuk ke menu pop-up Jendela.

Tampilkan Nilai

Bukan nol jika berhasil; jika tidak, 0.

Keterangan

Fungsi anggota ini harus dipanggil jika Anda mengambil alih fungsi anggota secara OnCreate langsung.

Contoh

// 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

Membuat jendela anak baru.

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

Parameter

pClass
Kelas run-time jendela anak yang akan dibuat.

nResource
ID sumber daya bersama yang terkait dengan jendela anak.

hMenu
Menu jendela anak.

hAccel
Akselerator jendela anak.

Keterangan

Gunakan fungsi ini untuk membuat jendela anak dari jendela bingkai MDI.

Contoh

// 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

Panggil fungsi anggota ini untuk mendapatkan handel ke menu pop-up saat ini bernama "Jendela" (menu pop-up dengan item menu untuk manajemen jendela MDI).

virtual HMENU GetWindowMenuPopup(HMENU hMenuBar);

Parameter

hMenuBar
Bilah menu saat ini.

Tampilkan Nilai

Menu pop-up Jendela jika ada; jika tidak, NULL.

Keterangan

Implementasi default mencari menu pop-up yang berisi perintah menu Jendela standar seperti ID_WINDOW_NEW dan ID_WINDOW_TILE_HORZ.

Ambil alih fungsi anggota ini jika Anda memiliki menu Jendela yang tidak menggunakan ID perintah menu standar.

Contoh

// 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

Mengaktifkan jendela anak MDI yang berbeda.

void MDIActivate(CWnd* pWndActivate);

Parameter

pWndActivate
Arahkan ke jendela anak MDI yang akan diaktifkan.

Keterangan

Fungsi anggota ini mengirimkan pesan WM_MDIACTIVATE ke jendela anak yang diaktifkan dan jendela anak dinonaktifkan.

Ini adalah pesan yang sama yang dikirim jika pengguna mengubah fokus ke jendela anak MDI dengan menggunakan mouse atau keyboard.

Catatan

Jendela anak MDI diaktifkan secara independen dari jendela bingkai MDI. Ketika bingkai menjadi aktif, jendela anak yang terakhir diaktifkan dikirimi pesan WM_NCACTIVATE untuk menggambar bingkai jendela aktif dan bilah keterangan, tetapi tidak menerima pesan WM_MDIACTIVATE lain.

Contoh

Lihat contoh untuk CMDIFrameWnd::GetWindowMenuPopup.

CMDIFrameWnd::MDICascade

Mengatur semua jendela anak MDI dalam format kaskade.

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

Parameter

nType
Menentukan bendera kaskade. Hanya bendera berikut yang dapat ditentukan: MDITILE_SKIPDISABLED, yang mencegah jendela anak MDI yang dinonaktifkan bertingkat.

Keterangan

Versi pertama , MDICascadetanpa parameter, mengapit semua jendela anak MDI, termasuk yang dinonaktifkan. Versi kedua secara opsional tidak menjangkau jendela anak MDI yang dinonaktifkan jika Anda menentukan MDITILE_SKIPDISABLED untuk parameter nType .

Contoh

// 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

Mengambil jendela anak MDI aktif saat ini, bersama dengan bendera yang menunjukkan apakah jendela anak dimaksimalkan.

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

Parameter

pbMaximized
Penunjuk ke nilai pengembalian BOOL. Atur ke TRUE saat kembali jika jendela dimaksimalkan; jika tidak FALSE.

Tampilkan Nilai

Penunjuk ke jendela anak MDI aktif.

Contoh

Lihat contoh untuk CMDIChildWnd::MDIMaximize.

CMDIFrameWnd::MDIIconArrange

Mengatur semua jendela anak dokumen yang diminimalkan.

void MDIIconArrange();

Keterangan

Ini tidak mempengaruhi jendela anak yang tidak diminimalkan.

Contoh

Lihat contoh untuk CMDIFrameWnd::MDICascade.

CMDIFrameWnd::MDIMaximize

Memaksimalkan jendela anak MDI yang ditentukan.

void MDIMaximize(CWnd* pWnd);

Parameter

pWnd
Arahkan ke jendela untuk memaksimalkan.

Keterangan

Ketika jendela anak dimaksimalkan, Windows mengubah ukurannya untuk membuat area kliennya mengisi jendela klien. Windows menempatkan menu Kontrol jendela anak di bilah menu bingkai sehingga pengguna dapat memulihkan atau menutup jendela anak. Ini juga menambahkan judul jendela anak ke judul jendela bingkai.

Jika jendela anak MDI lain diaktifkan ketika jendela anak MDI yang saat ini aktif dimaksimalkan, Windows memulihkan anak yang saat ini aktif dan memaksimalkan jendela anak yang baru diaktifkan.

Contoh

Lihat contoh untuk CMDIChildWnd::MDIMaximize.

CMDIFrameWnd::MDINext

Mengaktifkan jendela anak tepat di belakang jendela anak yang saat ini aktif dan menempatkan jendela anak yang saat ini aktif di belakang semua jendela anak lainnya.

void MDINext();

Keterangan

Jika jendela anak MDI yang saat ini aktif dimaksimalkan, fungsi anggota memulihkan anak yang saat ini aktif dan memaksimalkan anak yang baru diaktifkan.

Contoh

// 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

Mengaktifkan jendela anak sebelumnya dan menempatkan jendela anak yang saat ini aktif tepat di belakangnya.

void MDIPrev();

Keterangan

Jika jendela anak MDI yang saat ini aktif dimaksimalkan, fungsi anggota memulihkan anak yang saat ini aktif dan memaksimalkan anak yang baru diaktifkan.

CMDIFrameWnd::MDIRestore

Memulihkan jendela anak MDI dari ukuran yang dimaksimalkan atau diminimalkan.

void MDIRestore(CWnd* pWnd);

Parameter

pWnd
Arahkan ke jendela untuk dipulihkan.

Contoh

Lihat contoh untuk CMDIChildWnd::MDIRestore.

CMDIFrameWnd::MDISetMenu

Mengganti menu jendela bingkai MDI, menu pop-up Jendela, atau keduanya.

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

Parameter

pFrameMenu
Menentukan menu menu jendela bingkai baru. Jika NULL, menu tidak diubah.

pWindowMenu
Menentukan menu menu pop-up Jendela baru. Jika NULL, menu tidak diubah.

Tampilkan Nilai

Penunjuk ke menu jendela bingkai digantikan oleh pesan ini. Penunjuk mungkin bersifat sementara dan tidak boleh disimpan untuk digunakan nanti.

Keterangan

Setelah memanggil MDISetMenu, aplikasi harus memanggil fungsi anggota DrawMenuBar untuk CWnd memperbarui bilah menu.

Jika panggilan ini menggantikan menu pop-up Jendela, item menu jendela anak MDI dihapus dari menu Jendela sebelumnya dan ditambahkan ke menu pop-up Jendela baru.

Jika jendela anak MDI dimaksimalkan dan panggilan ini menggantikan menu jendela bingkai MDI, menu Kontrol dan kontrol pemulihan dihapus dari menu jendela bingkai sebelumnya dan ditambahkan ke menu baru.

Jangan panggil fungsi anggota ini jika Anda menggunakan kerangka kerja untuk mengelola jendela anak MDI Anda.

Contoh

// 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

Mengatur semua jendela anak dalam format ubin.

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

Parameter

nType
Menentukan bendera ubin. Parameter ini dapat berupa salah satu bendera berikut:

  • MDITILE_HORIZONTAL jendela anak MDI Petak sehingga satu jendela muncul di atas jendela lainnya.

  • MDITILE_SKIPDISABLED Mencegah jendela anak MDI yang dinonaktifkan tidak di-ubin.

  • MDITILE_VERTICAL jendela anak MDI Petak sehingga satu jendela muncul di samping jendela lain.

Keterangan

Versi MDITilepertama , tanpa parameter, ubin jendela secara vertikal di bawah Windows versi 3.1 dan yang lebih baru. Versi kedua memetakan jendela secara vertikal atau horizontal, tergantung pada nilai parameter nType .

Contoh

Lihat contoh untuk CMDIFrameWnd::MDICascade.

Baca juga

MFC Sampel MDI
MFC Sampel MDIDOCVW
Sampel MFC SNAPVW
Kelas CFrameWnd
Bagan Hierarki
Kelas CWnd
Kelas CMDIChildWnd