关闭应用程序时忽略 Listcontrol 'DELETE_ALL_ITEMS' 事件
Ignoring Listcontrol 'DELETE_ALL_ITEMS' Event when closing application
我的应用程序中有一个 MFC ListControl。我有一个事件发生在 "all items in the view were deleted" 时。该事件抛出错误信息,然后关闭程序。
我的问题是,如果单击 X(关闭)按钮,也会调用该事件。
这是我的 LVN_DeleteAllItems 事件代码:
void Users::OnLvnDeleteallitemsList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
MessageBox("The SQL connection has been dropped. Please restart the application.","SQL Connection Error",MB_ICONSTOP);
exit(EXIT_FAILURE);
*pResult = 0;
}
如果正确关闭应用程序(使用右上角的按钮),是否有办法阻止事件被调用?
这是正常行为。当按下 X 按钮时,主 window 收到一个 WM_CLOSE,并开始调用其子级析构函数。当 ListView 析构函数被调用时,它的所有项目都被清理,所以你的 LVN_DeleteAllItems
通知。
(逻辑上的)错误是这里正在执行与正在丢弃的数据库的连接测试(以及异常的exit
过程)。这里只应执行 ListView 的附加任务。数据库连接检查应该在调用堆栈的更高层处理:一个很好的例子是代码中发送 LVM_DeleteAllItems
的地方(注意 LVM_DeleteAllItems),并触发了ListView 待清空。
我的应用程序中有一个 MFC ListControl。我有一个事件发生在 "all items in the view were deleted" 时。该事件抛出错误信息,然后关闭程序。
我的问题是,如果单击 X(关闭)按钮,也会调用该事件。
这是我的 LVN_DeleteAllItems 事件代码:
void Users::OnLvnDeleteallitemsList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
MessageBox("The SQL connection has been dropped. Please restart the application.","SQL Connection Error",MB_ICONSTOP);
exit(EXIT_FAILURE);
*pResult = 0;
}
如果正确关闭应用程序(使用右上角的按钮),是否有办法阻止事件被调用?
这是正常行为。当按下 X 按钮时,主 window 收到一个 WM_CLOSE,并开始调用其子级析构函数。当 ListView 析构函数被调用时,它的所有项目都被清理,所以你的 LVN_DeleteAllItems
通知。
(逻辑上的)错误是这里正在执行与正在丢弃的数据库的连接测试(以及异常的exit
过程)。这里只应执行 ListView 的附加任务。数据库连接检查应该在调用堆栈的更高层处理:一个很好的例子是代码中发送 LVM_DeleteAllItems
的地方(注意 LVM_DeleteAllItems),并触发了ListView 待清空。