现在的位置: 首页 > 综合 > 正文

三个相互联系的按钮 如何使得其功能看起来相互独立

2013年10月05日 ⁄ 综合 ⁄ 共 2931字 ⁄ 字号 评论关闭

 

问题描述:

         有一个总闸门 (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);
	}

}

 

 

 

 

 

 

 

 

       

     

 

抱歉!评论已关闭.