新年第一贴

学习一下vc9中 CSplitterWnd创建视图的方式
 
// You must create ALL panes unless DYNAMIC_SPLIT is defined!
//  Usually the splitter window is invisible when creating a pane
BOOL CSplitterWnd::CreateView(int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext)
{
#ifdef _DEBUG
    ASSERT_VALID(this);
    ASSERT(row >= 0 && row < m_nRows);
    ASSERT(col >= 0 && col < m_nCols);
    ASSERT(pViewClass != NULL);
    ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CWnd)));
    ASSERT(AfxIsValidAddress(pViewClass, sizeof(CRuntimeClass), FALSE));

    if (GetDlgItem(IdFromRowCol(row, col)) != NULL)
    {
        TRACE(traceAppMsg, 0, "Error: CreateView - pane already exists for row %d, col %d.\n",
            row, col);
        ASSERT(FALSE);
        return FALSE;
    }
#endif

    // set the initial size for that pane
    m_pColInfo[col].nIdealSize = sizeInit.cx;
    m_pRowInfo[row].nIdealSize = sizeInit.cy;

    BOOL bSendInitialUpdate = FALSE;

    CCreateContext contextT;
    if (pContext == NULL)
    {
        // if no context specified, generate one from the currently selected
        //  client if possible
        CView* pOldView = (CView*)GetActivePane();
        if (pOldView != NULL && pOldView->IsKindOf(RUNTIME_CLASS(CView)))
        {
            // set info about last pane
            ASSERT(contextT.m_pCurrentFrame == NULL);
            contextT.m_pLastView = pOldView;
            contextT.m_pCurrentDoc = pOldView->GetDocument();
            if (contextT.m_pCurrentDoc != NULL)
                contextT.m_pNewDocTemplate =
                  contextT.m_pCurrentDoc->GetDocTemplate();
        }
        pContext = &contextT;
        bSendInitialUpdate = TRUE;
    }

    CWnd* pWnd;
    TRY
    {
        pWnd = (CWnd*)pViewClass->CreateObject();
        if (pWnd == NULL)
            AfxThrowMemoryException();
    }
    CATCH_ALL(e)
    {
        TRACE(traceAppMsg, 0, "Out of memory creating a splitter pane.\n");
        // Note: DELETE_EXCEPTION(e) not required
        return FALSE;
    }
    END_CATCH_ALL

    ASSERT_KINDOF(CWnd, pWnd);
    ASSERT(pWnd->m_hWnd == NULL);       // not yet created

    DWORD dwStyle = AFX_WS_DEFAULT_VIEW & ~WS_BORDER;

    // Create with the right size (wrong position)
    CRect rect(CPoint(0,0), sizeInit);
    if (!pWnd->Create(NULL, NULL, dwStyle,
        rect, this, IdFromRowCol(row, col), pContext))
    {
        TRACE(traceAppMsg, 0, "Warning: couldn't create client pane for splitter.\n");
            // pWnd will be cleaned up by PostNcDestroy
        return FALSE;
    }
    ASSERT((int)_AfxGetDlgCtrlID(pWnd->m_hWnd) == IdFromRowCol(row, col));

    // send initial notification message
    if (bSendInitialUpdate)
        pWnd->SendMessage(WM_INITIALUPDATE);

    return TRUE;
}


  tools

你可能感兴趣的:(新年第一贴)