www.pudn.com > LlxDip.rar > LlxDipView.cpp


// LlxDipView.cpp : implementation of the CLlxDipView class 
// 
 
#include "stdafx.h" 
#include "LlxDip.h" 
 
#include "LlxDipDoc.h" 
#include "LlxDipView.h" 
#include "DlgIntensity.h" 
#include "DlgTr.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CLlxDipView 
 
IMPLEMENT_DYNCREATE(CLlxDipView, CScrollView) 
 
BEGIN_MESSAGE_MAP(CLlxDipView, CScrollView) 
	//{{AFX_MSG_MAP(CLlxDipView) 
	ON_UPDATE_COMMAND_UI(ID_YUV_Y, OnUpdateYuvY) 
	ON_UPDATE_COMMAND_UI(ID_YUV_V, OnUpdateYuvV) 
	ON_UPDATE_COMMAND_UI(ID_YUV_U, OnUpdateYuvU) 
	ON_COMMAND(ID_YUV_U, OnYuvU) 
	ON_COMMAND(ID_YUV_V, OnYuvV) 
	ON_COMMAND(ID_YUV_Y, OnYuvY) 
	ON_UPDATE_COMMAND_UI(ID_FILE_RELOAD, OnUpdateFileReload) 
	ON_UPDATE_COMMAND_UI(ID_MIDFILTER, OnUpdateMidfilter) 
	ON_COMMAND(ID_MIDFILTER, OnMidfilter) 
	ON_COMMAND(ID_VIEW_INTENSITY, OnViewIntensity) 
	ON_UPDATE_COMMAND_UI(ID_VIEW_INTENSITY, OnUpdateViewIntensity) 
	ON_COMMAND(ID_POINT_EQUA, OnPointEqua) 
	ON_COMMAND(IDM_TR, OnTr) 
	ON_UPDATE_COMMAND_UI(IDM_TR, OnUpdateTr) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CLlxDipView construction/destruction 
 
CLlxDipView::CLlxDipView() 
{ 
	// TODO: add construction code here 
 
} 
 
CLlxDipView::~CLlxDipView() 
{ 
} 
 
BOOL CLlxDipView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CScrollView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CLlxDipView drawing 
 
void CLlxDipView::OnDraw(CDC* pDC) 
{ 
	CLlxDipDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	// TODO: add draw code for native data here 
 
	LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->m_hDIB); 
	int cxDIB = (int) ::DIBWidth(lpDIB);         // Size of DIB - x 
	int cyDIB = (int) ::DIBHeight(lpDIB);        // Size of DIB - y 
	::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
	CRect rect(0,0,cxDIB,cyDIB), rcDIB(0,0,cxDIB,cyDIB); 
	::PaintDIB(pDC->m_hDC, &rect, pDoc->m_hDIB, &rcDIB, pDoc->m_palDIB); 
 
} 
 
void CLlxDipView::OnInitialUpdate() 
{ 
	CScrollView::OnInitialUpdate(); 
 
	SetScrollSizes(MM_TEXT, GetDocument()->m_sizeDoc); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CLlxDipView diagnostics 
 
#ifdef _DEBUG 
void CLlxDipView::AssertValid() const 
{ 
	CScrollView::AssertValid(); 
} 
 
void CLlxDipView::Dump(CDumpContext& dc) const 
{ 
	CScrollView::Dump(dc); 
} 
 
CLlxDipDoc* CLlxDipView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLlxDipDoc))); 
	return (CLlxDipDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CLlxDipView message handlers 
 
void CLlxDipView::OnUpdateYuvY(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	CLlxDipDoc* pDoc = GetDocument(); 
	pCmdUI->Enable(!(pDoc->GetPathName().IsEmpty())); 
} 
 
void CLlxDipView::OnUpdateYuvV(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	CLlxDipDoc* pDoc = GetDocument(); 
	pCmdUI->Enable(!(pDoc->GetPathName().IsEmpty())); 
} 
 
void CLlxDipView::OnUpdateYuvU(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	CLlxDipDoc* pDoc = GetDocument(); 
	pCmdUI->Enable(!(pDoc->GetPathName().IsEmpty())); 
} 
 
void CLlxDipView::OnYuvU()  
{ 
	// TODO: Add your command handler code here 
	CLlxDipDoc* pDoc = GetDocument(); 
	::ConvertRGBtoU(pDoc->m_hDIB);	 
	Invalidate(TRUE); 
} 
 
void CLlxDipView::OnYuvV()  
{ 
	// TODO: Add your command handler code here 
	CLlxDipDoc* pDoc = GetDocument(); 
	::ConvertRGBtoV(pDoc->m_hDIB);	 
	Invalidate(TRUE); 
} 
 
void CLlxDipView::OnYuvY()  
{ 
	// TODO: Add your command handler code here 
	CLlxDipDoc* pDoc = GetDocument(); 
	::ConvertRGBtoY(pDoc->m_hDIB);	 
	Invalidate(TRUE); 
} 
 
void CLlxDipView::OnUpdateFileReload(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	CLlxDipDoc* pDoc = GetDocument(); 
	pCmdUI->Enable(!(pDoc->GetPathName().IsEmpty())); 
} 
 
void CLlxDipView::OnUpdateMidfilter(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
 
	CLlxDipDoc* pDoc = GetDocument(); 
	pCmdUI->Enable(!(pDoc->GetPathName().IsEmpty())); 
} 
 
void CLlxDipView::OnMidfilter()  
{ 
	// TODO: Add your command handler code here 
	CLlxDipDoc* pDoc = GetDocument(); 
	pDoc->m_hDIB=MidFilter(pDoc->m_hDIB,3,3);	 
	Invalidate(TRUE); 
	 
} 
 
void CLlxDipView::OnViewIntensity()  
{ 
	// 查看当前图像灰度直方图 
	 
	// 获取文档 
	CLlxDipDoc* 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; 
	} 
	 
	// 创建对话框 
	CDlgIntensity diy; 
	 
	// 初始化变量值 
	diy.m_lpDIBBits = lpDIBBits; 
	diy.m_lWidth = ::DIBWidth(lpDIB); 
	diy.m_lHeight = ::DIBHeight(lpDIB); 
	diy.m_iLowGray = 0; 
	diy.m_iUpGray = 255; 
	 
	// 显示对话框,提示用户设定平移量 
	if (diy.DoModal() != IDOK) 
	{ 
		// 返回 
		return; 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
	 
} 
 
void CLlxDipView::OnUpdateViewIntensity(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	CLlxDipDoc* pDoc = GetDocument(); 
	pCmdUI->Enable(!(pDoc->GetPathName().IsEmpty())); 
} 
 
 
// 灰度均衡 
void CLlxDipView::OnPointEqua()  
{ 
	// TODO: Add your command handler code here 
 
	// 获取文档 
	CLlxDipDoc* 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; 
	} 
 
	 
	// 调用InteEqualize()函数进行直方图均衡 
	InteEqualize(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)); 
	 
	// 设置脏标记 
	pDoc->SetModifiedFlag(TRUE); 
	 
	// 更新视图 
	pDoc->UpdateAllViews(NULL); 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); 
	 
} 
 
 
void CLlxDipView::OnTr()  
{ 
 
	// TODO: Add your command handler code here 
	// 直方图均衡化的变换曲线 
	CLlxDipDoc* pDoc = GetDocument(); 
 
	// 指向DIB的指针 
	LPSTR lpDIB; 
	 
	// 指向DIB象素指针 
	LPSTR    lpDIBBits; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->m_hSrcDIB); 
	 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持查看256色位图灰度直方图的变换曲线!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
		 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->m_hSrcDIB); 
		 
		// 返回 
		return; 
	} 
	 
	// 创建对话框 
	CDlgTr tr; 
	 
	// 初始化变量值 
	tr.m_lpDIBBits = lpDIBBits; 
	tr.m_lWidth = ::DIBWidth(lpDIB); 
	tr.m_lHeight = ::DIBHeight(lpDIB); 
 
	// 显示对话框,提示用户设定平移量 
	if (tr.DoModal() != IDOK) 
	{ 
		// 返回 
		return; 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->m_hSrcDIB); 
} 
 
void CLlxDipView::OnUpdateTr(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	CLlxDipDoc* pDoc = GetDocument(); 
	pCmdUI->Enable(!(pDoc->GetPathName().IsEmpty())); 
}