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 CFrameWnd
PostNcDestroy
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
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 , MDICascade
tanpa 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 MDITile
pertama , 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.
Lihat juga
MFC Sampel MDI
MFC Sampel MDIDOCVW
Sampel MFC SNAPVW
Kelas CFrameWnd
Bagan Hierarki
Kelas CWnd
Kelas CMDIChildWnd