我的 class CMySheet : public CPropertySheet。CMySheet 有三页。在每页中,都可能有数据修改了。
我希望做到的是:
点击OK或Apply后保存他们各自的修改。在点击Cancel按钮时如果修改没有保存,就弹出对话框询问是否保存修改。另外当点击系统的关闭按钮时,如果修改没有保存,也要弹出对话框询问是否保存修改。在询问期间,CPropertySheet窗口是显示着的。
自己弄了很久,终于达到了我的要求。
我的做法是:
每页添加一个BOOL m_bModified,保存此页是否发生了修改。覆盖每页的OnApply()。当点击CPropertySheet的确定或应用按钮时,框架会调用每页的OnApply()。这样每页都有机会去保存数据。
当点击CPropertySheet的取消按钮时,我当然不希望每页都弹出对话框询问我是否要保存数据,只要任意一页有更新,就弹出一次对话框询问我即可。所以不要在每页的OnCancel中询问。而是在CMySheet做。在CMySheet的消息映射项目中添加ON_BN_CLICKED(IDCANCEL, &CMySheet::OnCancel)。IDCANCEL就是CPropertySheet的取消按钮的ID。“OnCancel”这个函数名当然随自己取了。
实现如下:
void CMySheet::OnCancel()
{
if ( m_firstPage.m_bModified ||
m_secondPage.m_bModified ||
m_thirdPage.m_bModified )
{
int idResult = ::MessageBox(this->m_hWnd,
TEXT("是否保存所做的更改?"),
TEXT("保存更改"),
MB_YESNOCANCEL | MB_ICONQUESTION);
if (idResult == IDYES)
{
PressButton(PSBTN_OK);
}
else if (idResult == IDNO)
{
EndDialog(IDCANCEL);
}
//else if (idResult == IDCANCEL){}
}
else
{
EndDialog(IDCANCEL);
}
}
最后是处理CMySheet的OnSysCommand消息:消息映射项 ON_WM_SYSCOMMAND()
void CMySheet::OnSysCommand(UINT nID, LPARAM lParam)
{
if (nID == SC_CLOSE)
{
if ( m_firstPage.m_bModified ||
m_secondPage.m_bModified ||
m_thirdPage.m_bModified )
{
int idResult = ::MessageBox(this->m_hWnd,
TEXT("是否保存所做的更改?"),
TEXT("保存更改"),
MB_YESNOCANCEL | MB_ICONQUESTION);
if (idResult == IDYES)
{
PressButton(PSBTN_OK);
return;
}
else if (idResult == IDCANCEL)
{
return;
}
//else if (idResult == IDNO){}
}
}
CPropertySheet::OnSysCommand(nID, lParam);
}