请教下,界面上有个按钮,删除自身后,再在主界面点击出错了,好像和消息有关,不知该如何处理方法1
代码:
按钮中的消息
::SendMessage(m_hWnd, WM_CLOSE, 0, 0);
::SendMessage(GetParent(), MSG_DELETEFILE, 0, (LPARAM)&bdData);主界面:MSG_DELETEFILE中的消息响应
因为是new出来的
 delete(pData->pbtnDelete);
pData->pbtnDelete = NULL;方法2:
或者把按钮关闭销毁自身的消息放到主界面中效果依旧
if (pData->pbtnDelete->IsWindow())
 ::SendMessage(pData->pbtnDelete->m_hWnd, WM_CLOSE, 0, 0);
 delete(pData->pbtnDelete);
pData->pbtnDelete = NULL;
报错信息提示
报错时停留代码位置:
if(!PreTranslateMessage(&m_msg))
{
::TranslateMessage(&m_msg);
::DispatchMessage(&m_msg);
} if(IsIdleMessage(&m_msg))
{
bDoIdle = TRUE;
nIdleCount = 0;
}

解决方案 »

  1.   

    “界面上有个按钮,删除自身后”
    hide 为好
      

  2.   

    if ((pData->pbtnDelete) && (pData->pbtnDelete->IsWindow()))
      

  3.   

    什么意思,你看我方法2里面不是调用这个函数判断了吗?没有用的。另外,弱弱的问下,如果这个button是new出来的,我不调用delete,仅仅是发消息WM_CLOSE给按钮了,那么存在内存泄露风险吗?我发现如果不调用delete仅仅发送WM_CLOSE这个消息是没有问题的
      

  4.   

    没看明白 红的 部分?
    即 :pData->pbtnDelete 如果不为 0 // 因为 你已经:
    delete(pData->pbtnDelete);
    pData->pbtnDelete = NULL;
      

  5.   

    不管哪种方法 
    SendMessage 前 一定要 检测:
    pData->pbtnDelete
      

  6.   

    为毛要SendMessage?你确定你SendMessage WM_CLOSE后他会删除?btn->DestroyWindow();
    delete btn;
    btn = NULL;
      

  7.   


    我靠,这也行,换一下的确问题都没有了。那个发送消息不是也调用的这个方法吗?
    微软知道,我不知道,他把代码都封起来了,只提供了接口。
    只在最坏的情况下使用SendMessage(虽然接口函数内部都是调用的SendMessage)。