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

📄 geotransview.cpp

📁 人民邮电出版社的——Visual C++数字图像处理典型算法及实现(源码) 希望大家能用上
💻 CPP
📖 第 1 页 / 共 2 页
字号:

void CGeoTransView::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);
	}
}

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

void CGeoTransView::OnGeomRota() 
{
	// 图像旋转

	CGeoTransDoc* pDoc = GetDocument();
		
	int iRotateAngle;		// 缩放比率
	LPSTR lpDIB;			// 指向DIB的指针
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的旋转,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持256色位图的旋转!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

		return;
	}
	
	CGeoRotaDlg dlgPara;
	dlgPara.m_iRotateAngle = 90;	
	// 显示对话框,提示用户设定旋转角度
	if (dlgPara.DoModal() != IDOK)
	{
		return;
	}
	iRotateAngle = dlgPara.m_iRotateAngle;
	delete dlgPara;	

	HDIB hNewDIB = NULL;
	BeginWaitCursor();

	hNewDIB = (HDIB) pDoc->GetDibImage()->RotateDIB(lpDIB, iRotateAngle);
	if (hNewDIB != NULL)
	{		
		pDoc->ReplaceHDIB(hNewDIB);			// 替换DIB,同时释放旧DIB对象		
		pDoc->InitDIBData();				// 更新DIB大小和调色板		
		pDoc->SetModifiedFlag(TRUE);		// 设置脏标记		
		SetScrollSizes(MM_TEXT, pDoc->GetDocSize());// 重新设置滚动视图大小	
		pDoc->UpdateAllViews(NULL);			// 更新视图
	}
	else
	{
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	EndWaitCursor();
}

void CGeoTransView::OnGeomMirh() 
{
	// 水平镜像

	CGeoTransDoc* pDoc = GetDocument();
		
	LPSTR lpDIB;				// 指向DIB的指针	
	LPSTR    lpDIBBits;			// 指向DIB象素指针
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的水平镜像,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持256色位图的水平镜像!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

		return;
	}

	BeginWaitCursor();

	// 找到DIB图像象素起始位置
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);	
	// 调用MirrorDIB()函数水平镜像DIB
	if(pDoc->GetDibImage()->MirrorDIB(lpDIBBits,pDoc->GetDibImage()->DIBWidth(lpDIB), 
		pDoc->GetDibImage()->DIBHeight(lpDIB), TRUE))
	{		
		pDoc->SetModifiedFlag(TRUE);		// 设置脏标记		
		pDoc->UpdateAllViews(NULL);			// 更新视图
	}
	else
	{
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	EndWaitCursor();
}

void CGeoTransView::OnGeomMirv() 
{
	// 垂直镜像

	CGeoTransDoc* pDoc = GetDocument();
		
	LPSTR lpDIB;				// 指向DIB的指针	
	LPSTR    lpDIBBits;			// 指向DIB象素指针
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的垂直镜像,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持256色位图的垂直镜像!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	
		return;
	}

	BeginWaitCursor();

	// 找到DIB图像象素起始位置
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);	
	// 调用MirrorDIB()函数垂直镜像DIB
	if(pDoc->GetDibImage()->MirrorDIB(lpDIBBits,pDoc->GetDibImage()->DIBWidth(lpDIB), 
		pDoc->GetDibImage()->DIBHeight(lpDIB), FALSE))
	{
		pDoc->SetModifiedFlag(TRUE);		// 设置脏标记		
		pDoc->UpdateAllViews(NULL);			// 更新视图
	}
	else
	{
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	EndWaitCursor();	
}

void CGeoTransView::OnGeomTran() 
{
	// 平移位图

	CGeoTransDoc* pDoc = GetDocument();
		
	LPSTR	lpDIB;				// 指向DIB的指针	
	LPSTR   lpDIBBits;			// 指向DIB象素指针
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平移,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持256色位图的平移!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	
		return;
	}
	
	LONG lXOffset;
	LONG lYOffset;	
	CGeoTransDlg dlgPara;
	dlgPara.m_XOffset = 100;
	dlgPara.m_YOffset = 100;
	
	// 显示对话框,提示用户设定平移量
	if (dlgPara.DoModal() != IDOK)
	{
		return;
	}
	lXOffset = dlgPara.m_XOffset;
	lYOffset = dlgPara.m_YOffset;
	delete dlgPara;	

	BeginWaitCursor();

	// 找到DIB图像象素起始位置
	lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);	
	// 调用TranslationDIB()函数平移DIB
	if (pDoc->GetDibImage()->TranslationDIB1(lpDIBBits, 
		pDoc->GetDibImage()->DIBWidth(lpDIB), 
		pDoc->GetDibImage()->DIBHeight(lpDIB), lXOffset, lYOffset))
	{
		pDoc->SetModifiedFlag(TRUE);		// 设置脏标记		
		pDoc->UpdateAllViews(NULL);			// 更新视图
	}
	else
	{
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}
	
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	EndWaitCursor();
}

void CGeoTransView::OnGeomTrpo() 
{
	// 图像转置

	CGeoTransDoc* pDoc = GetDocument();
	
	LPSTR lpDIB;		// 指向DIB的指针
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的转置,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持256色位图的转置!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

		return;
	}

	BeginWaitCursor();

	if (pDoc->GetDibImage()->TransposeDIB(lpDIB))
	{		
		pDoc->SetModifiedFlag(TRUE);		// 设置脏标记		
		pDoc->InitDIBData();				// 更新DIB大小和调色板		
		SetScrollSizes(MM_TEXT, pDoc->GetDocSize());// 重新设置滚动视图大小		
		pDoc->UpdateAllViews(NULL);			// 更新视图
	}
	else
	{
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}

	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	EndWaitCursor();
}

void CGeoTransView::OnGeomZoom() 
{
	// 图像缩放

	CGeoTransDoc* pDoc = GetDocument();
		
	LPSTR lpDIB;					// 指向DIB的指针
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的缩放,其它的可以类推)
	if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
	{
		MessageBox("目前只支持256色位图的缩放!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

		return;
	}
	
	float fXZoomRatio;
	float fYZoomRatio;
	CGeoZoomDlg 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;	
	
	HDIB hNewDIB = NULL;
	BeginWaitCursor();

	hNewDIB = (HDIB) pDoc->GetDibImage()->ZoomDIB(lpDIB, fXZoomRatio, fYZoomRatio);
	if (hNewDIB != NULL)
	{		
		pDoc->ReplaceHDIB(hNewDIB);			// 替换DIB,同时释放旧DIB对象		
		pDoc->InitDIBData();				// 更新DIB大小和调色板		
		pDoc->SetModifiedFlag(TRUE);		// 设置脏标记		
		SetScrollSizes(MM_TEXT, pDoc->GetDocSize());// 重新设置滚动视图大小		
		pDoc->UpdateAllViews(NULL);			// 更新视图
	}
	else
	{
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
	}

	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
	EndWaitCursor();
}

⌨️ 快捷键说明

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