Вид без фрейма, на обычном окне

Иногда бывает нужно создать вид, но не на фрейме, а на любом другом окне. Например, если во фрейме вы создали слева CControlBar и на нем хотели бы разместить еще один вид для существующего документа, который отображал бы какую-нибудь дополнительную информацию.

Что для этого нужно:

1. CWnd *pParentWnd - родительское окно.
2. CDocument* pDoc - документ, для которого вы хотите создать вид.
3. CRect rect - положение вида на родителе.
4. CRuntimeClass* pViewClass - runtime class нового вида.
5. UINT nViewID - идентификатор вида на его родителе.

Вот такая функция по этим параметрам создаст новый вид:
CView* CreateDlgView(CWnd *pParentWnd, CDocument* pDoc, CRect rect, CRuntimeClass* pViewClass, UINT nViewID)
{
    
// Сначало мы создаем экземпляр класса вида.
    
CView* pView = (CView*) pViewClass->CreateObject();
    
    
// Теперь для создания вида нам нужно заполнить структуру CCreateContext
    
CCreateContext CreateContext;
    
CreateContext.m_pCurrentDoc    = pDoc; // Документ, для которого создаем вид.
    
CreateContext.m_pCurrentFrame    = NULL;
    
CreateContext.m_pLastView    = NULL;

    
CreateContext.m_pNewDocTemplate    = pDoc->GetDocTemplate(); // Шаблон документа.
    
CreateContext.m_pNewViewClass    = pViewClass; // runtime class вида.

    // Вот здесь мы создаем окно вида на его родителе.
    
if (!pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
        
rect, pParentWnd, nViewID, &CreateContext))
    {
        
return NULL;        
    }

    
// Первая функция, которую мы должны вызвать после создания вида, это OnInitialUpdate()
    
pView->OnInitialUpdate();
    
// Перерисуем вид.
    
pView->RedrawWindow();

    
// И все готово. Теперь мы можем его использовать как обычный контрол.
    
return pView;
}
Примечание:
Когда уничтожается документ, он удаляет все виды, привязанные к нему. При удалении, вида, документ ищет среди родителей вида первый попавшийся фрейм и уничтожает. Такая ситуация чревата опасностями. Когда я делал в MDI приложении дополнительный вид справа для каждого документа, то столкнулся с ситуацией когда при закрытии одного из документов у меня закрывалось все приложение. Проблема оказалась в том, что мой дополнительный вид расположен на контрол баре, который расположен на главном фрейме. При закрытии одного из документов, этот документ сначала удалял главный вид и CChildFrame, на котором этот вид расположен. Потом документ удалял второй, дополнительный вид, ближайшим родительским фреймом для которого, был CMainFrame. Соответственно он удалял главное окно приложения.

Происходит это в функции void CDocument::OnCloseDocument(). Вот кусок кода из нее, в которой удаляются все виды и их фреймы.
    while (!m_viewList.IsEmpty())
    {
        
// get frame attached to the view
        
CView* pView = (CView*)m_viewList.GetHead();
        
ASSERT_VALID(pView);
        
CFrameWnd* pFrame = pView->GetParentFrame();
        
ASSERT_VALID(pFrame);

        
// and close it
        
PreCloseFrame(pFrame);
        
pFrame->DestroyWindow();
            
// will destroy the view as well
    
}
Если переопределить эту функцию, то можно избежать такой ситуации.
 
« Предыдущая статья   Следующая статья »