ActiveX и View - возможно ли такое?
От: DrMom  
Дата: 13.10.03 07:04
Оценка:
Я пытаюсь создавать на основе класса CView активыксовый контрол. Делаю это так:


BOOL CInclViewView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
    return CWnd::CreateControl(CLSID_XXX, lpszWindowName, dwStyle, rect, pParentWnd, nID);
}

Все вроде здесь проходит правильно, но вот здесь:


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)
    {
        TRACE2("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)
    {
        TRACE0("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;
    if (afxData.bWin4)
        dwStyle &= ~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))
    {
        TRACE0("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;
}


происходит асерт. Что это за ф-ция _AfxGetDlgCtrlID и с чем ее едят? И ваще почему все не работает? Может это просто не может работать?
Re: ActiveX и View - возможно ли такое?
От: Resnick Россия  
Дата: 13.10.03 08:18
Оценка:
Удалено избыточное цитирование. — SchweinDeBurg

Здравствуйте, DrMom, Вы писали:

DM>происходит асерт. Что это за ф-ция _AfxGetDlgCtrlID и с чем ее едят? И ваще почему все не работает? Может это просто не может работать?



Работать может. Разбираться в ассертах чего-то неохота, но чтобы работало надо делать так:
— Создать новый класс с помощью мастера Project->Add Class->MFC Class from ActiveX control
— Сделать так

class CInclViewView
{
     ...
     CMyActiveX m_myControl;
     ...
};


BOOL CInclViewView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
    return m_myControl->Create(NULL, "myname", dwStyle, rect, this, IDC_MYCONTROL, pContext);
}

— Не забыть отловить ON_SIZE
Re[2]: ActiveX и View - возможно ли такое?
От: DrMom  
Дата: 13.10.03 10:04
Оценка:
Удалено избыточное цитирование. — SchweinDeBurg

Здравствуйте, Resnick, Вы писали:

R>Работать может. Разбираться в ассертах чего-то неохота, но чтобы работало надо делать так:

R>- Создать новый класс с помощью мастера Project->Add Class->MFC Class from ActiveX control

R>- Не забыть отловить ON_SIZE


Да собственно говоря у меня так и было. Мне это не нравилось типа из одного окна надо другим управлять. По сути дела окно вида фиктивное получается. Я тут переопределил CreateView для сплитера и все вроде стало обрабатываться, но не рисуется нихрена.
Re[3]: ActiveX и View - возможно ли такое?
От: Resnick Россия  
Дата: 13.10.03 10:25
Оценка:
Удалено избыточное цитирование. — SchweinDeBurg

Здравствуйте, DrMom, Вы писали:

DM>Да собственно говоря у меня так и было. Мне это не нравилось типа из одного окна надо другим управлять. По сути дела окно вида фиктивное получается. Я тут переопределил CreateView для сплитера и все вроде стало обрабатываться, но не рисуется нихрена.


Да чего мучиться. Фиктивное и фиктивное. Все равно красоты от МФЦшника добиться невозможно. Так работает, и нормально.
Так и черт с ним...
Re[4]: ActiveX и View - возможно ли такое?
От: NaZGuL_ITV  
Дата: 20.09.06 12:09
Оценка:
Здравствуйте, Resnick.
Возможно дело в том что Ваш компонент не WS_CHILD, а какой-то другой. Как раз в этом случае и вылезает ассерт.
[от модератора]
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 20.09.06 13:01
Оценка:
Строгое предупреждение за систематический вопиющий оверквотинг.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.