www.pudn.com > Image_Manage.rar > Image_ManageView.cpp


// Image_ManageView.cpp : implementation of the CImage_ManageView class 
// 
 
#include "stdafx.h" 
#include "Image_Manage.h" 
#include "MainFrm.h" 
#include "Image_ManageDoc.h" 
#include "Image_ManageView.h" 
 
// Header files of Dialog 
#include "DlgSmooth.h" 
#include "DlgSharpThre.h" 
#include "DlgMidFilter.h" 
#include "DlgHist.h" 
#include "DlgGrid.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CImage_ManageView 
 
IMPLEMENT_DYNCREATE(CImage_ManageView, CScrollView) 
 
BEGIN_MESSAGE_MAP(CImage_ManageView, CScrollView) 
	//{{AFX_MSG_MAP(CImage_ManageView) 
	ON_COMMAND(ID_SMOOTH_A, OnSmoothA) 
	ON_COMMAND(ID_SMOOTH_G, OnSmoothG) 
	ON_COMMAND(ID_SMOOTH_S, OnSmoothS) 
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy) 
	ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste) 
	ON_COMMAND(ID_EDIT_UNDO, OnEditUndo) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo) 
	ON_COMMAND(ID_SHARP_G, OnSharpG) 
	ON_COMMAND(ID_SHARP_L, OnSharpL) 
	ON_COMMAND(ID_MIDIAM_F, OnMidiamF) 
	ON_COMMAND(ID_EDGE_GAUSS, OnEdgeGauss) 
	ON_COMMAND(ID_EDGE_KIRSCH, OnEdgeKirsch) 
	ON_COMMAND(ID_EDGE_PREWITT, OnEdgePrewitt) 
	ON_COMMAND(ID_EDGE_ROBERT, OnEdgeRobert) 
	ON_COMMAND(ID_EDGE_SOBEL, OnEdgeSobel) 
	ON_COMMAND(ID_TRANS_GRAY, OnTransGray) 
	ON_COMMAND(ID_GRAY_HIST, OnGrayHist) 
	ON_COMMAND(ID_GRAY_GRID, OnGrayGrid) 
	//}}AFX_MSG_MAP 
	// Standard printing commands 
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CImage_ManageView construction/destruction 
 
CImage_ManageView::CImage_ManageView() 
{ 
	// TODO: add construction code here 
 
} 
 
CImage_ManageView::~CImage_ManageView() 
{ 
} 
 
BOOL CImage_ManageView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CScrollView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CImage_ManageView drawing 
 
void CImage_ManageView::OnDraw(CDC* pDC) 
{ 
	// 显示等待光标 
	BeginWaitCursor(); 
	 
	// 获取文档 
	CImage_ManageDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	 
	// 获取DIB 
	HDIB hDIB = pDoc->GetHDIB(); 
	 
	// 判断DIB是否为空 
	if (hDIB != NULL) 
	{ 
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); 
		 
		// 获取DIB宽度 
		int cxDIB = (int) ::DIBWidth(lpDIB); 
		 
		// 获取DIB高度 
		int cyDIB = (int) ::DIBHeight(lpDIB); 
 
		::GlobalUnlock((HGLOBAL) hDIB); 
		 
		CRect rcDIB; 
		rcDIB.top = rcDIB.left = 0; 
		rcDIB.right = cxDIB; 
		rcDIB.bottom = cyDIB; 
		 
		CRect rcDest; 
		 
		// 判断是否是打印 
		if (pDC->IsPrinting()) 
		{ 
			// 是打印,计算输出图像的位置和大小,以便符合页面 
			 
			// 获取打印页面的水平宽度(象素) 
			int cxPage = pDC->GetDeviceCaps(HORZRES); 
			 
			// 获取打印页面的垂直高度(象素) 
			int cyPage = pDC->GetDeviceCaps(VERTRES); 
			 
			// 获取打印机每英寸象素数 
			int cxInch = pDC->GetDeviceCaps(LOGPIXELSX); 
			int cyInch = pDC->GetDeviceCaps(LOGPIXELSY); 
			 
			// 计算打印图像大小(缩放,根据页面宽度调整图像大小) 
			rcDest.top = rcDest.left = 0; 
			rcDest.bottom = (int)(((double)cyDIB * cxPage * cyInch) 
					/ ((double)cxDIB * cxInch)); 
			rcDest.right = cxPage; 
			 
			// 计算打印图像位置(垂直居中) 
			int temp = cyPage - (rcDest.bottom - rcDest.top); 
			rcDest.bottom += temp/2; 
			rcDest.top += temp/2; 
 
		} 
		else    
		// 非打印 
		{ 
			// 不必缩放图像 
			rcDest = rcDIB; 
		} 
		 
		// 输出DIB 
		::PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(), 
			&rcDIB, pDoc->GetDocPalette()); 
	} 
	 
	// 恢复正常光标 
	EndWaitCursor(); 
} 
 
void CImage_ManageView::OnInitialUpdate() 
{ 
	SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize()); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CImage_ManageView printing 
 
BOOL CImage_ManageView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CImage_ManageView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CImage_ManageView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CImage_ManageView diagnostics 
 
#ifdef _DEBUG 
void CImage_ManageView::AssertValid() const 
{ 
	CScrollView::AssertValid(); 
} 
 
void CImage_ManageView::Dump(CDumpContext& dc) const 
{ 
	CScrollView::Dump(dc); 
} 
 
CImage_ManageDoc* CImage_ManageView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImage_ManageDoc))); 
	return (CImage_ManageDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CImage_ManageView message handlers 
 
void CImage_ManageView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType)  
{ 
	CScrollView::OnInitialUpdate(); 
} 
 
void CImage_ManageView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView); 
	if (bActivate) 
	{ 
		ASSERT(pActivateView == this); 
		OnDoRealize((WPARAM)m_hWnd, 0);   // same as SendMessage(WM_DOREALIZE); 
	} 
} 
 
LRESULT CImage_ManageView::OnDoRealize(WPARAM wParam, LPARAM) 
{ 
	ASSERT(wParam != NULL); 
 
	// 获取文档 
	CImage_ManageDoc* pDoc = GetDocument(); 
	 
	// 判断DIB是否为空 
	if (pDoc->GetHDIB() == NULL) 
	{ 
		// 直接返回 
		return 0L; 
	} 
	 
	// 获取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); 
		} 
		else 
		{ 
			TRACE0("\tCCh1_1View::OnPaletteChanged中调用SelectPalette()失败!\n"); 
		} 
	} 
	 
	return 0L; 
} 
 
////////////////////////////////////////////////////////////////////////////// 
// 
//	编辑菜单响应处理函数 
// 
void CImage_ManageView::OnEditCopy()  
{ 
	// 复制当前图像 
 
	// 获取文档 
	CImage_ManageDoc* pDoc = GetDocument(); 
	 
	// 打开剪贴板 
	if (OpenClipboard()) 
	{ 
		// 更改光标形状 
		BeginWaitCursor(); 
		 
		// 清空剪贴板 
		EmptyClipboard(); 
		 
		// 复制当前图像到剪贴板 
		SetClipboardData (CF_DIB, CopyHandle((HANDLE) pDoc->GetHDIB()) ); 
		 
		// 关闭剪贴板 
		CloseClipboard(); 
		 
		// 恢复光标 
		EndWaitCursor(); 
	} 
} 
 
void CImage_ManageView::OnUpdateEditCopy(CCmdUI* pCmdUI)  
{ 
	// 如果当前DIB对象不空,复制菜单项有效 
	pCmdUI->Enable(GetDocument()->GetHDIB() != NULL);	 
} 
 
void CImage_ManageView::OnEditPaste()  
{ 
	// 粘贴图像 
	 
	// 创建新DIB 
	HDIB hNewDIB = NULL; 
	 
	// 打开剪贴板 
	if (OpenClipboard()) 
	{ 
		// 更改光标形状 
		BeginWaitCursor(); 
 
		// 读取剪贴板中的图像 
		hNewDIB = (HDIB) CopyHandle(::GetClipboardData(CF_DIB)); 
 
		// 关闭剪贴板 
		CloseClipboard(); 
		 
		// 判断是否读取成功 
		if (hNewDIB != NULL) 
		{ 
			// 获取文档 
			CImage_ManageDoc* pDoc = GetDocument(); 
 
			// 替换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 CImage_ManageView::OnUpdateEditPaste(CCmdUI* pCmdUI)  
{ 
	// 如果当前剪贴板中有DIB对象,粘贴菜单项有效 
	pCmdUI->Enable(::IsClipboardFormatAvailable(CF_DIB));	 
} 
 
void CImage_ManageView::OnEditUndo()  
{ 
	OnEditPaste(); 
} 
 
void CImage_ManageView::OnUpdateEditUndo(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(GetDocument()->IsModified());	 
} 
 
//////////////////////////////////////////////////////////////////////////////////// 
// 
//	平滑去噪菜单响应处理函数 
// 
void CImage_ManageView::DoSmooth(int iTempH, int iTempW, int iTempMX, int iTempMY, FLOAT *fpArray, FLOAT fCoef) 
{ 
	// 平滑去噪  
 
	// 获取文档 
	CImage_ManageDoc* pDoc = GetDocument(); 
 
	// 每个像素占用的位 
	int nBitCount; 
 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 得到每个像素的位数 
	nBitCount = ::DIBBitCount(lpDIB); 
	 
	// 滤除不为处理的图像格式 
	if(nBitCount!=8 && nBitCount!=24) 
	{ 
		CString szMsg; 
		szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount); 
		AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION); 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		return ; 
	}	 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 调用SmoothDIB()函数变换图像 
	if (::Template(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB),  
		iTempH, iTempW, iTempMX, iTempMY, fpArray, fCoef, nBitCount)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
void CImage_ManageView::OnSmoothA()  
{ 
	// 平滑去噪 - 平均模板(3×3) 
 
	// 模板高度 
	int		iTempH=3; 
	 
	// 模板宽度 
	int		iTempW=3; 
	 
	// 模板系数 
	FLOAT	fTempC=(FLOAT)0.111111; 
	 
	// 模板中心元素X坐标 
	int		iTempMX=1; 
	 
	// 模板中心元素Y坐标 
	int		iTempMY=1; 
	 
	// 模板元素数组 
	FLOAT	aValue[9]; 
	 
	// 给模板数组赋初值(为平均模板) 
	for(int i=0;i<9;i++)			// 1 1 1 
		aValue[i] = 1.0;			// 1 1 1 
									// 1 1 1	 
	// 调用DoSmooth函数改变图像数据 
	DoSmooth(iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC); 
} 
 
void CImage_ManageView::OnSmoothG()  
{ 
	// 平滑去噪 - 高斯模板(3×3) 
 
	// 模板高度 
	int		iTempH=3; 
	 
	// 模板宽度 
	int		iTempW=3; 
	 
	// 模板系数 
	FLOAT	fTempC=(FLOAT)0.0625; 
	 
	// 模板中心元素X坐标 
	int		iTempMX=1; 
	 
	// 模板中心元素Y坐标 
	int		iTempMY=1; 
	 
	// 模板元素数组 
	FLOAT	aValue[9]; 
	 
	// 给模板数组赋初值(为平均模板) 
	for(int i=0;i<9;i++) 
	{																// 1 2 1 
		aValue[i] = i%3 == 1 ? (FLOAT)2.0 : (FLOAT)1.0;				// 2 4 2 
		aValue[i] = i/3 == 1 ? (FLOAT)2.0*aValue[i] : aValue[i];	// 1 2 1 
	} 
	// 调用DoSmooth函数改变图像数据 
	DoSmooth(iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC);	 
} 
 
void CImage_ManageView::OnSmoothS()  
{ 
	// 平滑去噪 - 自定义模板 
	// 获取文档 
	CImage_ManageDoc* pDoc = GetDocument(); 
	// 每个像素占用的位 
	int nBitCount; 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	// 得到每个像素的位数 
	nBitCount = ::DIBBitCount(lpDIB); 
	 
	// 滤除不为处理的图像格式 
	if(nBitCount!=8 && nBitCount!=24) 
	{ 
		CString szMsg; 
		szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount); 
		AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION); 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		return ; 
	} 
	 
	// 模板高度 
	int		iTempH; 
	// 模板宽度 
	int		iTempW; 
	// 模板系数 
	FLOAT	fTempC; 
	// 模板中心元素X坐标 
	int		iTempMX; 
	// 模板中心元素Y坐标 
	int		iTempMY; 
	// 模板元素数组 
	FLOAT	aValue[25]; 
 
	// 创建对话框 
	CDlgSmooth dlgPara; 
 
	// 显示对话框,提示用户设定平移量 
	if(dlgPara.DoModal()!=IDOK) 
	{ 
		// 删除对话框 
		delete dlgPara; 
		// 返回 
		return ; 
	} 
 
	// 获取用户设定的平移量 
	iTempH  = dlgPara.m_iTempH; 
	iTempW  = dlgPara.m_iTempW; 
	iTempMX = dlgPara.m_iTempMX; 
	iTempMY = dlgPara.m_iTempMY; 
	fTempC  = dlgPara.m_fTempC; 
	for(int i=0;i<25;i++) 
		aValue[i]=dlgPara.m_fpArray[i]; 
 
	// 调用DoSmooth函数改变图像数据 
	DoSmooth(iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC);	 
	 
	// 删除对话框 
	delete dlgPara; 
} 
 
//////////////////////////////////////////////////////////////////////////////////// 
// 
//	平滑去噪菜单响应处理函数 
// 
 
void CImage_ManageView::OnSharpG()  
{ 
	// 梯度锐化 
	// 获取文档 
	CImage_ManageDoc* pDoc = GetDocument(); 
	 
	// 每个像素占用的位 
	int nBitCount; 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 得到每个像素的位数 
	nBitCount = ::DIBBitCount(lpDIB); 
	 
	// 滤除不为处理的图像格式 
	if(nBitCount!=8 && nBitCount!=24) 
	{ 
		CString szMsg; 
		szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount); 
		AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION); 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		return ; 
	} 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB);	 
	 
	// 阈值 
	BYTE	bThre; 
	 
	// 创建对话框 
	CDlgSharpThre dlgPara; 
	 
	// 初始化变量值 
	dlgPara.m_bThre = 100; 
	 
	// 提示用户输入阈值 
	if (dlgPara.DoModal() != IDOK) 
	{ 
		// 删除对话框 
		delete dlgPara;	 
		// 返回 
		return; 
	} 
	 
	// 获取用户的设定 
	bThre = dlgPara.m_bThre; 
	 
	// 删除对话框 
	delete dlgPara;	 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 调用GradSharp()函数进行梯度板锐化 
	if (::GradSharp(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), bThre, nBitCount)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
void CImage_ManageView::OnSharpL()  
{ 
	// 图像锐化 
	// 模板高度 
	int		iTempH; 
	// 模板宽度 
	int		iTempW; 
	// 模板系数 
	FLOAT	fTempC; 
	// 模板中心元素X坐标 
	int		iTempMX; 
	// 模板中心元素Y坐标 
	int		iTempMY; 
	// 模板元素数组 
	FLOAT	aValue[9]; 
 
	// 设置拉普拉斯模板参数 
	iTempW = 3; 
	iTempH = 3; 
	fTempC = 1.0; 
	iTempMX = 1; 
	iTempMY = 1; 
	aValue[0] = -1.0; 
	aValue[1] = -1.0; 
	aValue[2] = -1.0; 
	aValue[3] = -1.0; 
	aValue[4] =  9.0; 
	aValue[5] = -1.0; 
	aValue[6] = -1.0; 
	aValue[7] = -1.0; 
	aValue[8] = -1.0; 
 
	// 调用DoSmooth函数改变图像数据 
	DoSmooth(iTempH, iTempW, iTempMX, iTempMY, aValue, fTempC);	 
} 
 
//////////////////////////////////////////////////////////////////////////////////// 
// 
//	中值滤波菜单响应处理函数 
// 
 
void CImage_ManageView::OnMidiamF()  
{ 
	// 中值滤波 
	// 获取文档 
	CImage_ManageDoc* pDoc = GetDocument(); 
	 
	// 每个像素占用的位 
	int nBitCount; 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 得到每个像素的位数 
	nBitCount = ::DIBBitCount(lpDIB); 
	 
	// 滤除不为处理的图像格式 
	if(nBitCount!=8 && nBitCount!=24) 
	{ 
		CString szMsg; 
		szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount); 
		AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION); 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		return ; 
	} 
	 
	// 滤波器的高度 
	int iFilterH; 
	 
	// 滤波器的宽度 
	int iFilterW; 
	 
	// 中心元素的X坐标 
	int iFilterMX; 
	 
	// 中心元素的Y坐标 
	int iFilterMY; 
	 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 创建对话框 
	CDlgMidFilter dlgPara; 
	 
	// 显示对话框,提示用户设定平移量 
	if (dlgPara.DoModal() != IDOK) 
	{ 
		// 返回 
		return; 
	} 
	 
	// 获取用户的设定 
	iFilterH = dlgPara.m_iFilterH; 
	iFilterW = dlgPara.m_iFilterW; 
	iFilterMX = dlgPara.m_iFilterMX; 
	iFilterMY = dlgPara.m_iFilterMY; 
	 
	// 删除对话框 
	delete dlgPara;	 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 调用MedianFilter()函数中值滤波 
	if (::MedianFilter(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB),  
		  iFilterH, iFilterW, iFilterMX, iFilterMY, nBitCount)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
//////////////////////////////////////////////////////////////////////////////////// 
// 
//	边缘检测菜单响应处理函数 
// 
void CImage_ManageView::OnEdgeGauss()  
{ 
	//Gauss边缘检测运算 
	// 获取文档 
	CImage_ManageDoc* pDoc = GetDocument(); 
	// 每个像素占用的位 
	int nBitCount; 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 得到每个像素的位数 
	nBitCount = ::DIBBitCount(lpDIB); 
	 
	// 滤除不为处理的图像格式 
	if(nBitCount!=8 && nBitCount!=24) 
	{ 
		CString szMsg; 
		szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount); 
		AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION); 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		return ; 
	} 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 调用GaussDIB()函数对DIB进行边缘检测 
	if (GaussDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nBitCount)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor();	 
} 
 
void CImage_ManageView::OnEdgeKirsch()  
{ 
	//Kirsch边缘检测运算 
	// 获取文档 
	CImage_ManageDoc* pDoc = GetDocument(); 
	// 每个像素占用的位 
	int nBitCount; 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 得到每个像素的位数 
	nBitCount = ::DIBBitCount(lpDIB); 
	 
	// 滤除不为处理的图像格式 
	if(nBitCount!=8 && nBitCount!=24) 
	{ 
		CString szMsg; 
		szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount); 
		AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION); 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		return ; 
	} 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 调用KirschDIB()函数对DIB进行边缘检测 
	if (KirschDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nBitCount)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor();	 
} 
 
void CImage_ManageView::OnEdgePrewitt()  
{ 
	//Prewitt边缘检测运算 
	// 获取文档 
	CImage_ManageDoc* pDoc = GetDocument(); 
	// 每个像素占用的位 
	int nBitCount; 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 得到每个像素的位数 
	nBitCount = ::DIBBitCount(lpDIB); 
	 
	// 滤除不为处理的图像格式 
	if(nBitCount!=8 && nBitCount!=24) 
	{ 
		CString szMsg; 
		szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount); 
		AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION); 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		return ; 
	} 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 调用PrewittDIB()函数对DIB进行边缘检测 
	if (PrewittDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nBitCount)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
void CImage_ManageView::OnEdgeRobert()  
{ 
	//Robert边缘检测运算 
	// 获取文档 
	CImage_ManageDoc* pDoc = GetDocument(); 
	// 每个像素占用的位 
	int nBitCount; 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 得到每个像素的位数 
	nBitCount = ::DIBBitCount(lpDIB); 
	 
	// 滤除不为处理的图像格式 
	if(nBitCount!=8 && nBitCount!=24) 
	{ 
		CString szMsg; 
		szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount); 
		AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION); 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		return ; 
	} 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 调用RobertDIB()函数对DIB进行边缘检测 
	if (RobertDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nBitCount)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
void CImage_ManageView::OnEdgeSobel()  
{ 
	//Sobel边缘检测运算 
	// 获取文档 
	CImage_ManageDoc* pDoc = GetDocument(); 
	// 每个像素占用的位 
	int nBitCount; 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 得到每个像素的位数 
	nBitCount = ::DIBBitCount(lpDIB); 
	 
	// 滤除不为处理的图像格式 
	if(nBitCount!=8 && nBitCount!=24) 
	{ 
		CString szMsg; 
		szMsg.Format(TEXT("为了简化程序,此操作只支持8位和24位位图.\n你打开的位图为%d位."),nBitCount); 
		AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION); 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		return ; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 调用SobelDIB()函数对DIB进行边缘检测 
	if (SobelDIB(lpDIBBits, WIDTHBYTES(::DIBWidth(lpDIB) * 8), ::DIBHeight(lpDIB), nBitCount)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
//////////////////////////////////////////////////////////////////////////////////// 
// 
//	图像转换菜单响应处理函数 
// 
 
void CImage_ManageView::OnTransGray()  
{ 
	// 真彩色图像转换为256色图像运算 
	// 获取文档 
	CImage_ManageDoc* pDoc = GetDocument(); 
	// 每个像素占用的位 
	int nBitCount; 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 得到每个像素的位数 
	nBitCount = ::DIBBitCount(lpDIB); 
	 
	// 滤除不为处理的图像格式 
	if(nBitCount!=24) 
	{ 
		CString szMsg; 
		szMsg.Format(TEXT("此操作只支持24位真彩色位图.\n你打开的位图为%d位."),nBitCount); 
		AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION); 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		return ; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 调用To256DIB()函数对DIB进行图像转换 
	if (To256DIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB))) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
//////////////////////////////////////////////////////////////////////////////////// 
// 
//	图像识别菜单响应处理函数 
// 
void CImage_ManageView::OnGrayHist()  
{ 
	// 直方图处理函数 
	// 获取文档 
	CImage_ManageDoc* pDoc = GetDocument(); 
	// 每个像素占用的位 
	int nBitCount; 
	LONG i,j; 
 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB()); 
	 
	// 得到每个像素的位数 
	nBitCount = ::DIBBitCount(lpDIB); 
	 
	// 滤除不为处理的图像格式 
	if(nBitCount!=8 && nBitCount!=24) 
	{ 
		CString szMsg; 
		szMsg.Format(TEXT("此操作只支持8位或24位位图.\n你打开的位图为%d位."),nBitCount); 
		AfxMessageBox(szMsg,MB_OK | MB_ICONINFORMATION); 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		return ; 
	} 
 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	CDlgHist dlgPara; 
	LONG lWidth=::DIBWidth(lpDIB); 
	LONG lHeight=::DIBHeight(lpDIB); 
	BYTE bTemp; 
	// 清零 
	for(i=0;i<256;i++) 
		dlgPara.hist[i]=0; 
	switch(nBitCount) 
	{ 
	case 8: 
		unsigned char*	lpSrc; 
 
		for(i=0;ilWidth) 
			lWidth=dlgPara.hist[i]; 
	} 
	// 找系数 
	lWidth=lWidth/240; 
	for(i=0;i<256;i++) 
	{ 
		dlgPara.hist[i]=dlgPara.hist[i] / lWidth; 
	} 
 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
		 
	// 恢复光标 
	EndWaitCursor(); 
	 
	//显示直方图 
	dlgPara.DoModal(); 
	delete dlgPara; 
} 
 
void CImage_ManageView::OnGrayGrid()  
{ 
	// 网格图处理函数 
	// 创建对话框 
	CDlgGrid dlgPara; 
	// 显示网格对话框 
	dlgPara.DoModal(); 
	// 删除对话框 
	delete dlgPara; 
}