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

📄 ch1_1view.cpp

📁 简单图形处理,新手们可以看看其代码 系统框架平台主要提供统一的界面风格接口、统一的数据显示和数据访问的接口以及平台支撑系统等。 功能模块主要包括:文件、编辑、绘图、几何变换、查看、窗口、帮助等。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -