ASSERT (:: IsWindow (m_hWnd)) проблема, не уверен, что не так - PullRequest
1 голос
/ 13 октября 2011

У меня в коде ошибка, которая бьет меня по заднице, поэтому после долгих попыток отладки я, наконец, решил посмотреть, знает ли кто-нибудь еще, в чем заключается моя проблема.

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

LONG myDialog::OnInitDialog(UINT wParam, LONG lParam)
{
    BOOL bRet = super::OnInitDialog();

    InitGridControl();
    InitLayout();

    myApp.ActiveDocChangeEvent->Attach(
    RefMemberDelegate1(*this, &myDialog::OnNewDoc), this); // attach to event so I know when document is created

    return bRet;
}

void myDialog::OnNewDoc(CDerivedDocument* pNewDoc)
{
    pNewDoc->SetMyDialog(this); // when new document is created, set pointer to dialog
}

void myDialog::InitGridControl()
{
    CRect rect;
    // Get the grid area rectangle and set it up.
    GetDlgItem(IDC_GRID)->GetClientRect(rect);
    GetDlgItem(IDC_GRID)->MapWindowPoints(this, &rect); // replacing dummy image with the grid

    m_Grid = new myGridCtrl;
    bool result = m_Grid->Create(WS_CHILD | WS_BORDER | WS_VISIBLE | WS_TABSTOP, rect, this, IDC_GRID);


    // Set the appropriate options 
    //...options...

    m_Grid->InsertColumn(0, _T("Name"), 100); // doesn't seem to crash here, which means grid is created okay?
}


void myDialog::PopulateGridControl(BOOL bRedraw, CDerivedDocument * pDoc)
{
    if (GetSafeHwnd() == NULL)
        return;

    // get handles to document and stuff

    m_Grid->SetRedraw(FALSE); // ** ASSERT() CALL IS HERE **
    m_Grid->RemoveAll();

    // other stuff..
}


/////////////////////


// In CDocument, once it is created...

CDerivedDocument::SetMyDoc(myDialog * pDlg)
{
    pDlg->PopulateGridControl(true,this);
}

Есть идеи, что происходит? Я имею в виду, я создаю диалог только после того, как все было инициализировано, поэтому там не должно быть проблем. m_Grid.Create() возвращает true, поэтому создание прошло успешно. Почему SetRedraw() поражает assert, что m_hWnd не является дескриптором окна? Где все же устанавливается m_hWnd? 1013 *

Спасибо за любую помощь, которую вы можете предложить.

Приветствия

1 Ответ

1 голос
/ 13 октября 2011

Вы уверены, что диалоговое окно создается при вызове
CDerivedDocument::SetMyDoc(myDialog * pDlg)

Я вижу, что вы загружаете сетку (& диалоговое окно) из документа, вам лучше загрузить диалоговое окно и сетку из вида, используя документ.

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

...