1
我在我的代碼中有一個錯誤,它正在踢我的屁股,所以經過多次嘗試調試後,我終於決定是否有人知道我的問題是什麼。ASSERT(:: IsWindow(m_hWnd))問題,不知道有什麼問題
我想添加一個網格對象到我有的對話框中,但我一直打標題中提到的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
在哪裏設置?
感謝您提供任何幫助。
乾杯
看起來是一個線程問題。我在非主線程中做了一些工作 – Jordan
解決方法是實際將相同調用的MFC調用(如':: IsWindow(m_hWnd)')包含在一個'if'中,如下所示:http:// forums ?.codeguru.com/showthread.php 517249-MFC斷言(-IsWindow(m_hWnd)) - 問題 - 不肯定,什麼-S-錯 – Dr1Ku