Tek bir belge birden çok görünüm ekleme
Microsoft Foundation Class (mfc) kitaplığı ile oluşturulan tek document Interface (SDI) uygulama her belge tipi tek görünüm türü ile ilişkilidir. Bazı durumlarda, yeni bir görünüm, geçerli belge görünümünü geçme özelliğine sahip yöntemdir.
İpucu
Tek bir belge için birden çok görünüm uygulama ek yordamları için bkz: CDocument::AddView ve TOPLAMAK mfc örnek.
Bu işlevselliği ekleyerek yeni bir uygulama CView-türetilmiş sınıf ve Görünüm dinamik olarak varolan bir mfc uygulamaya geçiş için ek kod.
Adımlar aşağıdaki gibidir:
Varolan uygulama sınıfı değiştirme
Oluşturma ve yeni bir görünüm sınıf değiştirme
Oluşturma ve yeni görünümü ekleme
Anahtarlama işlevi uygulamak
Görünüme geçmek için destek Ekle
Bu konu geri kalanını aşağıdaki varsayılmaktadır:
Adı CWinApp-türetilen nesne CMyWinApp, ve CMyWinApp bildirilen ve MYWINAPP içinde tanımlanan.H ve MYWINAPP.CPP.
CNewViewYeni adı CView-nesne, türetilmiş ve CNewView bildirilir ve yeni görünüm tanımlanmış.H ve yeni görünüm.CPP.
Varolan uygulama sınıfı değiştirme
Uygulama görünümleri arasında geçiş yapmak, uygulama sınıfı, görünümleri ve bunların arasında geçiş yapmak için bir yöntem depolamak için üye değişkenlerini ekleyerek değiştirmeniz gerekir.
Bildiriminde, aşağıdaki kodu ekleyip CMyWinApp , MYWINAPP.Y:
CView* m_pOldView;
CView* m_pNewView;
CView* SwitchView( );
Yeni üye değişkenleri m_pOldView ve m_pNewView, geçerli görünüm ve yeni oluşturulan bir işaret. Yeni yöntem (SwitchView) kullanıcı tarafından istendiğinde görünümleri geçer. Yöntemin gövdesi bu konunun ilerisinde açıklanan geçiş işlevinin.
Bir Windows iletiyi tanımlayan yeni bir üstbilgi dosyası da dahil olmak üzere uygulama sınıfı son değişiklik gerektirir (WM_INITIALUPDATE) anahtarlama işlevi kullanılır.
MYWINAPP Ekle bölümünde şu satırı ekleyin.CPP:
#include <AFXPRIV.H>
Değişikliklerinizi kaydetmek ve sonraki adıma geçin.
Oluşturma ve yeni bir görünüm sınıf değiştirme
Yeni Görünüm sınıf oluşturma yapılan kolay kullanarak Yeni bir sınıf komut sınıfı görünümünden kullanılabilecek. Yalnızca bu sınıfın dan türer gereksinimdir CView. Bu yeni sınıf uygulama ekleyin. Projeye yeni bir sınıf ekleme ile ilgili ayrıntılı bilgi için bkz: bir sınıf ekleyerek.
Sınıf projeye eklendikten sonra bazı görünüm sınıf üyelerinin değiştirmek gerekir.
Yeni Görünüm değiştirin.Gelen erişim belirticisi değiştirerek h protected için ortak yapıcı ve yıkıcı. Bu sınıf oluşturulur ve dinamik olarak görmesi ve görünür önce view görünümünü değiştirmek için olanak sağlar.
Değişikliklerinizi kaydetmek ve sonraki adıma geçin.
Oluşturma ve yeni görünümü ekleme
Oluşturmak ve yeni görünüm eklemek için değiştirmeniz gerekir InitInstance application sınıfının işlevi. Yeni bir görüntüleme nesnesini ve sonra başlatır hem oluşturur Yeni bir kod değişikliği ekler m_pOldView ve m_pNewView ile iki varolan nesne görüntüle.
Yeni bir görünüm içinde oluşturulduğundan InitInstance işlevi, yeni ve varolan görünümleri kalıcı uygulama yaşam için. Ancak, uygulamanın yeni bir görünüm gibi kolayca dinamik olarak oluşturabilir.
Çağrısının bu kodu Ekle 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);
Değişikliklerinizi kaydetmek ve sonraki adıma geçin.
Anahtarlama işlevi uygulamak
Önceki adımda oluşturulan ve başlatılan yeni bir görünüm nesne kodu eklendi. Son ana anahtarlama yöntemi uygulamak için parçasıdır SwitchView.
Uygulamanız için uygulama dosyasının sonunda (MYWINAPP. sınıfcpp) aşağıdaki yöntem tanımının ekleyin:
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;
}
Değişikliklerinizi kaydetmek ve sonraki adıma geçin.
Görünüme geçmek için destek Ekle
Son adımı çağıran kodu ekleyerek içerir SwitchView uygulama görünümleri arasında geçiş yapmak gerektiğinde yöntemi. Bu çeşitli şekillerde yapılabilir: kullanıcı seçmek için yeni bir menü öğesi ekleme veya belirli koşullar gerçekleştiğinde dahili görünümleri değiştirme.
Yeni menü öğeleri ve komut işleyicisi işlevler ekleme hakkında daha fazla bilgi için bkz: komut ve denetim bildirimleri için işleyiciler.