📄 dipdoc.cpp
字号:
// 恢复光标
EndWaitCursor();
}
void CDipDoc::OnGeomRota()
{
//旋转角度
int nRotateAngle;
int nIntorType;
BOOL bIntorType;
//创建对话框
CDlgGeoRota dlgPara;
//初始化变量值
dlgPara.m_iRotateAngle = 90;
dlgPara.m_nIntorType = 0;
//显示对话框,提示用户设定旋转角度
if(dlgPara.DoModal() != IDOK)
{
//返回
return;
}
//获取用户设定的角度
nRotateAngle = dlgPara.m_iRotateAngle;
nIntorType = dlgPara.m_nIntorType;
//删除对话框
delete dlgPara;
if(nIntorType == 0)
{
bIntorType = FALSE;
}
else
{
bIntorType = TRUE;
}
//创建点处理CImageGeoTrans类对象
CGeoTrans GeoTrans( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
//调用Mirror()函数进行垂直镜像
GeoTrans.Rotate(nRotateAngle, bIntorType);
// 设置脏标记
// SetModifiedFlag(TRUE);
// 更新视图
UpdateAllViews(NULL);
// 恢复光标
EndWaitCursor();
}
void CDipDoc::OnGeomTran()
{
// 创建对话框
CDlgGeoTran dlgPara;
// 初始化变量值
dlgPara.m_XOffset = 0;
dlgPara.m_YOffset = 0;
dlgPara.m_nTransType = 0;
// 显示对话框,提示用户设定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
LONG lXOffset = dlgPara.m_XOffset;
LONG lYOffset = dlgPara.m_YOffset;
int nTransType = dlgPara.m_nTransType;
// 删除对话框
delete dlgPara;
//创建点处理CImageGeoTrans类对象
CGeoTrans GeoTrans( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
if(nTransType == 0)
{
// 调用TranslationPixel()函数进行平移
GeoTrans.TranslationPixel(lXOffset, lYOffset);
}
else if(nTransType == 1)
{
// 调用TranslationLine()函数进行平移
GeoTrans.TranslationLine(lXOffset, lYOffset);
}
// 设置脏标记
// SetModifiedFlag(TRUE);
// 更新视图
UpdateAllViews(NULL);
// 恢复光标
EndWaitCursor();
}
void CDipDoc::OnGeomTrpo()
{
//创建点处理CImageGeoTrans类对象
CGeoTrans GeoTrans( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
//调用Mirror()函数进行垂直镜像
GeoTrans.Transpose();
// 设置脏标记
// SetModifiedFlag(TRUE);
// 更新视图
UpdateAllViews(NULL);
// 恢复光标
EndWaitCursor();
}
void CDipDoc::OnGeomZoom()
{
// 缩放比率
float fXZoomRatio;
float fYZoomRatio;
int nIntorType;
BOOL bIntorType;
// 创建对话框
CDlgGeoZoom dlgPara;
// 初始化变量值
dlgPara.m_XZoom = 4.0;
dlgPara.m_YZoom = 4.0;
dlgPara.m_nIntorType = 0;
// 显示对话框,提示用户设定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
fXZoomRatio = dlgPara.m_XZoom;
fYZoomRatio = dlgPara.m_YZoom;
nIntorType = dlgPara.m_nIntorType;
// 删除对话框
delete dlgPara;
if(nIntorType == 0)
{
bIntorType = FALSE;
}
else
{
bIntorType = TRUE;
}
//创建点处理CImageGeoTrans类对象
CGeoTrans GeoTrans( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
//调用Mirror()函数进行垂直镜像
GeoTrans.ZoomImage(fXZoomRatio, fYZoomRatio, bIntorType);
// 设置脏标记
// SetModifiedFlag(TRUE);
// 更新视图
UpdateAllViews(NULL);
// 恢复光标
EndWaitCursor();
}
//以下六个命令更新消息映射,保证图像几何变换只对8位以上的图像进行操作。
void CDipDoc::OnUpdateGeomMirh(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnUpdateGeomMirv(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnUpdateGeomRota(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnUpdateGeomTran(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnUpdateGeomTrpo(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnUpdateGeomZoom(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_pDibObject->GetNumBits() >= 8);
}
void CDipDoc::OnMorphClose()
{
//结构元素数组指针(存储的是各结构元素相对于结构中心的坐标)
int *nMask;
//结构元素的大小(以结构元素中的点数为单位)
int nMaskLen = 0;
// 创建对话框
CDlgMorph dlgPara;
// 显示对话框,提示用户设定腐蚀方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
nMask = dlgPara.m_npMask;
nMaskLen = dlgPara.m_nMaskLen;
// 删除对话框
delete dlgPara;
//创建形态学处理CMorphPro类对象
CMorphPro MorphProcesses( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
MorphProcesses.Closing(nMask, nMaskLen);
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnMorphDilation()
{
//结构元素数组指针(存储的是各结构元素相对于结构中心的坐标)
int *nMask;
//结构元素的大小(以结构元素中的点数为单位)
int nMaskLen = 0;
// 创建对话框
CDlgMorph dlgPara;
// 显示对话框,提示用户设定腐蚀方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
nMask = dlgPara.m_npMask;
nMaskLen = dlgPara.m_nMaskLen;
// 删除对话框
delete dlgPara;
//创建形态学处理CMorphPro类对象
CMorphPro MorphProcesses( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
MorphProcesses.Dilation(nMask, nMaskLen);
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnMorphErosion()
{
//结构元素数组指针(存储的是各结构元素相对于结构中心的坐标)
int *nMask;
//结构元素的大小(以结构元素中的点数为单位)
int nMaskLen = 0;
// 创建对话框
CDlgMorph dlgPara;
// 显示对话框,提示用户设定腐蚀方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
nMask = dlgPara.m_npMask;
nMaskLen = dlgPara.m_nMaskLen;
// 删除对话框
delete dlgPara;
//创建形态学处理CMorphPro类对象
CMorphPro MorphProcesses( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
MorphProcesses.Erosion(nMask, nMaskLen);
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnMorphOpen()
{
//结构元素数组指针(存储的是各结构元素相对于结构中心的坐标)
int *nMask;
//结构元素的大小(以结构元素中的点数为单位)
int nMaskLen = 0;
// 创建对话框
CDlgMorph dlgPara;
// 显示对话框,提示用户设定腐蚀方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
nMask = dlgPara.m_npMask;
nMaskLen = dlgPara.m_nMaskLen;
// 删除对话框
delete dlgPara;
//创建形态学处理CMorphPro类对象
CMorphPro MorphProcesses( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
MorphProcesses.Opening(nMask, nMaskLen);
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnMorphHitmissing()
{
//结构元素数组指针(存储的是各结构元素相对于结构中心的坐标)
int *nHmask, *nMmask;
//结构元素的大小(以结构元素中的点数为单位)
int nHmaskLen = 0, nMmaskLen = 0;
// 创建对话框
CDlgHitMiss dlgPara;
// 显示对话框,提示用户设定腐蚀方向
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
nHmask = dlgPara.m_npHmask;
nHmaskLen = dlgPara.m_nHmaskLen;
nMmask = dlgPara.m_npMmask;
nMmaskLen = dlgPara.m_nMmaskLen;
/*CString s;
s.Format("nHmaskLen=%d\nnMmaskLen=%d\n",nHmaskLen,nMmaskLen);
AfxMessageBox(s);
for(int i = 0; i < 2 * nHmaskLen; i = i + 2)
{
s.Format("Num=%d\n(%d, %d)",i/2,nHmask[i],nHmask[i+1]);
AfxMessageBox(s);
}
for(i = 0; i < 2 * nMmaskLen; i = i + 2)
{
s.Format("Num=%d\n(%d, %d)",i/2,nMmask[i],nMmask[i+1]);
AfxMessageBox(s);
}*/
// 删除对话框
delete dlgPara;
//创建形态学处理CMorphPro类对象
CMorphPro MorphProcesses( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
MorphProcesses.HitMissTran(nHmask, nHmaskLen, nMmask, nMmaskLen);
// 恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnMorphThining()
{
//创建形态学处理CMorphPro类对象
CMorphPro MorphProcesses( m_pDibObject );
// 更改光标形状
BeginWaitCursor();
MorphProcesses.ThiningDIB(m_pDibObject);
//恢复光标
EndWaitCursor();
// 更新视图
UpdateAllViews(NULL);
}
void CDipDoc::OnCodeArith()
{
CDlgStrInput InputBox;
if(InputBox.DoModal() == IDOK)
{
CString strTemp,strNew,strCodeL,strCodeR;
int i,j,s;
BYTE *uCodeNum;
FLOAT *fFreq,*fInterval;
strTemp = InputBox.m_strInput;
//分配内存
uCodeNum = new BYTE[strTemp.GetLength()];
s = 0;
i = 0;
while( strTemp.GetLength() > 0 )
{
strNew += strTemp.GetAt(0);
//各个符号的数目
s = strTemp.Remove(strTemp.GetAt(0));
uCodeNum[i] = (BYTE)s;
//统计字符串中的符号数
i++;
}
//分配内存
fFreq = new FLOAT[i];
//各符号的初始区间的左端
fInterval = new FLOAT[i];
//按照字符串中出现的字符依次计算字符串的所处的间隔
float fStart = 0.0f,fEnd = 0.0f,fStartB = 0.0f,fLeft = 0.0f,fRight = 0.0f,fLen = 0.0f;
strTemp = InputBox.m_strInput;
//统计各个符号的频率
for(j=0;j<i;j++)
{
fFreq[j] = (float)uCodeNum[j]/strTemp.GetLength();
}
//确定各符号的初始区间的左端
fInterval[0] = 0.0f;
i = 1;
while(i < strNew.GetLength())
{
fInterval[i] = fInterval[i-1] + fFreq[i-1];
i++;
}
//前一间隔的起始位置
fStartB = 0.0f;
fLen = fFreq[0];
for(i=1;i<strTemp.GetLength();i++)
{
//确定字符串中各字符在新字符串中的位置
j = strNew.Find(strTemp.GetAt(i));
//当前编码符号的初始区间的左端和右端
fLeft = fInterval[j];
fRight = fLeft + fFreq[j];
//新区间的起始位置
fStart = fStartB +fLeft*fLen;
fEnd = fStartB + fRight*fLen;
//更新前一间隔的起始位置和间隔长度
fStartB = fStart;
fLen = fEnd - fStart;
}
//对最后的新间隔(即fStart,fEnd)转换为二进制
FLOAT fTemp1,fTemp2;
fTemp1 = fStart;
fTemp2 = fEnd;
while(((fTemp1*2 >= 1.0) && (fTemp2*2 >= 1.0)) || ((fTemp1*2 < 1.0) && (fTemp2*2 < 1.0)))
{
//如果两个数都被完全转换,则退出循环
if((fTemp1 == 0.0) && (fTemp2 == 0.0)) break;
//将fStart转换为二进制
if( fTemp1*2 >= 1.0 )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -