VC++开发GIS系统(83)文件激活状态简要实现

前文《VC++开发GIS系统(81)文件的状态》和《VC++开发GIS系统(82)文件显示和隐藏的简要实现》中已经介绍了工程中文件的3种状态,并且实现了显示和隐藏状态,今天实现激活状态。

关联菜单响应函数

参考《VC++开发GIS系统(71)响应CTreeCtrl右键菜单的函数

设置保存当前激活节点的变量

在PrjManage.h中添加下面的变量

//记录当前激活的4张表
HTREEITEM actPointItem;
HTREEITEM actLineItem;
HTREEITEM actPloyItem;
HTREEITEM actLabelItem;

激活文件

//激活文件
void CPrjManage::OnActiveFile()
{
  //更新fileNodeTree
  CString str = m_wndPrjView.GetItemText(selTreeItem);
  for (size_t i = 0; i < fileNodeTree.size(); i++)
  {
    if (fileNodeTree[i].itemnode == str)
    {
      //清除之前激活状态
      cleanActiveMask(fileNodeTree[i].fileType, selTreeItem);
      
      //设置激活状态
      fileNodeTree[i].isOpen = true;
      fileNodeTree[i].isActive = true;
      int imgindex = 0;
      if (fileNodeTree[i].fileType == L"mpt")
        imgindex = 4;
      if (fileNodeTree[i].fileType == L"mle")
        imgindex = 7;
      if (fileNodeTree[i].fileType == L"mpn")
        imgindex = 10;
      if (fileNodeTree[i].fileType == L"mll")
        imgindex = 13;
      if (currentPrj.writeAllNode(fileNodeTree))
        m_wndPrjView.SetItemImage(selTreeItem, imgindex, imgindex);
      else
        MessageBox(L"激活文件失败", L"提示", MB_ICONWARNING);
      
    }
  }
  //...ondraw

}

这里的代码其实和《VC++开发GIS系统(82)文件显示和隐藏的简要实现》很相似,只是多了下面一个函数cleanActiveMask,实现如下:

//清除激活状态
void CPrjManage::cleanActiveMask(CString &activeType, HTREEITEM newActive)
{
    //vector清除状态
    for (size_t i = 0; i < fileNodeTree.size(); i++)
    {
        if (fileNodeTree[i].fileType == activeType&&fileNodeTree[i].isActive==true)
        {
            fileNodeTree[i].isActive = false;
        }
    }
    //图标清除状态
    if (activeType == L"mpt")
    {
        if (actPointItem)
        {
            m_wndPrjView.SetItemImage(actPointItem, 3, 3);

        }
        actPointItem = newActive;
    }   
    if (activeType == L"mle")
    {
        if (actLineItem)
        {
            m_wndPrjView.SetItemImage(actLineItem, 6, 6);
        }
        actLineItem = newActive;
    }
    if (activeType == L"mpn")
    {
        if (actPloyItem)
        {
            m_wndPrjView.SetItemImage(actPloyItem, 9, 9);
        }
        actPloyItem = newActive;
    }   
    if (activeType == L"mll")
    {
        if (actLabelItem)
        {
            m_wndPrjView.SetItemImage(actLabelItem, 12, 12);
        }
        actLabelItem = newActive;
    }
}

作用是取消之前文件的激活状态(改为显示状态),并将新激活的文件记录下来。这里面用到了一个SetItemImage函数,用于更新文件前面图标。

详细代码可以参考:GitHub

VC++开发GIS系统(82)文件显示和隐藏的简要实现 VC++开发GIS系统(84)warning C4018 有符号无符号不匹配

作者:,GIS爱好者。
分享本文,请您带上本文链接
分享到:

发表评论