问题描述:
有一个总闸门 (BOOL变量)
每一个按钮都有一个闸门 (与这个按钮相关的布尔变量)
如何点击某个按钮时,仅实现此按钮的功能,无需关注其他按钮信息
问题解决:
当总闸门打开时,三个小闸门才起作用
当打开或关闭某个按钮的闸门时(点击此按钮时),其他两个闸门自动关闭。
这样设计,才能给人一种三个闸门相互独立的感觉
算法流程:
IF(总闸门打开)
{
if(按钮1的闸门打开)
{};
if(按钮2的闸门打开)
{};
if(按钮3的闸门打开)
{};
}
这段代码,3个闸门不会相互干扰的前提是: 每个小闸门打开时,其他两个小闸门自动关闭,只有这样,才不会造成彼此间的干扰。
下面是如何实现 当某个小闸门打开时,其他两个自动关闭 这个前提条件
当点击某个按钮时,执行以下操作:
{
IF(总闸门打开)
打开按钮1的闸门
ELSE
关闭按钮1的闸门
// 对于其他两个按钮,无论其目前状态如何,也无论该按钮1的当前状态如何
// 只要点击了这个按钮1,其他两个按钮的闸门都要关闭
关闭按钮2的闸门;
关闭按钮3的闸门;
}
示例程序:
// 如果不显示全部 则需过滤部分分块 if (!m_bShowALL) { // 有三种情况 // 1 只显示未录入 // 2 只显示周边 // 3 只显示重复分块 // 每种情况,分别过滤一部分分块 ,一种情况存在时,其他情况必定为假 if (m_bShowOnlyWeiLuRu) { if(item.value<nIndexOfRed) continue; } if (m_bShowOnlyNeighbour) { if(item.value<nIndexOfRed||item.value>nIndexOfRed+1) continue; } if (m_bShowDuplicateOnly) { //分块不重复 则略过 if(!item.bDuplicate) continue; } }
点击按钮1的程序:
//仅显示未录入分块 void CImageView::OnShowAllRectOrNot() { // TODO: 在此添加命令处理程序代码 m_bShowALL=!m_bShowALL; if (m_bShowALL) { //重新置位 GetDlgItem(IDC_BUTTON1)->SetWindowText(_T("仅显示未录入分块")); m_bShowOnlyWeiLuRu=FALSE; } else{ GetDlgItem(IDC_BUTTON1)->SetWindowText(_T("取消仅显未录入的分块")); m_bShowOnlyWeiLuRu=TRUE; } //关闭其他两个按钮的闸门 m_bShowOnlyNeighbour=FALSE; GetDlgItem(IDC_BUTTON6)->SetWindowText(_T("仅显示周边分块")); m_bShowDuplicateOnly=FALSE; GetDlgItem(IDC_BUTTON5)->SetWindowText(_T("仅显示重复分块")); if(m_pImage) { ReDrawImg(); Invalidate(FALSE); } }
点击按钮2:
void CImageView::OnShowDuplicateOnly() { // TODO: 在此添加控件通知处理程序代码 m_bShowALL=!m_bShowALL; if (m_bShowALL) { //重新置位 GetDlgItem(IDC_BUTTON5)->SetWindowText(_T("仅显示重复分块")); m_bShowDuplicateOnly=FALSE; } else{ GetDlgItem(IDC_BUTTON5)->SetWindowText(_T("取消显示重复分块")); m_bShowDuplicateOnly=TRUE; } //关闭其他两个按钮的闸门 m_bShowOnlyNeighbour=FALSE; GetDlgItem(IDC_BUTTON6)->SetWindowText(_T("仅显示周边分块")); m_bShowOnlyWeiLuRu=FALSE; GetDlgItem(IDC_BUTTON1)->SetWindowText(_T("仅显示未录入分块")); if(m_pImage) { ReDrawImg(); Invalidate(FALSE); } }
点击按钮3:
//仅显示周边分块 void CImageView::OnBnClickedButton6() { // TODO: 在此添加控件通知处理程序代码 m_bShowALL=!m_bShowALL; if (m_bShowALL) { GetDlgItem(IDC_BUTTON6)->SetWindowText(_T("仅显示局部分块")); m_bShowOnlyNeighbour=FALSE; } else{ GetDlgItem(IDC_BUTTON6)->SetWindowText(_T("取消仅显示局部分块")); m_bShowOnlyNeighbour=TRUE; } //关闭其他两个按钮的闸门 m_bShowDuplicateOnly=FALSE; GetDlgItem(IDC_BUTTON5)->SetWindowText(_T("仅显示重复分块")); m_bShowOnlyWeiLuRu=FALSE; GetDlgItem(IDC_BUTTON1)->SetWindowText(_T("仅显示未录入分块")); if(m_pImage) { ReDrawImg(); Invalidate(FALSE); } }