📄 calculatedlg.cpp
字号:
// CalculateDlg.cpp : implementation file
//
#include "stdafx.h"
#include "RSIP.h"
#include "ImgFunction.h"
#include "CalculateDlg.h"
#include "RSImage.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCalculateDlg dialog
CCalculateDlg::CCalculateDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCalculateDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCalculateDlg)
m_nImgWidth = 0;
m_nImgHeight = 0;
//}}AFX_DATA_INIT
m_nImageType = 0;
m_szExpression.Empty();
}
void CCalculateDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCalculateDlg)
DDX_Control(pDX, IDC_FUNC_COMBO, m_Function);
DDX_Control(pDX, 1101, m_Expression);
DDX_Text(pDX, 1102, m_nImgWidth);
DDX_Text(pDX, 1103, m_nImgHeight);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCalculateDlg, CDialog)
//{{AFX_MSG_MAP(CCalculateDlg)
ON_BN_CLICKED(IDC_SUBSTRACT, OnSubstract)
ON_BN_CLICKED(IDC_RIGHT, OnRight)
ON_BN_CLICKED(IDC_MULTIPLE, OnMultiple)
ON_BN_CLICKED(IDC_LEFT, OnLeft)
ON_BN_CLICKED(IDC_DEVIDE, OnDevide)
ON_BN_CLICKED(IDC_BROWSEFILE, OnBrowsefile)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_CBN_SELCHANGE(IDC_FUNC_COMBO, OnSelchangeFuncCombo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCalculateDlg message handlers
void CCalculateDlg::OnOK()
{
m_Expression.GetWindowText(m_szExpression);
if(m_szExpression.IsEmpty())
{
MessageBox("影象计算表达式为空!","错误",MB_OK|MB_ICONINFORMATION);
return;
}
char Express[2048];
m_nTokenCount = 0;
int i,j;
int CurPosition = 0;
int LineLen;
int LeftDil,RightDil;
m_nOptrCount=0;
m_nOpndCount=0;
LineLen = m_szExpression.GetLength();
//将"(-"转化为"(0-"
j=0;
for(i=0; i<LineLen; i++)
{
if(m_szExpression[i]=='(' && m_szExpression[i+1]=='-')
{
Express[j++]='(';
Express[j++]='0';
}
else
Express[j++] = m_szExpression[i];
}
Express[j]='\0';
m_szExpression.Empty();
m_szExpression = Express;
//
LineLen =strlen(Express);
for(i=0; i<LineLen; )
{
if(m_nTokenCount >= 128)
{
MessageBox("表达式过长!","错误",MB_OK|MB_ICONQUESTION);
return;
}
// 找出数字
if(isdigit(Express[i]) || Express[i]=='.')
{
CurPosition=i;
j = 0;
while(isdigit(Express[j+CurPosition]) || Express[j+CurPosition]=='.')
j++;
m_TheToken[m_nTokenCount].Type = NUMBER;
strncpy(m_TheToken[m_nTokenCount].Cont,Express+CurPosition,j);
m_TheToken[m_nTokenCount].Cont[j]='\0';
m_TheToken[m_nTokenCount].Number=(float)atof(m_TheToken[m_nTokenCount].Cont);
m_nTokenCount++;
m_nOpndCount++;
i+=j;
continue;
}
// 找出函数
for(j=0; j<FUNCTIONCOUNT; j++)
if(strnicmp(Express+i,Func[j],strlen(Func[j]))==0)
break;
if(j<FUNCTIONCOUNT)
{
m_TheToken[m_nTokenCount].Type = FUNCTION;
strcpy(m_TheToken[m_nTokenCount].Cont,Func[j]);
m_TheToken[m_nTokenCount].Flag = j;
m_nTokenCount++;
m_nOptrCount++;
i+=strlen(Func[j]);
continue;
}
// 找出括号
if(Express[i] == '+'||Express[i] == '-'||
Express[i] == '*'||Express[i] == '/'||
Express[i] == '('||Express[i] == ')')
{
m_TheToken[m_nTokenCount].Type = DELIMITER;
m_TheToken[m_nTokenCount].Cont[0] = Express[i];
switch(Express[i])
{
case '(':
m_TheToken[m_nTokenCount].Flag = 0;
break;
case ')':
m_TheToken[m_nTokenCount].Flag = 1;
break;
case '+':
m_TheToken[m_nTokenCount].Flag = 2;
break;
case '-':
m_TheToken[m_nTokenCount].Flag = 3;
break;
case '*':
m_TheToken[m_nTokenCount].Flag = 4;
break;
case '/':
m_TheToken[m_nTokenCount].Flag = 5;
break;
}
m_TheToken[m_nTokenCount].Cont[1] = '\0';
m_nTokenCount++;
m_nOptrCount++;
i++;
continue;
}
// 找出文件
if(isalpha(Express[i]))
{
CurPosition=i;
j = 0;
//Valid File Name
while(isalpha(Express[j+CurPosition]) || Express[j+CurPosition]=='.' ||
Express[j+CurPosition]=='\\' ||
Express[j+CurPosition]==':' ||
Express[j+CurPosition]=='_' ||
Express[j+CurPosition]=='~' ||
isdigit(Express[j+CurPosition]))
j++;
m_TheToken[m_nTokenCount].Type = ISFILENAME;
strncpy(m_TheToken[m_nTokenCount].Cont,Express+CurPosition,j);
m_TheToken[m_nTokenCount].Cont[j]='\0';
m_nTokenCount++;
m_nOpndCount++;
i+=j;
continue;
}
// 找出空格
if(IsWhite(Express[i]))
{
i++;
continue;
}
// 报告错误
MessageBox("表达式错误!\n\n出现未知符号。","错误",MB_OK|MB_ICONQUESTION);
return;
}
LeftDil = 0;
RightDil = 0;
if(m_nTokenCount<2)
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
for(i=0; i<m_nTokenCount; i++)
{
if(m_TheToken[i].Type==DELIMITER && m_TheToken[i].Flag==0)
LeftDil++;
else if(m_TheToken[i].Type==DELIMITER && m_TheToken[i].Flag==1)
RightDil++;
if(i==0)
{
//Begin:Can not be "+,-,*,/,)"
if(m_TheToken[i].Type==DELIMITER && m_TheToken[i].Flag!=0)
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
}
else
{
//Error when "()","FileName(","NUMBER("
if(m_TheToken[i].Type==DELIMITER && m_TheToken[i].Flag==0 &&
((m_TheToken[i-1].Type==DELIMITER && m_TheToken[i-1].Flag==1) ||
m_TheToken[i-1].Type==NUMBER || m_TheToken[i-1].Type==ISFILENAME))
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
//Error when "()","+)","-)","*)","/)","Function)"
else if(m_TheToken[i].Type==DELIMITER && m_TheToken[i].Flag==1 &&
((m_TheToken[i-1].Type==DELIMITER && m_TheToken[i-1].Flag!=1) ||
m_TheToken[i-1].Type==FUNCTION))
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
//Error when "++","-+","*+","/+" and "Function+",But right when "(+" and ")+"
else if(m_TheToken[i].Type==DELIMITER && (m_TheToken[i].Flag==2 || m_TheToken[i].Flag==3)
&& ((m_TheToken[i-1].Type==DELIMITER && (m_TheToken[i-1].Flag>=2 || m_TheToken[i-1].Flag==0))
|| m_TheToken[i-1].Type==FUNCTION))
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
//Error when "+/","-/","**","//","(/" and "Function/",But right ")/"
else if(m_TheToken[i].Type==DELIMITER && (m_TheToken[i].Flag==4 || m_TheToken[i].Flag==5)
&& ((m_TheToken[i-1].Type==DELIMITER && (m_TheToken[i-1].Flag>=2 || m_TheToken[i-1].Flag==0))
|| m_TheToken[i-1].Type==FUNCTION))
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
//Error when "Function,FileName",")FileName","FileName,FileName"
else if(m_TheToken[i].Type==ISFILENAME &&
(m_TheToken[i-1].Type==FUNCTION
|| (m_TheToken[i-1].Type==DELIMITER && m_TheToken[i-1].Flag==1)
|| m_TheToken[i-1].Type==ISFILENAME
|| m_TheToken[i-1].Type==NUMBER))
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
//Error when "Function,Number",")Number","FileName,Number"
else if(m_TheToken[i].Type==NUMBER && (m_TheToken[i-1].Type==FUNCTION
|| (m_TheToken[i-1].Type==DELIMITER && m_TheToken[i-1].Flag==1)
|| m_TheToken[i-1].Type==ISFILENAME
|| m_TheToken[i-1].Type==NUMBER))
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
//Error when ")Function","FileName,Function","Fuction,Function",ect.
else if(m_TheToken[i].Type==FUNCTION && (m_TheToken[i-1].Type==FUNCTION
|| (m_TheToken[i-1].Type==DELIMITER && m_TheToken[i-1].Flag==1)
|| m_TheToken[i-1].Type==ISFILENAME
|| m_TheToken[i-1].Type==NUMBER))
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
if(i==m_nTokenCount-1)
{
if((m_TheToken[i].Type==DELIMITER && m_TheToken[i].Flag!=1)
|| m_TheToken[i].Type==FUNCTION)
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
}
}
}
if(LeftDil!=RightDil)
{
MessageBox("表达式错误!","错误",MB_OK|MB_ICONQUESTION);
return;
}
/*
//Check File Exist
CFile File;
for(i=0;i<m_nTokenCount;i++)
{
if(m_TheToken[i].Type==ISFILENAME)
{
if(0==File.Open(m_TheToken[i].Cont,CFile::modeRead))
{
char Info[128];
sprintf(Info,"文件 %s 不存在!",m_TheToken[i].Cont);
MessageBox(Info,"错误",MB_OK|MB_ICONQUESTION);
return;
}
File.Close();
}
}
*/
CDialog::OnOK();
}
void CCalculateDlg::OnSubstract()
{
m_Expression.ReplaceSel( _T("-") );
}
void CCalculateDlg::OnRight()
{
m_Expression.ReplaceSel( _T(")") );
}
void CCalculateDlg::OnMultiple()
{
m_Expression.ReplaceSel( _T("*") );
}
void CCalculateDlg::OnLeft()
{
m_Expression.ReplaceSel( _T("(") );
}
void CCalculateDlg::OnDevide()
{
m_Expression.ReplaceSel( _T("/") );
}
void CCalculateDlg::OnBrowsefile()
{
CFileDialog fileDlg(TRUE,"dat",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"Image Files(*.dat)|*.dat||",this);
if(fileDlg.DoModal() == IDOK)
{
CString fileName = fileDlg.GetPathName();
CFile File;
if(0 == File.Open(fileName,CFile::modeRead))
{
MessageBox("不能打开该图象文件!\n\n或许图象文件不存在!");
return;
}
fileName.TrimLeft();
fileName.TrimRight();
int length = fileName.GetLength();
CString infFileName = fileName.Left(length-4) + ".inf";
CFile infFile;
if(0 != infFile.Open(infFileName,CFile::modeRead))
{
CRSImage RSImage;
RSImage.LoadRsInfo(&infFile);
infFile.Close();
if(RSImage.m_nImgType == IMAGE_COMBINE)
{
MessageBox("用彩色合成影象进行计算无实际意义!");
return;
}
if(m_nImageType == 0)
{
m_nImageType = RSImage.m_nImgType;
}
else
{
if(m_nImageType-RSImage.m_nImgType != 0)
{
MessageBox("图象类型不匹配!");
return;
}
}
if(m_nImgHeight==0 && m_nImgWidth==0)
{
m_nImgHeight = RSImage.m_nImgHeight;
m_nImgWidth = RSImage.m_nImgWidth;
}
else
{
if(m_nImgHeight-RSImage.m_nImgHeight!=0 ||
m_nImgWidth-RSImage.m_nImgWidth!=0)
{
MessageBox("图象大小不匹配!");
return;
}
}
}
else
{
MessageBox("找不到该图象的信息文件(*.inf)!");
return;
}
m_Expression.ReplaceSel(fileName);
UpdateData(FALSE);
}
}
void CCalculateDlg::OnAdd()
{
m_Expression.ReplaceSel( _T("+") );
}
void CCalculateDlg::OnSelchangeFuncCombo()
{
CString text;
m_Function.GetLBText(m_Function.GetCurSel(),text);
m_Expression.ReplaceSel(text);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -