我的代码中有一个错误就是我的屁股,所以经过多次尝试调试后我终于决定看看是否有其他人知道我的问题是什么。
我正在尝试将网格对象添加到我拥有的对话框中,但是我一直在点击标题中提到的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
设置在哪里?
感谢您提供的任何帮助。
干杯
答案 0 :(得分:1)
您确定在拨打
时创建了对话框
CDerivedDocument::SetMyDoc(myDialog * pDlg)
?
我看到你正在从文档加载网格(&对话框),你应该使用文档从视图中加载对话框和网格。
这可能不是你主张麻烦的直接原因,但仍有改进。它可能只是按正确的顺序排列并解决了这个问题。