⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dlglayermanager.cpp

📁 Embedded vc++下开发的可编辑地图程序
💻 CPP
字号:
// DlgLayerManager.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "DlgLayerManager.h"
#include "editor.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDlgLayerManager dialog


CDlgLayerManager::CDlgLayerManager(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgLayerManager::IDD, pParent)
{
	//初始化变量
	//{{AFX_DATA_INIT(CDlgLayerManager)
	m_bEditable = FALSE;
	m_bSelectable = FALSE;
	m_bSnapable = FALSE;
	m_bVisible = FALSE;
	m_dMaxScale = 0.0;
	m_dMinScale = 0.0;
	//}}AFX_DATA_INIT
	m_pMapWnd		= NULL;
	m_nCurRow		= -1;
	m_bLstClicked = true;
}


void CDlgLayerManager::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgLayerManager)
	DDX_Control(pDX, IDC_LIST_LAYER, m_lstLayers);
	DDX_Check(pDX, IDC_CHECK_EDITABLE, m_bEditable);
	DDX_Check(pDX, IDC_CHECK_SELECTABLE, m_bSelectable);
	DDX_Check(pDX, IDC_CHECK_SNAPABLE, m_bSnapable);
	DDX_Check(pDX, IDC_CHECK_VISIBLE, m_bVisible);
	DDX_Text(pDX, IDC_EDIT_MAXSCALE, m_dMaxScale);
	DDX_Text(pDX, IDC_EDIT_MINSCALE, m_dMinScale);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgLayerManager, CDialog)
	//{{AFX_MSG_MAP(CDlgLayerManager)
	ON_BN_CLICKED(IDC_BUTTON_DELETE, OnButtonDelete)
	ON_BN_CLICKED(IDC_CHECK_SELECTABLE, OnCheckSelectable)
	ON_BN_CLICKED(IDC_CHECK_SNAPABLE, OnCheckSnapable)
	ON_BN_CLICKED(IDC_CHECK_VISIBLE, OnCheckVisible)
	ON_NOTIFY(NM_CLICK, IDC_LIST_LAYER, OnClickListLayer)
	ON_EN_KILLFOCUS(IDC_EDIT_MINSCALE, OnKillfocusEditMinscale)
	ON_EN_KILLFOCUS(IDC_EDIT_MAXSCALE, OnKillfocusEditMaxscale)
	ON_BN_CLICKED(IDC_BUTTON_MOVE_TOP, OnButtonMoveTop)
	ON_BN_CLICKED(IDC_BUTTON_MOVE_UP, OnButtonMoveUp)
	ON_BN_CLICKED(IDC_BUTTON_MOVE_DOWN, OnButtonMoveDown)
	ON_BN_CLICKED(IDC_BUTTON_MOVE_BOTTOM, OnButtonMoveBottom)
	ON_EN_SETFOCUS(IDC_EDIT_MINSCALE, OnSetfocusEditMinscale)
	ON_EN_SETFOCUS(IDC_EDIT_MAXSCALE, OnSetfocusEditMaxscale)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgLayerManager message handlers
BOOL CDlgLayerManager::FillList()
{
	if(!m_lstLayers.DeleteAllItems())
	{
		return false;
	}
	CRect rc;
	m_lstLayers.GetClientRect(&rc);
	m_lstLayers.InsertColumn(0,_T(""),LVCFMT_LEFT,rc.Width());
	
	//将地图中的图层加入到图层列表框中
	int nCount = m_pMapWnd->GetLayerCount();
	for(int i = 0;i< nCount;i++)
	{
		//获取地图名
		CString str = m_pMapWnd->GetLayerAt(i)->m_strLayerName;
		//添加
		m_lstLayers.InsertItem( i,str);
	}
	return true;
}

void CDlgLayerManager::OnButtonDelete() 
{
	//删除一个图层
	POSITION pos = m_lstLayers.GetFirstSelectedItemPosition();
	int nItem = m_lstLayers.GetNextSelectedItem(pos);
	
	m_pMapWnd->RemoveLayerAt(nItem);
	FillList();
}

void CDlgLayerManager::OnCheckSelectable() 
{//设置图层是否可选择
	UpdateData(true);
	UINT uSelectedCount = m_lstLayers.GetSelectedCount();
	int  nItem = -1	;
	for (int i=0;i <uSelectedCount;i++)
	{
		nItem = m_lstLayers.GetNextItem(nItem, LVNI_SELECTED);
		if(nItem!=-1)
		{ 
			m_pMapWnd->GetLayerAt(nItem)->SetSelectable(m_bSelectable);
		}	
	}	
}

void CDlgLayerManager::OnCheckSnapable() 
{//设置图层是否可捕捉
	UpdateData(true);
	UINT uSelectedCount = m_lstLayers.GetSelectedCount();
	int  nItem = -1	;
	for (int i=0;i <uSelectedCount;i++)
	{
		nItem = m_lstLayers.GetNextItem(nItem, LVNI_SELECTED);
		if(nItem!=-1)
		{ 
			m_pMapWnd->GetLayerAt(nItem)->SetSnapable(m_bSnapable);
		}	
	}
	
}

void CDlgLayerManager::OnCheckVisible() 
{//设置图层是否可见
	UpdateData(true);
	UINT  uSelectedCount = m_lstLayers.GetSelectedCount();
	int  nItem = -1	;
	for (int i=0;i< uSelectedCount;i++)
	{
		nItem = m_lstLayers.GetNextItem(nItem, LVNI_SELECTED);
		if(nItem!=-1)
		{ 
			m_pMapWnd->GetLayerAt(nItem)->SetVisible(m_bVisible);
		}	
	}
	
}

void CDlgLayerManager::OnClickListLayer(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pList = (NM_LISTVIEW*)pNMHDR;
	if(pList->iItem > -1)
	{
		int nItem = pList->iItem;
		SetMoveButtonState(nItem);
		
		//设置浮选框的状态		 
		m_bVisible=m_pMapWnd->GetLayerAt(nItem)->IsVisible();
		m_bEditable=m_pMapWnd->GetLayerAt(nItem)->IsEditable();
		m_bSelectable=m_pMapWnd->GetLayerAt(nItem)->IsSelectable();
		m_bSnapable=m_pMapWnd->GetLayerAt(nItem)->IsSnapable();
		UpdateData(FALSE);
		
		//设置显示比例的状态
		m_dMaxScale = m_pMapWnd->GetLayerAt(nItem)->m_dVisibleScaleMax;
		
		if((m_nCurRow > -1) && !m_bLstClicked)
		{
			OnKillfocusEditMaxscale();
			OnKillfocusEditMinscale();
			m_bLstClicked = true;
		}
		
		if(!IS0(m_dMaxScale))
		{
			m_dMaxScale = 1.0/m_dMaxScale;		
		}
		else
		{
			m_dMaxScale = 0;
		}
		
		m_dMinScale = m_pMapWnd->GetLayerAt(nItem)->m_dVisibleScaleMin;
		if(!IS0(m_dMinScale))
		{
			m_dMinScale = 1.0/m_dMinScale;
		}
		else
		{
			m_dMaxScale = 0;
		}
		
		m_nCurRow = nItem;		
		
		UpdateData(FALSE);
	}	
	
	*pResult = 0;
}

BOOL CDlgLayerManager::OnInitDialog() 
{//初始化
	CDialog::OnInitDialog();
	
	if( !m_pMapWnd )
	{
		EndDialog(-1);
	}
	
	FillList();

	return TRUE;

}

void CDlgLayerManager::OnKillfocusEditMinscale() 
{
	UpdateData(true);
	
	if((m_nCurRow > - 1) && !m_bLstClicked )
	{
		double dScale = m_dMinScale;
		if(!IS0(dScale))
		{
			dScale = 1.0/dScale;
		}
		else
		{
			dScale = 0;
		}
		m_pMapWnd->GetLayerAt(m_nCurRow)->m_dVisibleScaleMin = dScale;
	}	
	
	
}

void CDlgLayerManager::OnKillfocusEditMaxscale() 
{
	UpdateData(true);
	if((m_nCurRow > - 1) && !m_bLstClicked )
	{ 
		double dScale = m_dMaxScale;
		if(!IS0(dScale))
		{
			dScale = 1.0/dScale;
			
		}
		else
		{
			dScale = 0;
		}
		m_pMapWnd->GetLayerAt(m_nCurRow)->m_dVisibleScaleMax = dScale;
	}	
}

void CDlgLayerManager::OnButtonMoveTop() 
{
	//响应移至顶层按钮
	POSITION pos = m_lstLayers.GetFirstSelectedItemPosition();	
	int nItem = m_lstLayers.GetNextSelectedItem(pos);
	
	//将当前层移到顶层
	m_pMapWnd->MoveTop(nItem);

	//重新设置对话框图层列表和移动按钮的状态
	if(FillList())
	{
		int nCount=0;
		m_lstLayers.SetItemState(nCount ,LVIS_SELECTED,LVIS_SELECTED);
		m_lstLayers.EnsureVisible(nCount ,0);
		this->SetMoveButtonState(nCount );
	}
}

void CDlgLayerManager::OnButtonMoveUp() 
{
	//响应上移一层按钮
	POSITION pos = m_lstLayers.GetFirstSelectedItemPosition();	
	int nItem = m_lstLayers.GetNextSelectedItem(pos);
	if (nItem == -1) return;
	
	//上移一层
	m_pMapWnd->MoveUp(nItem);
	//重新设置对话框图层列表和移动按钮的状态
	if(FillList())
	{
		int nCount=nItem-1;
		if(nCount>=0)
		{
			m_lstLayers.SetItemState(nCount ,LVIS_SELECTED,LVIS_SELECTED);
			m_lstLayers.EnsureVisible(nCount ,0);
			this->SetMoveButtonState(nCount);
		}	
	}
	
}

void CDlgLayerManager::OnButtonMoveDown() 
{
	POSITION pos = m_lstLayers.GetFirstSelectedItemPosition();
	int nItem = m_lstLayers.GetNextSelectedItem(pos);
	
	//下移一层
	m_pMapWnd->MoveDown(nItem);
	//重新设置对话框图层列表和移动按钮的状态
	if(FillList())
	{
		int nCount=nItem+1;
		m_lstLayers.SetItemState(nCount ,LVIS_SELECTED,LVIS_SELECTED);
		m_lstLayers.EnsureVisible(nCount ,0);
		this->SetMoveButtonState(nCount );
	}
	
}

void CDlgLayerManager::OnButtonMoveBottom() 
{
	//响应移至底层按钮
	POSITION pos = m_lstLayers.GetFirstSelectedItemPosition();	
	int nItem = m_lstLayers.GetNextSelectedItem(pos);
	//移至底层
	
	m_pMapWnd->MoveBottom(nItem);
	//重新设置对话框图层列表和移动按钮的状态
	if(FillList())
	{
		int nCount=m_lstLayers.GetItemCount();
		m_lstLayers.SetItemState(nCount - 1,LVIS_SELECTED,LVIS_SELECTED);
		m_lstLayers.EnsureVisible(nCount - 1,0);
		this->SetMoveButtonState(nCount - 1);
	}
	
	
}

void CDlgLayerManager::OnSetfocusEditMinscale() 
{
	m_bLstClicked = false;	
	
}

void CDlgLayerManager::OnSetfocusEditMaxscale() 
{
	m_bLstClicked = false;		
}

void CDlgLayerManager::OnOK() 
{
	//保存地图
	CSeMapDef mapDef;
	m_pMapWnd->SaveToMap(mapDef);	
	theApp.m_WorkSpace.GetMaps()->SetMap(mapDef.m_strMapName,mapDef);
	m_pMapWnd->Refresh();
	CDialog::OnOK();
}

void CDlgLayerManager::SetMoveButtonState(int nRow)
{
	//设置移动按钮的状态
	
	CButton *pButton	= NULL;
	CEdit *pEdit		= NULL;
	if(  m_lstLayers.GetSelectedCount()>1)			//选中第一行
	{
		pButton = (CButton*)GetDlgItem(IDC_BUTTON_MOVE_TOP);
		pButton->EnableWindow(false);
		pButton = (CButton*)GetDlgItem(IDC_BUTTON_MOVE_UP);
		pButton->EnableWindow(false);
		pButton = (CButton*)GetDlgItem(IDC_BUTTON_MOVE_DOWN);
		pButton->EnableWindow(false);
		pButton = (CButton*)GetDlgItem(IDC_BUTTON_MOVE_BOTTOM);
		pButton->EnableWindow(false);
		pButton = (CButton*)GetDlgItem(IDC_BUTTON_DELETE);
		pButton->EnableWindow(false);
		pEdit=(CEdit*)GetDlgItem(IDC_EDIT_MAXSCALE);
		pEdit->EnableWindow(false);
		pEdit=(CEdit*)GetDlgItem(IDC_EDIT_MINSCALE);
		pEdit->EnableWindow(false);
		return ;
	}
	else
	{
		pEdit=(CEdit*)GetDlgItem(IDC_EDIT_MAXSCALE);
		pEdit->EnableWindow(true);
		pEdit=(CEdit*)GetDlgItem(IDC_EDIT_MINSCALE);
		pEdit->EnableWindow(true);
	}
	if(nRow == 0)			//选中第一行
	{
		pButton = (CButton*)GetDlgItem(IDC_BUTTON_MOVE_TOP);
		if(pButton->IsWindowEnabled())
			pButton->EnableWindow(false);
		pButton = (CButton*)GetDlgItem(IDC_BUTTON_MOVE_UP);
		if(pButton->IsWindowEnabled())
			pButton->EnableWindow(false);
	}
	else					
	{
		pButton = (CButton*)GetDlgItem(IDC_BUTTON_MOVE_TOP);
		if(!(pButton->IsWindowEnabled()))
			pButton->EnableWindow();
		pButton = (CButton*)GetDlgItem(IDC_BUTTON_MOVE_UP);
		if(!(pButton->IsWindowEnabled()))
			pButton->EnableWindow();
	}
	
	
	if(nRow == (m_lstLayers.GetItemCount() - 1))//选中最后一行
	{
		pButton = (CButton*)GetDlgItem(IDC_BUTTON_MOVE_DOWN);
		if(pButton->IsWindowEnabled())
			pButton->EnableWindow(false);
		pButton = (CButton*)GetDlgItem(IDC_BUTTON_MOVE_BOTTOM);
		if(pButton->IsWindowEnabled())
			pButton->EnableWindow(false);
	}
	else
	{
		pButton = (CButton*)GetDlgItem(IDC_BUTTON_MOVE_DOWN);
		if(!(pButton->IsWindowEnabled()))
			pButton->EnableWindow(1);
		pButton = (CButton*)GetDlgItem(IDC_BUTTON_MOVE_BOTTOM);
		if(!(pButton->IsWindowEnabled()))
			pButton->EnableWindow(1);
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -