Bagikan melalui


Menambahkan Beberapa Tampilan ke Satu Dokumen

Dalam aplikasi antarmuka dokumen tunggal (SDI) yang dibuat dengan Microsoft Foundation Class (MFC) Library, setiap jenis dokumen dikaitkan dengan jenis tampilan tunggal. Dalam beberapa kasus, diinginkan untuk memiliki kemampuan untuk mengalihkan tampilan dokumen saat ini dengan tampilan baru.

Petunjuk / Saran

Untuk prosedur tambahan tentang menerapkan beberapa tampilan untuk satu dokumen, lihat CDocument::AddView dan sampel COLLECT MFC.

Anda dapat menerapkan fungsionalitas ini dengan menambahkan kelas -turunan baru CViewdan kode tambahan untuk mengalihkan tampilan secara dinamis ke aplikasi MFC yang ada.

Langkah-langkahnya adalah sebagai berikut:

Sisa topik ini mengasumsikan hal berikut:

  • Nama objek -turunan CWinAppadalah CMyWinApp, dan CMyWinApp dideklarasikan dan didefinisikan dalam MYWINAPP. H dan MYWINAPP. CPP.

  • CNewView adalah nama objek -turunan baru CView, dan CNewView dideklarasikan dan didefinisikan dalam NEWVIEW. H dan NEWVIEW. CPP.

Mengubah Kelas Aplikasi yang Ada

Agar aplikasi beralih antar tampilan, Anda perlu memodifikasi kelas aplikasi dengan menambahkan variabel anggota untuk menyimpan tampilan dan metode untuk mengalihkannya.

Tambahkan kode berikut ke deklarasi CMyWinApp di MYWINAPP. H:

CView *m_pOldView;
CView *m_pNewView;
CView *SwitchView();

Variabel anggota baru, m_pOldView dan m_pNewView, arahkan ke tampilan saat ini dan yang baru dibuat. Metode baru (SwitchView) mengalihkan tampilan saat diminta oleh pengguna. Isi metode dibahas nanti dalam topik ini dalam Menerapkan Fungsi Pengalihan.

Modifikasi terakhir pada kelas aplikasi memerlukan termasuk file header baru yang menentukan pesan Windows (WM_INITIALUPDATE) yang digunakan dalam fungsi pengalihan.

Sisipkan baris berikut di bagian sertakan MYWINAPP. CPP:

#include <AFXPRIV.H>

Simpan perubahan Anda dan lanjutkan ke langkah berikutnya.

Membuat dan Memodifikasi Kelas Tampilan Baru

Membuat kelas tampilan baru menjadi mudah dengan menggunakan perintah Kelas Baru yang tersedia dari Tampilan Kelas. Satu-satunya persyaratan untuk kelas ini adalah bahwa ia berasal dari CView. Tambahkan kelas baru ini ke aplikasi. Untuk informasi spesifik tentang menambahkan kelas baru ke proyek, lihat Menambahkan Kelas.

Setelah menambahkan kelas ke proyek, Anda perlu mengubah aksesibilitas beberapa anggota kelas tampilan.

Ubah NEWVIEW. H dengan mengubah penentu akses dari protected ke public untuk konstruktor dan destruktor. Ini memungkinkan kelas dibuat dan dihancurkan secara dinamis dan memodifikasi tampilan sebelum terlihat.

Simpan perubahan Anda dan lanjutkan ke langkah berikutnya.

Membuat dan Melampirkan Tampilan Baru

Untuk membuat dan melampirkan tampilan baru, Anda perlu memodifikasi InitInstance fungsi kelas aplikasi Anda. Modifikasi menambahkan kode baru yang membuat objek tampilan baru lalu menginisialisasi keduanya m_pOldView dan m_pNewView dengan dua objek tampilan yang ada.

Karena tampilan baru dibuat dalam InitInstance fungsi, tampilan baru dan yang sudah ada bertahan selama masa pakai aplikasi. Namun, aplikasi dapat dengan mudah membuat tampilan baru secara dinamis.

Sisipkan kode ini setelah panggilan ke ProcessShellCommand:

CView *pActiveView = ((CFrameWnd *)m_pMainWnd)->GetActiveView();
m_pOldView = pActiveView;
m_pNewView = (CView *)new CNewView;
if (NULL == m_pNewView)
   return FALSE;

CDocument *pCurrentDoc = ((CFrameWnd *)m_pMainWnd)->GetActiveDocument();

// Initialize a CCreateContext to point to the active document.
// With this context, the new view is added to the document
// when the view is created in CView::OnCreate().
CCreateContext newContext;
newContext.m_pNewViewClass = NULL;
newContext.m_pNewDocTemplate = NULL;
newContext.m_pLastView = NULL;
newContext.m_pCurrentFrame = NULL;
newContext.m_pCurrentDoc = pCurrentDoc;

// The ID of the initial active view is AFX_IDW_PANE_FIRST.
// Incrementing this value by one for additional views works
// in the standard document/view case but the technique cannot
// be extended for the CSplitterWnd case.
UINT viewID = AFX_IDW_PANE_FIRST + 1;
CRect rect(0, 0, 0, 0); // Gets resized later.

// Create the new view. In this example, the view persists for
// the life of the application. The application automatically
// deletes the view when the application is closed.
m_pNewView->Create(NULL, _T("AnyWindowName"), WS_CHILD, rect, m_pMainWnd, viewID, &newContext);

// When a document template creates a view, the WM_INITIALUPDATE
// message is sent automatically. However, this code must
// explicitly send the message, as follows.
m_pNewView->SendMessage(WM_INITIALUPDATE, 0, 0);

Simpan perubahan Anda dan lanjutkan ke langkah berikutnya.

Menerapkan Fungsi Pengalihan

Pada langkah sebelumnya, Anda menambahkan kode yang membuat dan menginisialisasi objek tampilan baru. Bagian utama terakhir adalah menerapkan metode pengalihan, SwitchView.

Di akhir file implementasi untuk kelas aplikasi Anda (MYWINAPP. CPP), tambahkan definisi metode berikut:

CView *CMyWinApp::SwitchView()
{
   CView *pActiveView = ((CFrameWnd *)m_pMainWnd)->GetActiveView();

   CView *pNewView = NULL;
   if (pActiveView == m_pOldView)
      pNewView = m_pNewView;
   else
      pNewView = m_pOldView;

      // Exchange view window IDs so RecalcLayout() works.
#ifndef _WIN32
   UINT temp = ::GetWindowWord(pActiveView->m_hWnd, GWW_ID);
   ::SetWindowWord(pActiveView->m_hWnd, GWW_ID, ::GetWindowWord(pNewView->m_hWnd, GWW_ID));
   ::SetWindowWord(pNewView->m_hWnd, GWW_ID, temp);
#else
   UINT temp = ::GetWindowLong(pActiveView->m_hWnd, GWL_ID);
   ::SetWindowLong(pActiveView->m_hWnd, GWL_ID, ::GetWindowLong(pNewView->m_hWnd, GWL_ID));
   ::SetWindowLong(pNewView->m_hWnd, GWL_ID, temp);
#endif

   pActiveView->ShowWindow(SW_HIDE);
   pNewView->ShowWindow(SW_SHOW);
   ((CFrameWnd *)m_pMainWnd)->SetActiveView(pNewView);
   ((CFrameWnd *)m_pMainWnd)->RecalcLayout();
   pNewView->Invalidate();
   return pActiveView;
}

Simpan perubahan Anda dan lanjutkan ke langkah berikutnya.

Menambahkan Dukungan untuk Mengalihkan Tampilan

Langkah terakhir melibatkan penambahan kode yang memanggil SwitchView metode ketika aplikasi perlu beralih antar tampilan. Ini dapat dilakukan dengan beberapa cara: dengan menambahkan item menu baru bagi pengguna untuk memilih atau mengalihkan tampilan secara internal ketika kondisi tertentu terpenuhi.

Untuk informasi selengkapnya tentang menambahkan item menu baru dan fungsi handler perintah, lihat Handler untuk Perintah dan Pemberitahuan Kontrol.

Lihat juga

Arsitektur Dokumen/Tinjauan