📄 ch1_1view.cpp
字号:
BeginWaitCursor();
// 调用TransposeDIB()函数转置DIB
if (TransposeDIB(lpDIB))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新DIB大小和调色板
pDoc->InitDIBData();
// 重新设置滚动视图大小
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
void CCh1_1View::OnGeomZoom()
{
// 图像缩放
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的缩放,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的缩放!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 缩放比率
float fXZoomRatio;
float fYZoomRatio;
// 创建对话框
CDlgGeoZoom dlgPara;
// 初始化变量值
dlgPara.m_XZoom = 0.5;
dlgPara.m_YZoom = 0.5;
// 显示对话框,提示用户设定平移量
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
fXZoomRatio = dlgPara.m_XZoom;
fYZoomRatio = dlgPara.m_YZoom;
// 删除对话框
delete dlgPara;
// 创建新DIB
HDIB hNewDIB = NULL;
// 更改光标形状
BeginWaitCursor();
// 调用ZoomDIB()函数转置DIB
hNewDIB = (HDIB) ZoomDIB(lpDIB, fXZoomRatio, fYZoomRatio);
// 判断缩放是否成功
if (hNewDIB != NULL)
{
// 替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hNewDIB);
// 更新DIB大小和调色板
pDoc->InitDIBData();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 重新设置滚动视图大小
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
void CCh1_1View::OnGeomRota()
{
// 图像旋转
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的旋转,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的旋转!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 缩放比率
int iRotateAngle;
// 创建对话框
CDlgGeoRota dlgPara;
// 初始化变量值
dlgPara.m_iRotateAngle = 90;
// 显示对话框,提示用户设定旋转角度
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
iRotateAngle = dlgPara.m_iRotateAngle;
// 删除对话框
delete dlgPara;
// 创建新DIB
HDIB hNewDIB = NULL;
// 更改光标形状
BeginWaitCursor();
// 调用RotateDIB()函数旋转DIB
hNewDIB = (HDIB) RotateDIB(lpDIB, iRotateAngle);
// 判断旋转是否成功
if (hNewDIB != NULL)
{
// 替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hNewDIB);
// 更新DIB大小和调色板
pDoc->InitDIBData();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 重新设置滚动视图大小
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
//////////////////////////////////////////////////////////////////////////////////////
// 图像复原
//
void CCh1_1View::OnCodeRLE()
{
// 对当前图像进行行程编码(存为PCX格式文件)
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的行程编码)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的行程编码!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
// 文件保存路径
CString strFilePath;
// 初始化文件名为原始文件名
strFilePath = pDoc->GetPathName();
// 更改后缀为PCX
if (strFilePath.Right(4).CompareNoCase(".BMP") == 0)
{
// 更改后缀为PCX
strFilePath = strFilePath.Left(strFilePath.GetLength()-3) + "PCX";
}
else
{
// 直接添加后缀PCX
strFilePath += ".PCX";
}
// 创建SaveAs对话框
CFileDialog dlg(FALSE, "PCX", strFilePath, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"PCX图像文件 (*.PCX) | *.PCX|所有文件 (*.*) | *.*||", NULL);
// 提示用户选择保存的路径
if (dlg.DoModal() != IDOK)
{
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
// 返回
return;
}
// 获取用户指定的文件路径
strFilePath = dlg.GetPathName();
// CFile和CFileException对象
CFile file;
CFileException fe;
// 尝试创建指定的PCX文件
if (!file.Open(strFilePath, CFile::modeCreate |
CFile::modeReadWrite | CFile::shareExclusive, &fe))
{
// 提示用户
MessageBox("打开指定PCX文件时失败!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
// 返回
return;
}
// 调用DIBToPCX256()函数将当前的DIB保存为256色PCX文件
if (::DIBToPCX256(lpDIB, file))
{
// 提示用户
MessageBox("成功保存为PCX文件!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
}
else
{
// 提示用户
MessageBox("保存为PCX文件失败!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
void CCh1_1View::OnCodeIRLE()
{
// 加载256色PCX文件
// 文件路径
CString strFilePath;
// 创建Open对话框
CFileDialog dlg(TRUE, "PCX", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"PCX图像文件 (*.PCX) | *.PCX|所有文件 (*.*) | *.*||", NULL);
// 提示用户选择保存的路径
if (dlg.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户指定的文件路径
strFilePath = dlg.GetPathName();
// CFile和CFileException对象
CFile file;
CFileException fe;
// 尝试打开指定的PCX文件
if (!file.Open(strFilePath, CFile::modeRead | CFile::shareDenyWrite, &fe))
{
// 提示用户
MessageBox("打开指定PCX文件时失败!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
// 返回
return;
}
// 调用ReadPCX256()函数读取指定的256色PCX文件
HDIB hDIB = ::ReadPCX256(file);
if (hDIB != NULL)
{
// 提示用户
//MessageBox("成功读取PCX文件!", "系统提示" ,
// MB_ICONINFORMATION | MB_OK);
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hDIB);
// 更新DIB大小和调色板
pDoc->InitDIBData();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 重新设置滚动视图大小
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("读取PCX文件失败!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
}
}
void CCh1_1View::OnCodeIlzw()
{
// 加载GIF文件
// 文件路径
CString strFilePath;
// 创建Open对话框
CFileDialog dlg(TRUE, "GIF", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"GIF图像文件 (*.GIF) | *.GIF|所有文件 (*.*) | *.*||", NULL);
// 提示用户选择保存的路径
if (dlg.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户指定的文件路径
strFilePath = dlg.GetPathName();
// CFile和CFileException对象
CFile file;
CFileException fe;
// 尝试打开指定的GIF文件
if (!file.Open(strFilePath, CFile::modeRead | CFile::shareDenyWrite, &fe))
{
// 提示用户
MessageBox("打开指定GIF文件时失败!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
// 返回
return;
}
// 调用ReadGIF()函数读取指定的GIF文件
HDIB hDIB = ::ReadGIF(file);
if (hDIB != NULL)
{
// 提示用户
//MessageBox("成功读取GIF文件!", "系统提示" ,
// MB_ICONINFORMATION | MB_OK);
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hDIB);
// 更新DIB大小和调色板
pDoc->InitDIBData();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 重新设置滚动视图大小
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("读取GIF文件失败!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
}
}
void CCh1_1View::OnCodeJEPG()
{
// TODO: Add your command handler code here
}
void CCh1_1View::OnCodeIJEPG()
{
// TODO: Add your command handler code here
}
void CCh1_1View::OnLine() //直线
{
// TODO: Add your command handler code here
m_nDrawType=1;
}
void CCh1_1View::OnPoint() //点
{
// TODO: Add your command handler code here
m_nDrawType=2;
}
void CCh1_1View::OnRectangle() //矩形
{
// TODO: Add your command handler code here
m_nDrawType=3;
}
void CCh1_1View::OnElip()//椭圆
{
// TODO: Add your command handler code here
m_nDrawType=4;
}
void CCh1_1View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptOrigin=point;
m_nDraw=TRUE;
CScrollView::OnLButtonDown(nFlags, point);
}
void CCh1_1View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//m_nDraw=FALSE;
CClientDC dc(this);
CPen pen(m_nLineStyle,m_nLineWidth,m_clr);//创建画笔
dc.SelectObject(&pen);//把画笔选择到设备描述表当中
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//创建一个透明画刷
dc.SelectObject(pBrush);//将画刷选择到设备描述表中
switch (m_nDrawType)
{
case 1://直线
dc.MoveTo(m_ptOrigin);//启示点
dc.LineTo(point);//终点 用point参数传进来。
break;
case 2://点
dc.SetPixel(point,m_clr);//SetPixel是CDC的一个成员方法,是一个像素
break;
case 3:
dc.Rectangle(CRect(m_ptOrigin,point));
break;
case 4://椭圆
dc.Ellipse(CRect(m_ptOrigin,point));
break;
}
CScrollView::OnLButtonUp(nFlags, point);
}
void CCh1_1View::OnCancelMode()
{
CScrollView::OnCancelMode();
// TODO: Add your message handler code here
}
void CCh1_1View::OnSetting()
{
// TODO: Add your command handler code here
CSettingDlg dlg;
dlg.m_nLineWidth=m_nLineWidth;//保存View类中先前的线宽值
dlg.m_nLineStyle=m_nLineStyle;//保存View类中先前的线型
dlg.m_clr=m_clr;
if (IDOK==dlg.DoModal())
{
m_nLineWidth=dlg.m_nLineWidth;//将线宽值保存下来
m_nLineStyle=dlg.m_nLineStyle;//将线线型保存下来
}
}
void CCh1_1View::OnColor()
{
// TODO: Add your command handler code here
CColorDialog dlg;
dlg.m_cc.Flags|=CC_RGBINIT | CC_FULLOPEN;//Flags是一个标记,(CC_FULLOPEN) 是让颜色完全打开。(|)将CC_RGBINIT标记与先前的标记(m_cc.Flags)组合起来。
dlg.m_cc.rgbResult=m_clr;//通过rgbResult可以知道用户在View类中选择的是哪种颜色保存给成员变量m_clr
if (IDOK==dlg.DoModal())
{
m_clr=dlg.m_cc.rgbResult;//将用户选择的颜色保存在rgbResult函数中
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -