kuttiylajai Ответов: 1

SDI приложение с несколькими активными представлениями


Привет,
Я создаю пример обучающего приложения для создания нескольких активных представлений одновременно в SDI. Проблема, с которой я сталкиваюсь, заключается в том, что, хотя я переопределил OnDraw в своем втором классе представлений, мой вызов SetModifiedFlag(true) и UpdateAllViews () не вызывает вторые представления OnDraw(). Я отладил в UpdateAllviews и увидел, что OnUpdate моего второго представления успешно вызывается со всеми параметрами 0. Чего мне не хватает? пожалуйста, может ли кто-нибудь помочь

Код выглядит примерно так
CMainWnd::CMainWnd()
{
    m_pSecondWnd = new CSecondaryWnd();
    m_pSecondWnd->Create( 0, L"Second Window", WS_OVERLAPPEDWINDOW );
}
void CMainWnd::CreateNewView( CRuntimeClass* pView, CFrameWnd* pNewWnd, UINT ID)
{
    CView* pNewView = NULL;
    pNewView = (CView*)pView->CreateObject();
    CCreateContext context;
    context.m_pCurrentDoc = GetActiveDocument();
    pNewView->Create( 0, 0, AFX_WS_DEFAULT_VIEW, rectDefault, pNewWnd, 1 , &context );
    pNewView->OnInitialUpdate();

    ((CSecondaryWnd*)pNewWnd)->ShowWindow( SW_RESTORE );
    pNewView->ShowWindow( SW_RESTORE );
    pNewWnd->UpdateWindow();
}

void CMainWnd::OnTimer( UINT_PTR nIDEvent )
{
    switch(nIDEvent)
    {
    case ONE_SECOND_TIMER:
        {
            CSampleDocument* pDoc = (CSampleDocument*)GetActiveDocument();
            pDoc->SetModifiedFlag();
            pDoc->UpdateAllViews( NULL );
            //Invalidate(); trail
            break;
        }
    }
}

Sample View 2 class:

IMPLEMENT_DYNCREATE( CSampleView2, CView )

BEGIN_MESSAGE_MAP( CSampleView2, CView )
END_MESSAGE_MAP()

CSampleView2::CSampleView2()
{
}

CSampleView2::~CSampleView2()
{
}


void CSampleView2::OnDraw( CDC* pDc )
{
    int a = 10;
    pDc->TextOut( 100, 100, L"This", 5 );
}


Sample View 1 Class:
IMPLEMENT_DYNCREATE( CSampleView1, CView )

BEGIN_MESSAGE_MAP( CSampleView1, CView )
    ON_COMMAND( ID_VIEW_CREATE, OnViewCreate )
END_MESSAGE_MAP()

CSampleView1::CSampleView1()
{
}

CSampleView1::~CSampleView1()
{
}

void CSampleView1::OnDraw( CDC* pDc )
{
    pDc->TextOut( 100, 100, L"This", 5 );int a = 10;
}


Что я уже пробовал:

Отладил UpdateAllView, и я мог видеть, что при циклическом просмотре различных представлений мой второй вид calss и его OnUpdate успешно вызываются.

1 Ответов

Рейтинг:
5

Richard MacCutchan

Видеть CDocument:: UpdateAllViews (MFC)[^] для правильного метода обновления представлений.


kuttiylajai

Я прочитал документацию CDocument:: UpdateAllViews (MFC)[^] и там упоминалось, что "обычно вы вызываете эту функцию из своего класса view после того, как пользователь изменил документ через представление."
Я изменил код в соответствии с этим на
void CSampleView1:: OnViewCreate()
{
По cruntimeclass* second_view = RUNTIME_CLASS( CSampleView2 );
CMainWnd* pMainWnd = (CMainWnd*)AfxGetApp ()- & gt;GetMainWnd();
pMainWnd- & gt;CreateNewView( second_view, pMainWnd- & gt;GetMainWnd (), 1 );
}

void CSampleView1:: UpdateViewsToReflectChanges()
{
CSampleDocument* pDoc = (CSampleDocument*) ((CFrameWnd*)(AfxGetApp ()- & gt;GetMainWnd ()))- & gt;GetActiveDocument();
pDoc- & gt;SetModifiedFlag();
pDoc- & gt;UpdateAllViews( NULL );
}
Но ответ тот же. Я не получаю контроль в своем OnDraw класса secondView