Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Uyarı
Microsoft Foundation Sınıfları (MFC) kitaplığı desteklenmeye devam ediyor. Ancak artık özellik eklemeyeceğiz veya belgeleri güncelleştirmeyeceğiz.
Microsoft Foundation Sınıf (MFC) Kitaplığı ile oluşturulan tek belgeli arabirim (SDI) uygulamasında, her belge türü tek bir görünüm türüyle ilişkilendirilir. Bazı durumlarda, belgenin geçerli görünümünü yeni bir görünümle değiştirme özelliğine sahip olmak tercih edilir.
Tavsiye
Tek bir belge için birden çok görünüm uygulama hakkında ek yordamlar için bkz. CDocument::AddView ve COLLECT MFC örneği.
Yeni türetilmiş bir sınıf ve görünümleri dinamik olarak mevcut bir CViewMFC uygulamasına geçirmek için ek kod ekleyerek bu işlevi uygulayabilirsiniz.
Adımlar aşağıdaki gibidir:
Bu konunun geri kalanında aşağıdakiler varsayılır:
Türetilmiş nesnenin adı
CWinAppCMyWinAppşeklindedir veCMyWinApp, MYWINAPP.H ve MYWINAPP.CPP içinde bildirilir ve tanımlanır.CNewViewyeniCViewtüretilmiş nesnenin adıdır veCNewViewNEWVIEW.H ve NEWVIEW.CPP'de bildirilir ve tanımlanır.
Mevcut Uygulama Sınıfını Değiştirme
Uygulamanın görünümler arasında geçiş yapmak için, görünümleri depolamak için üye değişkenleri ve bunları değiştirmek için bir yöntem ekleyerek uygulama sınıfını değiştirmeniz gerekir.
CMyWinApp içindeki bildirimine aşağıdaki kodu ekleyin.
CView *m_pOldView;
CView *m_pNewView;
CView *SwitchView();
Yeni üye değişkenleri m_pOldView ve m_pNewView, geçerli görünüme ve yeni oluşturulana işaret eder. Yeni yöntem (SwitchView), kullanıcı tarafından istendiğinde görünümleri değiştirir. Yönteminin gövdesi, bu konunun ilerleyen bölümlerinde Anahtarlama İşlevini Uygulama başlığında açıklanmaktadır.
Uygulama sınıfında yapılan son değişiklik, anahtar işlevinde kullanılan bir Windows iletisini (WM_INITIALUPDATE) tanımlayan yeni bir üst bilgi dosyası eklenmesini gerektirir.
MYWINAPP'in ekleme bölümüne aşağıdaki satırı ekleyin . CPP:
#include <AFXPRIV.H>
Değişikliklerinizi kaydedin ve sonraki adıma geçin.
Yeni Görünüm Sınıfını Oluşturma ve Değiştirme
Yeni görünüm sınıfı oluşturmak, Sınıf Görünümü'nde sağlanan Yeni Sınıf komutu kullanılarak kolay hale getirilir. Bu sınıfın tek gereksinimi, CView sınıfından türetilmiş olmasıdır. Bu yeni sınıfı uygulamaya ekleyin. Projeye yeni sınıf ekleme hakkında belirli bilgiler için bkz. Sınıf Ekleme.
Sınıfı projeye ekledikten sonra, bazı görünüm sınıfı üyelerinin erişilebilirliğini değiştirmeniz gerekir.
NEWVIEW.H dosyasını değiştirin; oluşturucu ve yıkıcı için erişim tanımlayıcısını protected'den public'ye değiştirin. Bu, sınıfın dinamik olarak oluşturulmasını ve yok edilmesini ve görünümün, görünür olmadan önce, görünümünü değiştirmesini sağlar.
Değişikliklerinizi kaydedin ve sonraki adıma geçin.
Yeni Görünüm Oluşturma ve Ekleme
Yeni görünümü oluşturmak ve eklemek için uygulama sınıfınızın işlevini değiştirmeniz InitInstance gerekir. Değişiklik, yeni bir görünüm nesnesi oluşturan ve ardından hem m_pOldView hem de m_pNewView'i mevcut iki görünüm nesnesiyle başlatan yeni kod ekler.
İşlev içinde yeni görünüm oluşturulduğundan InitInstance , hem yeni hem de mevcut görünümler uygulamanın ömrü boyunca kalır. Ancak uygulama, yeni görünümü dinamik olarak kolayca oluşturabilir.
Bu çağrıdan sonra ProcessShellCommand kodunu ekleyin.
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 kaydedin ve sonraki adıma geçin.
Anahtarlama İşlevini Uygulama
Önceki adımda, yeni bir görünüm nesnesi oluşturup başlatan kodu eklediniz. Son önemli parça, anahtarlama yöntemini uygulamaktır. SwitchView
Uygulama sınıfınız (MYWINAPP) için uygulama dosyasının sonunda. CPP), aşağıdaki yöntem tanımı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 kaydedin ve sonraki adıma geçin.
Görünüm Değiştirme Desteği Ekleme
Son adım, uygulamanın görünümler arasında geçiş yapması gerektiğinde yöntemini çağıran SwitchView kod eklemeyi içerir. Bu işlem çeşitli yollarla yapılabilir: kullanıcının seçmesi için yeni bir menü öğesi ekleyerek veya belirli koşullar karşılandığında görünümleri dahili olarak değiştirerek.
Yeni menü öğeleri ve komut işleyici işlevleri ekleme hakkında daha fazla bilgi için bkz. Komutlar ve Denetim Bildirimleri için İşleyiciler.