ASSERT(::IsWindow(m_hWnd)) 问题,不确定出了什么问题

发布于 2024-12-09 19:40:34 字数 1861 浏览 0 评论 0原文

我的代码中存在一个让我烦恼的错误,因此经过多次尝试调试后,我最终决定看看是否有其他人知道我的问题是什么。

我正在尝试将网格对象添加到我拥有的对话框中,但我一直点击标题中提到的 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() 会断言 m_hWnd 不是窗口句柄? m_hWnd 在哪里设置?

感谢您提供的任何帮助。

干杯

I'm having a bug in my code that's kicking my ass, so after much attempted debugging I finally decided to see if anyone else knew what my issue was.

I'm trying to add a grid object to a dialog that I have, but I keep hitting the assert mentioned in the title and I don't know why.

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);
}

Any idea what's going on? I mean, I only create the dialog once everything has been initialized, so there shouldn't be a problem there. m_Grid.Create() returns true, so creation is successful. Why is SetRedraw() hitting the assert that the m_hWnd isn't a handle to a window? Where does m_hWnd get set anyway?

Thanks for any help you can offer.

Cheers

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烟火散人牵绊 2024-12-16 19:40:34

您确定在调用时创建对话框吗
CDerivedDocument::SetMyDoc(myDialog * pDlg)

我看到的是,您正在从文档加载网格(和对话框),您应该使用文档从视图加载对话框和网格。

这可能不是断言问题的直接原因,但仍然是一种改进。它可能只是把事情按正确的顺序排列并解决这个问题。

Are you sure the dialog is created when you call
CDerivedDocument::SetMyDoc(myDialog * pDlg)?

What I see is that you are loading the grid (& dialog) from document, you should rather load the dialog and grid from the view using the document.

This may not be the direct cause of your assert trouble but nevertheless an improvement. It might just put things in the right order and fix this issue.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文