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

📄 data_compress_systemview.cpp

📁 各种数据压缩和解压的源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	
	// 判断DIB是否为空
	if (pDoc->GetHDIB() == NULL)
	{
		// 直接返回
		return;
	}
	
	// 获取Palette
	CPalette* pPal = pDoc->GetDocPalette();
	if (pPal != NULL)
	{
		// 获取MainFrame
		CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
		ASSERT_KINDOF(CMainFrame, pAppFrame);
		
		CClientDC appDC(pAppFrame);

		// All views but one should be a background palette.
		// wParam contains a handle to the active view, so the SelectPalette
		// bForceBackground flag is FALSE only if wParam == m_hWnd (this view)
		CPalette* oldPalette = appDC.SelectPalette(pPal, ((HWND)wParam) != m_hWnd);
		
		if (oldPalette != NULL)
		{
			UINT nColorsChanged = appDC.RealizePalette();
			if (nColorsChanged > 0)
				pDoc->UpdateAllViews(NULL);
			appDC.SelectPalette(oldPalette, TRUE);
		}
	}
}


///////////////////////////////////////////
//	计算窗口视图大小,以计算滚动条设置   //	
///////////////////////////////////////////

void CData_Compress_SystemView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) 
{
	CScrollView::CalcWindowRect(lpClientRect, nAdjustType);
	ASSERT(GetDocument() != NULL);
	SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());
}

void CData_Compress_SystemView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) 
{
	CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView);
	if (bActivate)
	{
		ASSERT(pActivateView == this);
		OnDoRealize((WPARAM)m_hWnd, 0);   // same as SendMessage(WM_DOREALIZE);
	}
}


///////////////////////////////////////////
//	复制当前DIB到剪贴版					 //	
///////////////////////////////////////////

void CData_Compress_SystemView::OnEditCopy() 
{
	// 获取文档
	CData_Compress_SystemDoc* pDoc = GetDocument();
	
	// 打开剪贴板
	if (OpenClipboard())
	{
		// 更改光标形状
		BeginWaitCursor();
		
		// 清空剪贴板
		EmptyClipboard();
		
		// 复制当前图像到剪贴板
		SetClipboardData (CF_DIB, pDoc->m_clsDIB.CopyHandle((HANDLE) pDoc->GetHDIB()) );
		
		// 关闭剪贴板
		CloseClipboard();
		
		// 恢复光标
		EndWaitCursor();
	}
}

void CData_Compress_SystemView::OnUpdateEditCopy(CCmdUI* pCmdUI) 
{
	// 如果当前DIB对象不空,复制菜单项有效
	pCmdUI->Enable(GetDocument()->GetHDIB() != NULL);
}


///////////////////////////////////////////
//	从剪贴版粘贴DIB到当前视图			 //	
///////////////////////////////////////////

void CData_Compress_SystemView::OnEditPaste() 
{
	// 创建新DIB
	HDIB hNewDIB = NULL;

	// 获取文档
	CData_Compress_SystemDoc* pDoc = GetDocument();

	// 打开剪贴板
	if (OpenClipboard())
	{
		// 更改光标形状
		BeginWaitCursor();

		// 读取剪贴板中的图像
		hNewDIB = (HDIB) pDoc->m_clsDIB.CopyHandle(::GetClipboardData(CF_DIB));

		// 关闭剪贴板
		CloseClipboard();
		
		// 判断是否读取成功
		if (hNewDIB != NULL)
		{
			// 替换DIB,同时释放旧DIB对象
			pDoc->ReplaceHDIB(hNewDIB);

			// 更新DIB大小和调色板
			pDoc->InitDIBData();

			// 设置脏标记
			pDoc->SetModifiedFlag(TRUE);
			
			// 重新设置滚动视图大小
			SetScrollSizes(MM_TEXT, pDoc->GetDocSize());

			// 实现新的调色板
			OnDoRealize((WPARAM)m_hWnd,0);

			// 更新视图
			pDoc->UpdateAllViews(NULL);
		}

		// 恢复光标
		EndWaitCursor();
	}
}

void CData_Compress_SystemView::OnUpdateEditPaste(CCmdUI* pCmdUI) 
{
	// 如果当前剪贴板中有DIB对象,粘贴菜单项有效
	pCmdUI->Enable(::IsClipboardFormatAvailable(CF_DIB));
}


///////////////////////////////////////////
//	放大当前视图						 //	
///////////////////////////////////////////

void CData_Compress_SystemView::OnGeomZoomin() 
{
	// 创建新DIB
	HDIB hNewDIB = NULL;
	
	// 获取文档
	CData_Compress_SystemDoc* pDoc = GetDocument();

	// 初始化脏标记为FALSE
	pDoc->SetModifiedFlag(FALSE);
 
	// 重新装载文件
	pDoc->OnFileReopen();

	// 放大倍数乘2
	pDoc->m_fZoomRatio *= 2;

	// 调用ZoomDIB()函数获取缩小后的DIB
	CGeoTrans clsGeoTrans;
	hNewDIB = clsGeoTrans.ZoomDIB(pDoc->GetHDIB(), pDoc->m_fZoomRatio);

	// 判断缩放是否成功
	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);
	}
}


///////////////////////////////////////////
//	缩小当前视图						 //	
///////////////////////////////////////////

void CData_Compress_SystemView::OnGeomZoomout() 
{
	// 创建新DIB
	HDIB hNewDIB = NULL;
	
	// 获取文档
	CData_Compress_SystemDoc* pDoc = GetDocument();

	// 初始化脏标记为FALSE
	pDoc->SetModifiedFlag(FALSE);
 
	// 重新装载文件
	pDoc->OnFileReopen();

	// 放大倍数除2
	pDoc->m_fZoomRatio /= 2;

	// 调用ZoomDIB()函数获取缩小后的DIB
	CGeoTrans clsGeoTrans;
	hNewDIB = clsGeoTrans.ZoomDIB(pDoc->GetHDIB(), pDoc->m_fZoomRatio);

	// 判断缩放是否成功
	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);
	}
}


/////////////////////////////////////////////////////////////////////////////
//																		   //
//								图像处理与分析							   //
//																		   //
/////////////////////////////////////////////////////////////////////////////

///////////////////////////[灰度处理部分]////////////////////////////////////////////

///////////////////////////////////////////
//	将彩色位图转化为灰度图像			 //	
///////////////////////////////////////////

void CData_Compress_SystemView::OnTogray() 
{
	// 获取文档
	CData_Compress_SystemDoc* pDoc = GetDocument();

	// 进行灰度转化
	CGrayProc clsGrayProc;
	clsGrayProc.ToGray(pDoc->GetHDIB());
	
	// 重画视图
	Invalidate();

	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);
}


///////////////////////////////////////////
//	对图像实施反色变换处理				 //	
///////////////////////////////////////////

void CData_Compress_SystemView::OnPointInvert() 
{
	// 获取文档
	CData_Compress_SystemDoc* pDoc = GetDocument();

	// 进行反色处理
	CGrayProc clsGrayProc;
	clsGrayProc.PointInvert(pDoc->GetHDIB());
	
	// 重画视图
	Invalidate();

	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);
}


///////////////////////////////////////////
//	对图像进行灰度分布均衡化处理		 //	
///////////////////////////////////////////

void CData_Compress_SystemView::OnPointEqua() 
{
	// 获取文档
	CData_Compress_SystemDoc* pDoc = GetDocument();

	// 进行灰度分布均衡化处理
	CGrayProc clsGrayProc;
	clsGrayProc.PointEqua(pDoc->GetHDIB());
	
	// 重画视图
	Invalidate();

	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);
}


///////////////////////////////////////////
//	查看图像的灰度直方图				 //	
///////////////////////////////////////////

void CData_Compress_SystemView::OnViewYIntensity() 
{
	// 循环变量
	int i;

	// 获取文档
	CData_Compress_SystemDoc* pDoc = GetDocument();

	// 各颜色分量的灰度分布密度
	float fPs_Y[256];

	// 计算灰度分布密度
	CGrayProc clsGrayProc;
	clsGrayProc.GetIntensity(pDoc->GetHDIB(), fPs_Y);
	
	CDlgIntensity dlg;

	// 传递灰度分布密度数据给面板类
	for (i = 0; i <256; i++)
		dlg.m_fIntensity[i] = fPs_Y[i];

	// 显示面板
	dlg.DoModal();
}

void CData_Compress_SystemView::OnViewRIntensity() 
{
	// 循环变量
	int i;

	// 获取文档
	CData_Compress_SystemDoc* pDoc = GetDocument();

	// 各颜色分量的灰度分布密度
	float fPs_R[256];
	float fPs_G[256];
	float fPs_B[256];

	// 计算灰度分布密度
	CGrayProc clsGrayProc;
	clsGrayProc.GetIntensity(pDoc->GetHDIB(), fPs_R, fPs_G, fPs_B);
	
	CDlgIntensity dlg;

	// 传递灰度分布密度数据给面板类
	for (i = 0; i <256; i++)
		dlg.m_fIntensity[i] = fPs_R[i];

	// 显示面板
	dlg.DoModal();
}

void CData_Compress_SystemView::OnViewGIntensity() 
{
	// 循环变量
	int i;

	// 获取文档
	CData_Compress_SystemDoc* pDoc = GetDocument();

	// 各颜色分量的灰度分布密度
	float fPs_R[256];
	float fPs_G[256];
	float fPs_B[256];

	// 计算灰度分布密度
	CGrayProc clsGrayProc;
	clsGrayProc.GetIntensity(pDoc->GetHDIB(), fPs_R, fPs_G, fPs_B);
	
	CDlgIntensity dlg;

	// 传递灰度分布密度数据给面板类
	for (i = 0; i <256; i++)
		dlg.m_fIntensity[i] = fPs_G[i];

	// 显示面板
	dlg.DoModal();
}

void CData_Compress_SystemView::OnViewBIntensity() 
{
	// 循环变量
	int i;

	// 获取文档
	CData_Compress_SystemDoc* pDoc = GetDocument();

	// 各颜色分量的灰度分布密度
	float fPs_R[256];
	float fPs_G[256];
	float fPs_B[256];

	// 计算灰度分布密度
	CGrayProc clsGrayProc;
	clsGrayProc.GetIntensity(pDoc->GetHDIB(), fPs_R, fPs_G, fPs_B);
	
	CDlgIntensity dlg;

	// 传递灰度分布密度数据给面板类
	for (i = 0; i <256; i++)
		dlg.m_fIntensity[i] = fPs_B[i];

	// 显示面板
	dlg.DoModal();
}


///////////////////////////////////////////
//	灰度折线变换						 //	
///////////////////////////////////////////

void CData_Compress_SystemView::OnPointStre() 
{
	// 循环变量
	int i;

	// 各颜色分量的灰度分布密度
	float fPs_Y[256];

	// 获取文档
	CData_Compress_SystemDoc* pDoc = GetDocument();

	// 计算灰度分布密度
	CGrayProc clsGrayProc;
	clsGrayProc.GetIntensity(pDoc->GetHDIB(), fPs_Y);
	
	// 创建对话框
	CDlgPointStre dlg;
	dlg.m_pDoc = pDoc;

	// 传递灰度分布密度数据给面板类
	for (i = 0; i <256; i++)
		dlg.m_fIntensity[i] = fPs_Y[i];

	// 显示对话框,由用户进行灰度折线变换
	dlg.DoModal();
}


///////////////////////////////////////////
//	灰度窗口变换						 //	
///////////////////////////////////////////

void CData_Compress_SystemView::OnPointWind() 
{
	// 循环变量
	int i;

	// 各颜色分量的灰度分布密度
	float fPs_Y[256];

	// 获取文档
	CData_Compress_SystemDoc* pDoc = GetDocument();

	// 计算灰度分布密度
	CGrayProc clsGrayProc;
	clsGrayProc.GetIntensity(pDoc->GetHDIB(), fPs_Y);
	
	// 创建对话框
	CDlgPointWin dlg;
	dlg.m_pDoc = pDoc;

	// 传递灰度分布密度数据给面板类
	for (i = 0; i <256; i++)
		dlg.m_fIntensity[i] = fPs_Y[i];

	// 显示对话框,由用户进行灰度折线变换
	dlg.DoModal();
}


///////////////////////////////////////////
//	灰度带通变换						 //	
///////////////////////////////////////////

void CData_Compress_SystemView::OnPointDt() 
{
	// 循环变量
	int i;

	// 各颜色分量的灰度分布密度
	float fPs_Y[256];

	// 获取文档
	CData_Compress_SystemDoc* pDoc = GetDocument();

	// 计算灰度分布密度
	CGrayProc clsGrayProc;
	clsGrayProc.GetIntensity(pDoc->GetHDIB(), fPs_Y);
	
	// 创建对话框
	CDlgPointDT dlg;
	dlg.m_pDoc = pDoc;

	// 传递灰度分布密度数据给面板类
	for (i = 0; i <256; i++)
		dlg.m_fIntensity[i] = fPs_Y[i];

	// 显示对话框,由用户进行灰度折线变换
	dlg.DoModal();
}


///////////////////////////////////////////
//	灰度带阻变换						 //	
///////////////////////////////////////////

void CData_Compress_SystemView::OnPointDz() 
{
	// 循环变量
	int i;

	// 各颜色分量的灰度分布密度
	float fPs_Y[256];

⌨️ 快捷键说明

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