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

📄 hwpreview.cpp

📁 关于字符分割的程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// hwpreView.cpp : implementation of the CHwpreView class
//

#include "stdafx.h"
#include "hwpre.h"

#include "hwpreDoc.h"
#include "hwpreView.h"
#include "MainFrm.h"
#include "DlgIntensity.h"
#include "edgecontour.h"
#include "GeoTrans.h"
#include "detect.h"
#include "DlgLine.h"
#include "morph.h"
#include "PointTrans.h"
#include "FFTGabor.h"
#include "savetofile.h"
#include "TemplateTrans.h"
#include "DlgWordPara.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CHwpreView

IMPLEMENT_DYNCREATE(CHwpreView, CScrollView)

BEGIN_MESSAGE_MAP(CHwpreView, CScrollView)
	//{{AFX_MSG_MAP(CHwpreView)
	ON_MESSAGE(WM_DOREALIZE, OnDoRealize)
	ON_COMMAND(ID_VIEW_ORIG, OnViewOrig)
	ON_UPDATE_COMMAND_UI(ID_VIEW_ORIG, OnUpdateViewOrig)
	ON_COMMAND(ID_VIEW_STRETCH1, OnViewStretch1)
	ON_UPDATE_COMMAND_UI(ID_VIEW_STRETCH1, OnUpdateViewStretch1)
	ON_COMMAND(ID_VIEW_STRETCH2, OnViewStretch2)
	ON_UPDATE_COMMAND_UI(ID_VIEW_STRETCH2, OnUpdateViewStretch2)
	ON_COMMAND(ID_TRAN_THRE, OnTranThre)
	ON_COMMAND(ID_POINT_EQUA, OnPointEqua)
	ON_COMMAND(ID_EDGE_HOUGH, OnEdgeHough)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDBLCLK()
	ON_COMMAND(IDC_EG_HPROJECT, OnEgHproject)
	ON_COMMAND(IDC_EG_VPROJECT, OnEgVproject)
	ON_WM_KEYDOWN()
	ON_COMMAND(ID_EG_HLINE, OnEgHline)
	ON_COMMAND(ID_ED_HEGA2, OnEdHega2)
	ON_COMMAND(ID_EG_VWORD, OnEgVword)
	ON_COMMAND(ID_VIEW_SHOWNUMBER, OnViewShownumber)
	ON_UPDATE_COMMAND_UI(ID_VIEW_SHOWNUMBER, OnUpdateViewShownumber)
	ON_COMMAND(ID_MORPH_THINING, OnMorphThining)
	ON_COMMAND(ID_MORPH_DILATION, OnMorphDilation)
	ON_COMMAND(ID_AUTO_HOUGH, OnAutoHough)
	ON_COMMAND(ID_GaborFFT, OnGaborFFT)
	ON_COMMAND(ID_GaborFFT32, OnGaborFFT32)
	ON_COMMAND(ID_EDIT_SELECT, OnEditSelect)
	ON_COMMAND(ID_ORI_HANZI, OnOriHanzi)
	ON_COMMAND(ID_ORI_HANZI32, OnOriHanzi32)
	ON_COMMAND(ID_EDIT_COPY1TO2, OnEditCopy1to2)
	ON_COMMAND(ID_EDIT_COPY2TO1, OnEditCopy2to1)
	ON_COMMAND(ID_SMOOTH, OnSmooth)
	ON_COMMAND(ID_SMOOTH_V, OnSmoothV)
	ON_COMMAND(ID_ED_HEGA3, OnEdHega3)
	ON_COMMAND(IDC_EG_VPROJECT_ALL, OnEgVprojectAll)
	ON_COMMAND(ID_EG_VWORD2, OnEgVword2)
	ON_COMMAND(ID_EDIT_CLEARALLRECT, OnEditClearallrect)
	ON_COMMAND(ID_SAVE_RESULT, OnSaveResult)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CHwpreView construction/destruction

CHwpreView::CHwpreView()
{
	// TODO: add construction code here
	m_bStretchDisp = ID_DISP_ORIG ;
	m_rectView = CRect(0,0, 1,1);
	m_pdlgParaIntensity=NULL;
	m_iIsDraging=0;
	m_MouseRect = CRect(0,0,1,1);
	m_DragRect=CRect(0,0,1,1);
	m_ptCurRect = CPoint(-1,-1);
	m_bshowNumber = TRUE;
	LinesInfoHead = NULL;
	LinesInfoRear = NULL;
	maxLineHeight = 0;
}

CHwpreView::~CHwpreView()
{
	
}

BOOL CHwpreView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CHwpreView drawing

void CHwpreView::OnDraw(CDC* pDC)
{
	CHwpreDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	HDIB hDIB = pDoc->GetHDIB();

	if (hDIB) {
		int cxDIB = pDoc->GetDocSize().cx;
		int cyDIB = pDoc->GetDocSize().cy;
		CRect rcDIB,rcDest,rcPdc;
		rcDIB.top = rcDIB.left = 0;
		rcDIB.right= cxDIB;
		rcDIB.bottom= cyDIB;
		GetClientRect(rcPdc);
		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;
			
			if (((double)cxDIB/cyDIB)>((double)(cxPage*cyInch)/(cyPage*cxInch))){
				rcDest.right = cxPage;
				rcDest.bottom =(int)( ((double)cyDIB * cxPage * cyInch) /((double)cxDIB * cxInch));
			}else
			{
				rcDest.bottom =cyPage;
				rcDest.right =(int)( ((double)cxDIB * cyPage * cxInch) /((double)cyDIB * cyInch));
			}
			::PaintDIB(pDC->m_hDC ,&rcDest,pDoc->GetHDIB(),&rcDIB,pDoc->GetDocPalette());

		}
		else{                                //显示
			switch(m_bStretchDisp) {
			case ID_DISP_STRETCH1 :          //按窗口拉伸
				rcDest= rcPdc;
				break;
			case ID_DISP_STRETCH2 :          //按比例拉伸
				rcDest = rcDIB;
				if (((double)cxDIB/cyDIB) > ((double)rcPdc.Width()/rcPdc.Height())) {
					rcDest.right = rcPdc.Width();
					rcDest.bottom=(long)(((double) cyDIB * rcDest.right)/cxDIB);
					if (rcDest.bottom<rcPdc.bottom) {
						rcDest.OffsetRect(CPoint(0,(rcPdc.bottom-rcDest.bottom)/2));
					}		
				}
				else
				{
					rcDest.bottom =rcPdc.Height();
					rcDest.right = (long) (((double) cxDIB *rcDest.bottom)/cyDIB);
					if (rcDest.right<rcPdc.right) {
						rcDest.OffsetRect(CPoint((rcPdc.right-rcDest.right)/2,0));
					}
				}
				break;
			default:                         //ID_DISP_ORIG : 原大小显示
				rcDest= rcDIB;
				if (rcDest.right<rcPdc.right) {
				//	rcDest.left =(rcPdc.right-rcDest.right)/2;
				//	rcDest.right+=rcDest.left;
					rcDest.OffsetRect(CPoint((rcPdc.right-rcDest.right)/2,0));
				}
				if (rcDest.bottom<rcPdc.bottom) {
				//	rcDest.top=(rcPdc.bottom-rcDest.bottom)/2;
				//	rcDest.bottom+=rcDest.top ;
					rcDest.OffsetRect(CPoint(0,(rcPdc.bottom-rcDest.bottom)/2));
				}		
			}
			::PaintDIB(pDC->m_hDC ,&rcDest,pDoc->GetHDIB(),&rcDIB,pDoc->GetDocPalette());

			//画边界线
			m_rectView = rcDest;
			CSize  m_sizeView = rcDest.Size();
			CPen * pPenOld = NULL;
			pPenOld=(CPen *) pDC->SelectStockObject(WHITE_PEN);
			pDC->MoveTo(rcDest.left-1,rcDest.top-1 );
			pDC->LineTo(rcDest.left-1,rcDest.bottom+1);
			pDC->LineTo(rcDest.right+1,rcDest.bottom+1);
			pDC->LineTo(rcDest.right+1,rcDest.top-1);
			pDC->LineTo(rcDest.left-1,rcDest.top-1);
			CPen cp;
			cp.CreatePen(PS_SOLID ,1,RGB(255,0,0));
			//pDC->SelectStockObject(BLACK_PEN);
			pDC->SelectObject(cp);
			pDC->MoveTo(rcDest.left-2,rcDest.top-2);
			pDC->LineTo(rcDest.left-2,rcDest.bottom+2);
			pDC->LineTo(rcDest.right+2,rcDest.bottom+2);
			pDC->LineTo(rcDest.right+2,rcDest.top-2);
			pDC->LineTo(rcDest.left-2,rcDest.top-2);
			pDC->TextOut(10,10,"原图");
			//画边界线结束

			//设置滚动条
			SetScrollSizes(MM_TEXT,m_sizeView);
			//m_iIsDraging =0;
			TRACE("rcdest : %d,%d,%d,%d",rcDest.left ,rcDest.top,rcDest.right,rcDest.bottom);

			m_MouseRect = rcDest;
			//ClientToScreen(m_MouseRect);
			
			TRACE("mouserc : %d,%d,%d,%d",m_MouseRect.left ,m_MouseRect.top,m_MouseRect.right,m_MouseRect.bottom);
			CRect  cr;int i=0; CString str; BOOL isCur =FALSE;
			if (!m_ListRect.IsEmpty()) {
				POSITION pst;
				pst = m_ListRect.GetHeadPosition();
				do {
					cr = * ((CRect *) m_ListRect.GetNext(pst));
					isCur = cr.PtInRect(m_ptCurRect);
					cr = DibToDisp(cr);
					pDC->MoveTo(cr.left,cr.top);
					pDC->LineTo(cr.right,cr.top);
					pDC->LineTo(cr.right,cr.bottom);
					pDC->LineTo(cr.left,cr.bottom);
					pDC->LineTo(cr.left,cr.top);
					i++;
					if (m_bshowNumber) {
						if (isCur) {
							str.Format("*%d",i);
							pDC->TextOut(cr.left+1,cr.top+1 ,str);	
						}else{
							str.Format("%d",i);
							pDC->TextOut(cr.left+1,cr.top+1 ,str);
						}
					}
					
				} while(i<m_ListRect.GetCount());
			}
			if (0 != m_iIsDraging) {
					TRACE("m_DragRect : %d,%d,%d,%d",m_DragRect.left ,m_DragRect.top,m_DragRect.right,m_DragRect.bottom);
					pDC->MoveTo(m_DragRect.left,m_DragRect.top);
					pDC->LineTo(m_DragRect.right,m_DragRect.top);
					pDC->LineTo(m_DragRect.right,m_DragRect.bottom);
					pDC->LineTo(m_DragRect.left,m_DragRect.bottom);
					pDC->LineTo(m_DragRect.left,m_DragRect.top);
				
			}
			pDC->SelectObject(pPenOld);
		}

	}
}

void CHwpreView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	CSize sizeTotal;
	// TODO: calculate the total size of this view
	sizeTotal.cx = sizeTotal.cy = 100;
	SetScrollSizes(MM_TEXT, sizeTotal);
}

/////////////////////////////////////////////////////////////////////////////
// CHwpreView printing

BOOL CHwpreView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	pInfo->SetMaxPage(1);
	return DoPreparePrinting(pInfo);
}

void CHwpreView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CHwpreView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CHwpreView diagnostics

#ifdef _DEBUG
void CHwpreView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CHwpreView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CHwpreDoc* CHwpreView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHwpreDoc)));
	return (CHwpreDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CHwpreView message handlers

LRESULT CHwpreView::OnDoRealize(WPARAM wParam, LPARAM)
{
	ASSERT(wParam != NULL);
	CHwpreDoc * pDoc = GetDocument();
	if (pDoc->GetHDIB() == NULL)
		return 0L;  // must be a new document

	CPalette* pPal = pDoc->GetDocPalette();
	if (pPal != NULL)
	{
		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("\tSelectPalette failed in CDibView::OnPaletteChanged\n");
		}
	}

	return 0L;
}
void CHwpreView::OnViewOrig() 
{
	// TODO: Add your command handler code here
	m_bStretchDisp = ID_DISP_ORIG;
	Invalidate();
}

void CHwpreView::OnUpdateViewOrig(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_bStretchDisp==ID_DISP_ORIG);
}

void CHwpreView::OnViewStretch1() 
{
	// TODO: Add your command handler code here
	m_bStretchDisp = ID_DISP_STRETCH1 ;
	Invalidate();
}

void CHwpreView::OnUpdateViewStretch1(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_bStretchDisp==ID_DISP_STRETCH1 );
}

void CHwpreView::OnViewStretch2() 
{
	// TODO: Add your command handler code here
	m_bStretchDisp = ID_DISP_STRETCH2 ;
	Invalidate();
}

void CHwpreView::OnUpdateViewStretch2(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_bStretchDisp==ID_DISP_STRETCH2 );
}

/////////////////////////////////////////////////////////////////

void CHwpreView::OnTranThre() 
{
	// TODO: Add your command handler code here
	CHwpreDoc* pDoc = GetDocument();
	
	LPSTR lpDIB;
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB2());
	
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推)
	if (::DIBNumColors(lpDIB) != 256)
	{
		// 提示用户
		MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
		
		// 解除锁定
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB2());
		
		// 返回
		return;
	}
	// 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB2());
	
	// 创建对话框
/*
	HDIB hNewDIB ;
	hNewDIB = (HDIB)::CopyHandle((HGLOBAL)pDoc->GetHDIB());
	pDoc->ReplaceHDIB2(hNewDIB);
	pDoc->InitDIBData2();
*/

	if (m_pdlgParaIntensity==NULL) {
		m_pdlgParaIntensity = new CDlgIntensity(this);
		// 初始化变量值
		m_pdlgParaIntensity->hDibSource=(HDIB) CopyHandle((HGLOBAL) pDoc->GetHDIB2());
		m_pdlgParaIntensity->hDibDest = pDoc->GetHDIB2();
		m_pdlgParaIntensity->m_intThre =128;
		if (m_pdlgParaIntensity->Create()) {
			m_pdlgParaIntensity->ShowWindow(SW_SHOW);;
		}
	}else{
		m_pdlgParaIntensity->SetActiveWindow();
	}
	//dlgPara.Create()
	
//	dlgPara.m_lpDIBBits = lpDIBBits;
//	dlgPara.m_lWidth = ::DIBWidth(lpDIB);
//	dlgPara.m_lHeight = ::DIBHeight(lpDIB);
//	dlgPara.m_grayLow = 0;
//	dlgPara.m_grayHigh = 255;
	
	// 显示对话框,提示用户设定平移量
	//if (dlgPara.DoModal() != IDOK)
	{
		// 返回
	//	return;
	}
	
}

void CHwpreView::OnPointEqua() 
{
		// 获取文档
	CHwpreDoc * pDoc = GetDocument();
	
	// 指向DIB的指针
	LPSTR	lpDIB;
	
	// 指向DIB象素指针
	LPSTR    lpDIBBits;
	
	// 锁定DIB
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB2());
	
	// 找到DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的直方图均衡,其它的可以类推)
	if (::DIBNumColors(lpDIB) != 256)
	{
		// 提示用户
		MessageBox("目前只支持256色位图的直方图均衡!", "系统提示" , 
			MB_ICONINFORMATION | MB_OK);
		
		// 解除锁定
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
		
		// 返回
		return;
	}
	
	// 更改光标形状
	BeginWaitCursor();
	
	// 调用InteEqualize()函数进行直方图均衡
	InteEqualize(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB));
	
	// 设置脏标记
	pDoc->SetModifiedFlag(TRUE);
	
	// 更新视图
	pDoc->UpdateAllViews(NULL);
	
	// 解除锁定
	::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());

	// 恢复光标
	EndWaitCursor();


/*	// TODO: Add your command handler code here
	CHwpreDoc* pDoc = GetDocument();
	
	LPSTR lpDIB;
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
	
	
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图,其它的可以类推)
	if (::DIBNumColors(lpDIB) != 256)
	{
		// 提示用户
		MessageBox("目前只支持查看256色位图灰度直方图!", "系统提示" , MB_ICONINFORMATION | MB_OK);
		
		// 解除锁定
		::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
		
		// 返回
		return;
	}
	// 解除锁定

⌨️ 快捷键说明

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