Разделение дочернего окна в программе MFC MDI - PullRequest
0 голосов
/ 29 марта 2011

Я пытаюсь разделить дочернее окно программы MFC MDI, над которой я работаю, но у меня возникли некоторые проблемы.Я знаю, что должен использовать класс CSplitterWnd и пытался следовать инструкциям, приведенным здесь:

Создать несколько представлений в CChildFrame с помощью CSplitterWnd

, но могуПохоже, это не сработает, если бы кто-нибудь смог дать мне несколько советов в отношении этих инструкций, у меня есть несколько конкретных вопросов:

  1. Является ли CRightView также производным классом CView икакой код должен войти туда, если таковой имеется?

  2. Являются ли m_pLeftView, m_pRightView, m_pPhongView и m_pPhongInfo всеми переменными соответствующих классов и имеют ли они какой-либо конкретный тип?

  3. Откуда берется CTreeView, он не является стандартным базовым классом?

  4. rc.Width в CChildFrame :: OnCreateClient выдает ошибку необъявленного идентификатора, есть ли что-тоЯ должен объявить где-нибудь здесь?

Буду признателен за любые советы по этому поводу, действительно изо всех сил пытаясь заставить сплиттер работать.

Спасибо

1 Ответ

0 голосов
/ 01 апреля 2011

Поработав над этим пару дней, мне удалось решить собственную проблему, и я добавляю решение здесь для всех, у кого может быть такая же проблема.

  1. Объявите два класса представления, в моем случае CElement View, который является производным классом CWnd, и CSampleViewer3dView, который является производным классом CView.

  2. В каждом из этих классов добавьте переменную с доступом privateвведите CSplitterWnd и имя m_wndSplitter.

  3. Добавьте переопределение для функции OnCreateClient в CChildFrame, это должно добавить код:

    virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
    

    в ChildFrm.h, вытакже следует добавить логический флаг m_bInitSplitter в ChildFrm.h:

    BOOL m_bInitSplitter;
    

    , вы также должны добавить:

    m_bInitSplitter = false;в конструктор ChildFrm.cpp следующий код добавляется в ChildFrm.cpp при добавлении переменной с помощью мастера:

    BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
    {
    }
    
  4. Поместите следующий код в CChildFrame :: OnCreateClient:

    BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)  
    {  
        CRect cr;  
        GetWindowRect( &cr );  
    
        if (!m_wndSplitter.CreateStatic(this, 1, 2))   
        {   
            MessageBox("Error setting up splitter frames!", "Init Error!", MB_OK | MB_ICONERROR);   
            return FALSE;   
        }  
    
        if (!m_wndSplitter.CreateView( 0, 0, RUNTIME_CLASS(CElementView), 
    CSize(cr.Width()/2, cr.Height()), pContext ) )   
        {   
            MessageBox("Error setting up splitter frames!", "Init Error!", MB_OK | MB_ICONERROR);  
            return FALSE;   
        }  
    
        if (!m_wndSplitter.CreateView( 0, 1, RUNTIME_CLASS(CSampleViewer3dView), 
    CSize(cr.Width()/2, cr.Height()), pContext))   
        {    
            MessageBox("Error setting up splitter frames!", "Init Error!", MB_OK | MB_ICONERROR);  
        return FALSE;   
        }  
        m_bInitSplitter = TRUE;  
    
        return TRUE;  
    }  
    
  5. Добавьте переопределение размера в объявление CChildFrame и вставьте следующий код:

    void CChildFrame::OnSize(UINT nType, int cx, int cy)  
    {  
        CMDIChildWnd::OnSize(nType, cx, cy);  
        CRect cr;  
        GetWindowRect(&cr);  
    
        if (m_bInitSplitter && nType != SIZE_MINIMIZED)  
        {  
            m_wndSplitter.SetRowInfo( 0, cy, 0 );  
            m_wndSplitter.SetColumnInfo(0, cr.Width()*0.25 / 2, 50);  
            m_wndSplitter.SetColumnInfo(1, cr.Width()*0.75 / 2, 50);  
    
            m_wndSplitter.RecalcLayout();  
        }  
    } 
    

    Можно изменить размер каждого окна, изменив значенияот 0,25 и 0,75 до требуемого процента экрана, который вы хотите, чтобы каждый вид занимал.

  6. Добавьте файлы заголовков для двух представлений в ChildFrm.cpp, например, ElementView.h и SampleViewer3dView.h.

После этого у вас должно быть два независимых представления в дочернем окне программы MDI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...