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()));
}