#c #mfc #window #assert
#c #mfc #окно #утверждать
Вопрос:
У меня ошибка в моем коде, которая надирает мне задницу, поэтому после долгих попыток отладки я, наконец, решил посмотреть, знает ли кто-нибудь еще, в чем моя проблема.
Я пытаюсь добавить объект сетки в диалоговое окно, которое у меня есть, но я продолжаю нажимать на assert
упомянутое в названии, и я не знаю почему.
LONG myDialog::OnInitDialog(UINT wParam, LONG lParam)
{
BOOL bRet = super::OnInitDialog();
InitGridControl();
InitLayout();
myApp.ActiveDocChangeEvent->Attach(
RefMemberDelegate1(*this, amp;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, amp;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
в любом случае устанавливается get?
Спасибо за любую помощь, которую вы можете предложить.
Приветствия
Ответ №1:
Вы уверены, что диалоговое окно создается при вызове
CDerivedDocument::SetMyDoc(myDialog * pDlg)
?
Я вижу, что вы загружаете сетку (amp; dialog) из документа, вам лучше загрузить диалоговое окно и сетку из представления с помощью документа.
Это может быть не прямой причиной вашей проблемы с assert, но, тем не менее, улучшение. Это может просто привести вещи в правильный порядок и устранить эту проблему.
Комментарии:
1. Похоже, проблема с потоками. Я делал кое-что в неосновном потоке
2. Обходным путем было бы фактически обернуть те же вызовы MFC issues (например
::IsWindow(m_hWnd)
) вif
, как предложено здесь: forums.codeguru.com /…