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

📄 dlgeditattributes.cpp

📁 一个英国人写的GIS查看/编辑工具。支持标准的shapefile地图文件格式和coverage地图文件格式。同时可以编辑相应的dbf文件。
💻 CPP
📖 第 1 页 / 共 3 页
字号:

///////////////////////////////////////////////////////////////////////////////

long CDlgEditAttributes::GetFeature(int iRow)
{
   long lFeature = 0;
   CString s = m_Grid.GetValue(COL_FEATUREID, iRow);
   sscanf(s, "%i", &lFeature);
   return lFeature;
}

///////////////////////////////////////////////////////////////////////////////
//
// Validates and retrieves data into a pre-defined CAttrArray object.  Returns
// the column number containing an error or zero if no error occurred
//

BOOL CDlgEditAttributes::RetrieveRow(int iRow, CAttrArray& aAttr)
{
	int iCol = COL_DATE+1;
	int iRet = 0;
	CString sValue;	
	long lValue;
	CLongLines* pMapLines = NULL;	   
	int iSel = 0;

   aAttr.m_lOrder = iRow;

	for (int i = 0; iRet == 0 && i < aAttr.GetSize(); i++)
	{
       CAttribute* pAttr = aAttr.GetAt(i);                        

	   // Retrieve text

	   switch (pAttr->GetDataType())
	   {
	       case BDTEXT : 
		   {
			  sValue = m_Grid.GetValue(iCol, iRow);
			  sValue.TrimLeft(" ");			  
			  pAttr->SetString(sValue);          		  			  
		   }
		   break;

         // Long text

		   case BDLONGTEXT : 
			{
            sValue = m_Grid.GetValue(iCol, iRow);
			   sValue.TrimLeft(" ");			  
			   pAttr->SetLongText(sValue);          	
			}
         break;

         // Get File name

         case BDHOTLINK : 
         {
            sValue = m_Grid.GetValue(iCol, iRow);
            sValue.TrimLeft();            
            pAttr->SetFile(sValue);               
            
         }
         break;

	   // Retrieve numbers
	   
		   case (BDNUMBER) :
		   {
			  sValue = m_Grid.GetValue(iCol, iRow);
           sValue.TrimLeft();
           sValue.TrimRight();

           if (!pAttr->AsAttr(sValue))
           {
				  iRet = iCol;
			  }
		   }
		   break;

		// Retrieve link

		   case (BDLINK) :
		   {
			  iSel = m_Grid.ComboBoxSendMessage(iCol, iRow, CB_GETCURSEL, 0,0);
			  if (iSel != CB_ERR)
			  {
              if (m_aFTypeLink[iCol][iSel] != -1)
              {
				     pAttr->SetLink(m_aFTypeLink[iCol][iSel]);
              } else
              {
                 iRet = iCol;
              }
			  } else
			  {
				  iRet = iCol;
			  }
		   }
		   break;
		   
	   // Retrieve map lines              

		   case (BDMAPLINES) : 
		   {  
			  CLongBinary longbinary; // Re-initialised each iteration

			  m_Grid.GetInteger(iCol, iRow, &lValue);            		  
			  pMapLines = (CLongLines*)lValue;
			  if (pMapLines != NULL)
			  {
				 pMapLines->GetLongBinary(longbinary);		
			  }
			  pAttr->SetLongBinary(&longbinary);
			  longbinary.m_hData = NULL; // prevents deletion of memory
		   }
		   break;

         // Retrieve image

         case BDIMAGE :
         {
            CLongBinary longbinary;
            CImageFile* pImageFile = NULL;

            m_Grid.GetInteger(iCol, iRow, &lValue);
            pImageFile = (CImageFile*)lValue;
            if (pImageFile != NULL)
            {
               pImageFile->AsLongBinary(longbinary);
            }
            pAttr->SetLongBinary(&longbinary);
            longbinary.m_hData = NULL; // prevents deletion of memory         
         }
         break;

         // Retrieve file object

         case BDFILE : 
         {
            CLongBinary longbinary;
            CFileObj* pFileObj = NULL;

            m_Grid.GetInteger(iCol, iRow, &lValue);
            pFileObj = (CFileObj*)lValue;
            if (pFileObj != NULL)
            {
               pFileObj->GetLongBinary(longbinary);
            }
            pAttr->SetLongBinary(&longbinary);
            longbinary.m_hData = NULL; // prevents deletion of memory         
         }
         break;

	   // Retrieve coordinates

		   case BDCOORD :
		   {
			   CCoord coord;
			   sValue = m_Grid.GetValue(iCol, iRow);            
            sValue.TrimLeft();
            sValue.TrimRight();

            if (sValue == "") 
            {
               coord.SetNull();
               pAttr->SetCoord(coord);
            }
			   else if (BDProjection()->StringAsCoord(sValue, &coord))
			   {
				   pAttr->SetCoord(coord);
			   } else
			   {
				  iRet = iCol;
			   }
		   }
		   break;

	   // Retrieve boolena

		   case (BDBOOLEAN) :
		   {
             sValue = m_Grid.GetValue(iCol, iRow);
			 sValue.TrimRight();
			 if (sValue.CompareNoCase(BDString(IDS_YES)) == 0 || sValue.CompareNoCase(BDString(IDS_YES1)) == 0)
			 {
				 pAttr->SetBoolean(TRUE);
			 }
			 else if (sValue.CompareNoCase(BDString(IDS_NO)) == 0 || sValue.CompareNoCase(BDString(IDS_NO1)) == 0)
			 {
				 pAttr->SetBoolean(FALSE);
			 }
			 else if (sValue == "")
			 {
				 pAttr->SetBoolean(AFX_RFX_BOOL_PSEUDO_NULL);
			 }
			 else
			 {
				 iRet = iCol;
			 }

		   }
		   break;

	   default:
	   {
		   ASSERT(FALSE);
	   }
	   };

       iCol++;
	};
	return iRet;
}


///////////////////////////////////////////////////////////////////////////////

void CDlgEditAttributes::DisplayError(int iCol, int iRow, LPCSTR sError)
{
   CString s;
   long lData;
   CString sMsg;

   if (sError == NULL) sMsg = BDString(IDS_INVALIDVALUE);
   else sMsg = sError;


   m_Grid.GetColUserData(iCol, &lData);
   for (int i = 0; i < sizeof(CAttrTypes::m_aAttrType) / sizeof(CAttrTypes); i++)
   {
	   if (lData == CAttrTypes::m_aAttrType[i].m_nId) break;
   }

   if (iCol != COL_DATE)
   {
      // Output type of error

      CString s1 = BDString(IDS_OFTYPE);
      CString s2 = BDString(IDS_ONROW);

      s.Format("%s \"%s\" %s %s %s %i. ", sMsg, m_Grid.GetValue(iCol, 0), 
         (LPCSTR)s1, (LPCSTR)CAttrTypes::GetDesc(lData),(LPCSTR)s2, iRow);
      s += "\r\n\r\n";
 
      // Describe correct format

      switch (CAttrTypes::m_aAttrType[i].m_nId)
      {      
         case BDNUMBER : s += BDString(IDS_NUMFORMAT); break;
         case BDCOORD : s += BDString(IDS_COORDFORMAT); break;
         case BDLINK : s += BDString(IDS_LINKFORMAT); break;
         case BDHOTLINK : s += BDString(IDS_FILEFORMAT); break;
      }   
   } else
   {
      // Output error for dates
      
      s.Format("%s \"%s\" %s %i. ", (LPCSTR)sMsg, m_Grid.GetValue(iCol, 0), 
               (LPCSTR)BDString(IDS_ONROW), iRow);

      s += "\r\n\r\n" + BDString(IDS_DATEFORMAT);    
   }   

   AfxMessageBox(s);
   m_Grid.SetActiveCell(iCol, iRow);
   m_Grid.SetFocus();
}

/////////////////////////////////////////////////////////////////////////////

LRESULT CDlgEditAttributes::OnResetProgress(WPARAM wParam, LPARAM lParam)
{
   BDGetProgressBar()->SetRange32(wParam, lParam);
   return 0;
}

/////////////////////////////////////////////////////////////////////////////

LRESULT CDlgEditAttributes::OnUpdateProgress(WPARAM wParam, LPARAM)
{
   BDGetProgressBar()->SetPos(wParam);
   return 0;
}

/////////////////////////////////////////////////////////////////////////////

LRESULT CDlgEditAttributes::OnLeaveCell(WPARAM,LPARAM)
{
   PostMessage(WM_CHANGECELL);
   return 0;
}

/////////////////////////////////////////////////////////////////////////////

LRESULT CDlgEditAttributes::OnChangeCell(WPARAM,LPARAM)
{
   long lRow, lCol, lData, lValue;
   BOOL bData = FALSE;

   m_Grid.GetActiveCell(&lCol, &lRow);   
   GetDlgItem(IDC_STATUS)->SetWindowText(m_Grid.GetValue(lCol, 0));	
   
   // Determine the column type

   m_Grid.GetColUserData(lCol, &lData);

   // Disable if the row contains no date

   BOOL bDate = m_Grid.GetValue(COL_DATE, lRow) != "";

   // Determine if the cell contains data

   if (lData == BDMAPLINES || lData == BDIMAGE || lData == BDFILE)
   {
      m_Grid.GetInteger(lCol, lRow, &lValue);            		  
      bData = lValue != 0;
   };
                
   // Disable import except for map lines
   
   GetDlgItem(IDC_IMPORT)->EnableWindow((lData == BDMAPLINES || lData == BDHOTLINK || lData == BDIMAGE || lData == BDFILE) && bDate);
   GetDlgItem(IDC_EXPORT)->EnableWindow(lData == BDMAPLINES && bDate && bData);
 
   return 0;
}

/////////////////////////////////////////////////////////////////////////////

LRESULT CDlgEditAttributes::OnDataChange(WPARAM,LPARAM)
{
    // If the last row then add a new one

   return 0;
}

/////////////////////////////////////////////////////////////////////////////
//
// Professional version, can insert new rows for current type
//

void CDlgEditAttributes::OnInsert() 
{
   long lCol, lRow;
   m_Grid.GetActiveCell(&lCol, &lRow);      
   CString sFeature = m_Grid.GetValue(COL_FEATURE, lRow);
   CString sID = m_Grid.GetValue(COL_FEATUREID, lRow);

   if (sID != "")
   {
      //m_Grid.SetMaxRows(m_Grid.GetMaxRows()+1);
      m_Grid.InsRow(lRow+1);      

      m_Grid.SetValue(COL_FEATURE, lRow+1, sFeature);
      m_Grid.SetValue(COL_FEATUREID, lRow+1, sID);
   };     	
}



/////////////////////////////////////////////////////////////////////////////
//
// Provide option for adding new links
//

LRESULT CDlgEditAttributes::OnComboSelChange(WPARAM wParam, LPARAM lParam)
{

   CAttrArray aAttr;
   int index;
   CFeature feature;

   // Retrieve selected link

   long iRow, iCol;
   m_Grid.GetActiveCell(&iCol, &iRow);   
   int iSel = m_Grid.ComboBoxSendMessage(iCol, iRow, CB_GETCURSEL, 0,0);   

   // If link is 'new' then display add dialog

   if (iSel != CB_ERR && m_aFTypeLink[iCol][iSel] == -1)
   {
      BDFTypeAttrInit(BDHandle(), m_lFType, &aAttr);   
      BDEnd(BDHandle());

      long lAttrFType = aAttr.GetAt(iCol-COL_DATE-1)->GetFTypeLink();

      CDlgEditFeature dlg(lAttrFType);
      if (dlg.DoModal() == IDOK)
      {
         feature.m_lId = dlg.GetId();
         feature.m_lFeatureTypeId = lAttrFType;
         BDFeature(BDHandle(), &feature, BDSELECT);
         BDEnd(BDHandle());         

         // Add new string to each list

         m_aFTypeLink[iCol].Add(feature.m_lId);  
                  
         index = m_Grid.ComboBoxSendMessage(iCol, -1, CB_ADDSTRING, 0, (long)(LPCSTR)feature.m_sName);         
            
         // Set active row to new selection

         m_Grid.ComboBoxSendMessage(iCol, iRow, CB_SETCURSEL,m_aFTypeLink[iCol][index],0);                                                         
      }
   }
			  		
   return 0;
}

/////////////////////////////////////////////////////////////////////////////

void CDlgEditAttributes::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	
   // Resize the grid

   if (!IsWindow(m_Grid)) return;
   //if (GetDlgItem(IDC_GRID) == NULL) return;

   CRect rectGrid, rectForm, rect, rectCForm;
   
   GetDlgItem(IDC_GRID)->GetWindowRect(&rectGrid);
   GetWindowRect(&rectForm);
   GetClientRect(&rectCForm);

   int nBorder = (rectForm.Height() - rectCForm.Height());   

   rect.left = rectGrid.left-rectForm.left;
   rect.top = rectGrid.top - rectForm.top - nBorder;
   rect.right = rectForm.Width() - nBorder;
   rect.bottom = rectForm.Height() - nBorder*2;
   
   if (nType == SIZE_MAXIMIZED || nType == SIZE_RESTORED)
   {          
      m_Grid.SetWindowPos(NULL,rect.left,rect.top,rect.Width(),rect.Height(),
                          SWP_NOOWNERZORDER);      
   };
}

/////////////////////////////////////////////////////////////////////////////

void CDlgEditAttributes::OnClose() 
{
   int nRet = AfxMessageBox(BDString(IDS_SAVECHANGES), MB_YESNOCANCEL);
   if (nRet == IDYES)
   {
      OnOK();
   } 
   else if (nRet == IDNO)
   {	
	   CDialog::OnClose();
   };   
}




void CDlgEditAttributes::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnLButtonDown(nFlags, point);
}

/////////////////////////////////////////////////////////////////////////////////////////

BOOL CDlgEditAttributes::PreTranslateMessage(MSG* pMsg) 
{   
	return CDialog::PreTranslateMessage(pMsg);
}

⌨️ 快捷键说明

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