From 9c13bc5af33d28bb217995597f88fe863db42442 Mon Sep 17 00:00:00 2001
From: LYW <leeyeanwoo@diteam.co.kr>
Date: 금, 01 4월 2022 10:59:55 +0900
Subject: [PATCH] AOI RawMessnger 동기화

---
 ReviewHistory/ReveiwHistory/CameraImageView.cpp |  985 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 985 insertions(+), 0 deletions(-)

diff --git a/ReviewHistory/ReveiwHistory/CameraImageView.cpp b/ReviewHistory/ReveiwHistory/CameraImageView.cpp
new file mode 100644
index 0000000..dc8370e
--- /dev/null
+++ b/ReviewHistory/ReveiwHistory/CameraImageView.cpp
@@ -0,0 +1,985 @@
+癤�// CameraImageView.cpp : 援ы쁽 �뙆�씪�엯�땲�떎.
+//
+
+#include "stdafx.h"
+#include "ReveiwHistory.h"
+#include "CameraImageView.h"
+#include "CHImageControls/CHBufferDC.h"
+
+using namespace CHImageControls;
+// CDlgReviewCamera ���솕 �긽�옄�엯�땲�떎.
+
+// CCameraImageView
+
+IMPLEMENT_DYNAMIC(CCameraImageView, CWnd)
+
+CCameraImageView::CCameraImageView(CWnd *pParentWnd)
+{
+	m_strViewName	= _T("");
+	m_pParentWnd	= pParentWnd;
+
+	m_nHScroll		= 0;
+	m_nVScroll		= 0;
+
+	m_nMaxHScroll	= 0;
+	m_nMaxVScroll	= 0;
+	m_nDrawMode		= 0;
+
+	m_rtClientRect	= CRect(0,0,0,0);
+	m_bDrawCenterLine = FALSE;
+	m_bDrawRuler		= FALSE;
+	m_bDrawViewName = FALSE;
+	m_nViewBand		= BandTypeColor;
+	m_nDrawMode		= 1;
+
+	m_dWidthScale	= 1.0; 
+	m_dHeightScale	= 1.0;
+	m_nScaleWidth	= 0;
+	m_nScaleHeight	= 0;
+
+	m_dResolution	= 1.0; // um
+	m_dRulerGab		= 100.0; //um
+
+	m_pCIV2P		= NULL;
+
+	InitializeCriticalSection(&m_csImageData);
+
+}
+
+CCameraImageView::~CCameraImageView()
+{
+	DeleteCriticalSection(&m_csImageData);
+}
+
+// CCameraImageView 硫붿떆吏� 泥섎━湲곗엯�땲�떎.
+BEGIN_MESSAGE_MAP(CCameraImageView, CWnd)
+
+	ON_COMMAND(IDR_LOAD_IMAGE, &CCameraImageView::OnLoadImage)
+	ON_COMMAND(IDR_SAVE_IMAGE, &CCameraImageView::OnSaveImage)
+	ON_COMMAND(IDR_CENTER_LINE, &CCameraImageView::OnCenterLine)
+	ON_COMMAND(IDR_RULER, &CCameraImageView::OnRuler)
+	ON_COMMAND(IDR_VIEW_ORIGIN, &CCameraImageView::OnViewOrigin)
+	ON_COMMAND(IDR_VIEW_FIT, &CCameraImageView::OnViewFit)
+
+	ON_COMMAND(IDR_VIEW_COLOR, &CCameraImageView::OnViewColor)
+	ON_COMMAND(IDR_VIEW_GRAY,&CCameraImageView::OnViewGray)
+	ON_COMMAND(IDR_VIEW_RED, &CCameraImageView::OnViewRed)
+	ON_COMMAND(IDR_VIEW_GREEN, &CCameraImageView::OnViewGreen)
+	ON_COMMAND(IDR_VIEW_BLUE, &CCameraImageView::OnViewBlue)
+
+	ON_WM_PAINT()
+	ON_WM_MOUSEMOVE()
+	ON_WM_LBUTTONDOWN()
+	ON_WM_LBUTTONUP()
+	ON_WM_RBUTTONDOWN()
+	ON_WM_RBUTTONUP()
+	ON_WM_DESTROY()
+	ON_WM_HSCROLL()
+	ON_WM_VSCROLL()
+	ON_WM_LBUTTONDBLCLK()
+	ON_WM_RBUTTONDBLCLK()
+	ON_WM_CREATE()
+END_MESSAGE_MAP()
+
+
+// CCHImageView 硫붿떆吏� 泥섎━湲곗엯�땲�떎.
+void CCameraImageView::OnPaint()
+{
+	CCHBufferDC *pDC = new CCHBufferDC(this); // device context for painting
+
+	UpdateImageView(pDC);
+
+	delete pDC;
+}
+
+void CCameraImageView::UpdateImageView(CDC *pDC)
+{
+	CRect rtCurrentRect , rtSourceRect;
+	GetClientRect(rtCurrentRect);
+
+	//DrawText(CPoint(30, 30), RGB(255,255,0), _T("Defect Size"));
+
+	if (GetImageExist())
+	{
+		if (m_rtClientRect!=rtCurrentRect) SetDrawMode(m_nDrawMode);
+
+		int nSrcWidth = GetWidth();
+		int nSrcHeight = GetHeight();
+
+		int nWidth = int(double(nSrcWidth) * m_dWidthScale + 0.5);
+		int nHeight = int(double(nSrcHeight) * m_dHeightScale + 0.5);
+
+		if (m_nScaleWidth!=nWidth || m_nScaleHeight!=nHeight) 
+		{
+			SetDrawMode(m_nDrawMode);
+		}
+
+		switch(m_nDrawMode)
+		{
+		case 0:
+			pDC->SelectStockObject(GRAY_BRUSH);
+			pDC->Rectangle(rtCurrentRect);
+			ShowImage(pDC->m_hDC, 0, 0, rtCurrentRect.Width(), rtCurrentRect.Height(), m_nHScroll, m_nVScroll);
+			break;
+
+		case 1:
+			ShowImage(pDC->m_hDC, rtCurrentRect);
+			break;
+		}
+	}
+	else
+	{
+		pDC->SelectStockObject(GRAY_BRUSH);
+		pDC->Rectangle(rtCurrentRect);
+	}
+
+	if (m_bDrawCenterLine) DrawCenterLine(pDC);
+
+	if (m_bDrawRuler)	DrawRuler(pDC);
+
+	if (m_bDrawViewName) DrawViewName(pDC);
+
+}
+
+void CCameraImageView::OnMouseMove(UINT nFlags, CPoint point)
+{
+	// TODO: �뿬湲곗뿉 硫붿떆吏� 泥섎━湲� 肄붾뱶瑜� 異붽� 諛�/�삉�뒗 湲곕낯媛믪쓣 �샇異쒗빀�땲�떎.
+	if (m_pParentWnd==NULL) return;
+
+	CRect rect;
+	this->GetClientRect(rect);
+
+	point.x += m_nHScroll;
+	point.y += m_nVScroll;
+
+	if (point.x > 0 && point.x < this->GetScaleWidth()-1 &&
+		point.y > 0 && point.y < this->GetScaleHeight()-1 && nFlags == MK_LBUTTON)
+	{
+		m_pParentWnd->SendMessage(WM_MOUSEMOVE, static_cast<WPARAM>(nFlags), MAKELPARAM(point.x, point.y));
+	}
+
+	__super::OnMouseMove(nFlags, point);
+}
+
+void CCameraImageView::OnLButtonDown(UINT nFlags, CPoint point)
+{
+	// TODO: �뿬湲곗뿉 硫붿떆吏� 泥섎━湲� 肄붾뱶瑜� 異붽� 諛�/�삉�뒗 湲곕낯媛믪쓣 �샇異쒗빀�땲�떎.
+	if (m_pParentWnd==NULL) return;
+
+	CRect rect;
+	this->GetClientRect(rect);
+
+	point.x += m_nHScroll;
+	point.y += m_nVScroll;
+
+	if (point.x > 0 && point.x < this->GetScaleWidth()-1 &&
+		point.y > 0 && point.y < this->GetScaleHeight()-1 )
+	{
+		m_pParentWnd->SendMessage(WM_LBUTTONDOWN, static_cast<WPARAM>(nFlags), MAKELPARAM(point.x, point.y));
+	}
+
+	__super::OnLButtonDown(nFlags, point);
+}
+
+void CCameraImageView::OnLButtonUp(UINT nFlags, CPoint point)
+{
+	// TODO: �뿬湲곗뿉 硫붿떆吏� 泥섎━湲� 肄붾뱶瑜� 異붽� 諛�/�삉�뒗 湲곕낯媛믪쓣 �샇異쒗빀�땲�떎.
+	if (m_pParentWnd==NULL) return;
+
+	CRect rect;
+	this->GetClientRect(rect);
+
+	point.x += m_nHScroll;
+	point.y += m_nVScroll;
+
+	if (point.x > 0 && point.x < this->GetScaleWidth()-1 &&
+		point.y > 0 && point.y < this->GetScaleHeight()-1 )
+	{
+		m_pParentWnd->SendMessage(WM_LBUTTONUP, static_cast<WPARAM>(nFlags), MAKELPARAM(point.x, point.y));
+	}
+
+	__super::OnLButtonUp(nFlags, point);
+}
+
+void CCameraImageView::OnLButtonDblClk(UINT nFlags, CPoint point)
+{
+	// TODO: �뿬湲곗뿉 硫붿떆吏� 泥섎━湲� 肄붾뱶瑜� 異붽� 諛�/�삉�뒗 湲곕낯媛믪쓣 �샇異쒗빀�땲�떎.
+	if (m_pParentWnd==NULL) return;
+
+	point.x += m_nHScroll;
+	point.y += m_nVScroll;
+	m_pParentWnd->SendMessage(WM_LBUTTONDBLCLK, static_cast<WPARAM>(nFlags), MAKELPARAM(point.x, point.y));
+
+	__super::OnLButtonDblClk(nFlags, point);
+}
+
+void CCameraImageView::OnRButtonDown(UINT nFlags, CPoint point)
+{
+	// TODO: �뿬湲곗뿉 硫붿떆吏� 泥섎━湲� 肄붾뱶瑜� 異붽� 諛�/�삉�뒗 湲곕낯媛믪쓣 �샇異쒗빀�땲�떎.
+	CMenu menu;
+	CMenu popMenu;
+	menu.CreateMenu();  // 理쒖긽�쐞 堉덈� 硫붾돱
+	popMenu.CreatePopupMenu();  // �뙘�뾽硫붾돱
+	BOOL bAddMenu = FALSE;
+
+	popMenu.AppendMenu(MF_STRING, IDR_LOAD_IMAGE, _T("Load Image"));
+	popMenu.AppendMenu(MF_STRING, IDR_SAVE_IMAGE, _T("Save Image"));  // �깋�긽�쓽 �꽌釉뚮찓�돱 異붽�
+	popMenu.AppendMenu(MF_SEPARATOR);
+	popMenu.AppendMenu(MF_STRING, IDR_CENTER_LINE, _T("Center Line"));
+	popMenu.AppendMenu(MF_STRING, IDR_RULER, _T("Ruler"));
+	popMenu.AppendMenu(MF_SEPARATOR);
+	popMenu.AppendMenu(MF_STRING, IDR_VIEW_ORIGIN, _T("1:1 View"));
+	popMenu.AppendMenu(MF_STRING, IDR_VIEW_FIT, _T("Fit View"));  // �깋�긽�쓽 �꽌釉뚮찓�돱 異붽�
+	popMenu.AppendMenu(MF_SEPARATOR);
+	popMenu.AppendMenu(MF_STRING, IDR_VIEW_COLOR, _T("Color"));
+	popMenu.AppendMenu(MF_STRING, IDR_VIEW_GRAY, _T("Gray"));
+	popMenu.AppendMenu(MF_STRING, IDR_VIEW_RED, _T("Red"));
+	popMenu.AppendMenu(MF_STRING, IDR_VIEW_GREEN, _T("Green"));
+	popMenu.AppendMenu(MF_STRING, IDR_VIEW_BLUE, _T("Blue"));
+
+	// 硫붾돱 �긽�깭 泥섎━
+	if (m_bDrawCenterLine)
+	{
+		popMenu.CheckMenuItem(IDR_CENTER_LINE, MF_CHECKED);
+	}
+
+	if (m_bDrawRuler)
+	{
+		popMenu.CheckMenuItem(IDR_RULER, MF_CHECKED);
+	}
+
+
+	switch(m_nDrawMode)
+	{
+	case 0:
+		popMenu.CheckMenuItem(IDR_VIEW_ORIGIN, MF_CHECKED);
+		break;
+	case 1:
+		popMenu.CheckMenuItem(IDR_VIEW_FIT, MF_CHECKED);
+		break;
+	}
+
+	// 硫붾돱 �긽�깭 泥섎━
+	switch(m_nViewBand)
+	{
+	case BandTypeRed:
+		popMenu.CheckMenuItem(IDR_VIEW_RED, MF_CHECKED);
+		break;
+	case BandTypeGreen:
+		popMenu.CheckMenuItem(IDR_VIEW_GREEN, MF_CHECKED);
+		break;
+	case BandTypeBlue:
+		popMenu.CheckMenuItem(IDR_VIEW_BLUE, MF_CHECKED);
+		break;
+	case BandTypeGray:
+		popMenu.CheckMenuItem(IDR_VIEW_GRAY, MF_CHECKED);
+		break;
+	default:
+		popMenu.CheckMenuItem(IDR_VIEW_COLOR, MF_CHECKED);
+		break;
+	}
+
+	// 而⑦뀓�뒪�듃 硫붾돱 �샇異�
+	CRect rect;
+	GetWindowRect(rect);
+	int nX = rect.left + point.x; 
+	int nY = rect.top + point.y; 
+
+	popMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, nX, nY, this);
+
+	if (m_pParentWnd==NULL) return;
+	point.x += m_nHScroll;
+	point.y += m_nVScroll;
+	m_pParentWnd->SendMessage(WM_RBUTTONDOWN, static_cast<WPARAM>(nFlags), MAKELPARAM(point.x, point.y));
+
+	__super::OnRButtonDown(nFlags, point);
+}
+
+void CCameraImageView::OnRButtonUp(UINT nFlags, CPoint point)
+{
+	// TODO: �뿬湲곗뿉 硫붿떆吏� 泥섎━湲� 肄붾뱶瑜� 異붽� 諛�/�삉�뒗 湲곕낯媛믪쓣 �샇異쒗빀�땲�떎.
+	if (m_pParentWnd==NULL) return;
+
+	point.x += m_nHScroll;
+	point.y += m_nVScroll;
+	m_pParentWnd->SendMessage(WM_RBUTTONUP, static_cast<WPARAM>(nFlags), MAKELPARAM(point.x, point.y));
+
+	__super::OnRButtonUp(nFlags, point);
+}
+
+void CCameraImageView::OnRButtonDblClk(UINT nFlags, CPoint point)
+{
+	// TODO: �뿬湲곗뿉 硫붿떆吏� 泥섎━湲� 肄붾뱶瑜� 異붽� 諛�/�삉�뒗 湲곕낯媛믪쓣 �샇異쒗빀�땲�떎.
+	if (m_pParentWnd==NULL) return;
+
+	point.x += m_nHScroll;
+	point.y += m_nVScroll;
+	m_pParentWnd->SendMessage(WM_RBUTTONDBLCLK, static_cast<WPARAM>(nFlags), MAKELPARAM(point.x, point.y));
+
+	__super::OnRButtonDblClk(nFlags, point);
+}
+
+
+void CCameraImageView::SetDrawCenterLine(BOOL bDraw)
+{
+	m_bDrawCenterLine = bDraw; 
+	Invalidate(TRUE);
+}
+
+void CCameraImageView::SetDrawRuler(BOOL bDraw)
+{
+	m_bDrawRuler = bDraw; 
+	Invalidate(TRUE);
+}
+
+void CCameraImageView::SetDrawMode(int nDrawMode)
+{ 
+	m_nDrawMode = nDrawMode; 
+
+	GetClientRect(m_rtClientRect);
+
+	m_nScaleWidth = GetScaleWidth();
+	m_nScaleHeight = GetScaleHeight();
+
+	switch(m_nDrawMode)
+	{
+	case 0:
+		if (m_rtClientRect.Width() >= m_nScaleWidth)
+		{
+			m_nMaxHScroll = 0;
+		}
+		else
+		{
+			m_nMaxHScroll = m_nScaleWidth - (m_rtClientRect.Width()+17);
+			if (m_nMaxHScroll < 0) 
+			{
+				m_nMaxHScroll = 0;
+			}
+			else
+			{
+				m_nMaxHScroll += 17;
+			}
+		}
+
+		if (m_rtClientRect.Height() >= m_nScaleHeight)
+		{
+			m_nMaxVScroll = 0;
+		}
+		else
+		{
+			m_nMaxVScroll = m_nScaleHeight - (m_rtClientRect.Height()+17);
+			if (m_nMaxVScroll < 0) 
+			{
+				m_nMaxVScroll = 0;
+			}
+			else
+			{
+				m_nMaxVScroll += 17;
+			}
+
+		}
+		break;
+
+	case 1:
+		m_nMaxHScroll = m_nMaxVScroll = 0;	
+		break;
+	}
+
+	m_nHScroll = m_nVScroll = 0;
+
+	SetScrollRange(SB_HORZ, 0, m_nMaxHScroll);
+	SetScrollRange(SB_VERT, 0, m_nMaxVScroll);	
+	SetScrollPos(SB_HORZ, m_nHScroll);
+	SetScrollPos(SB_VERT, m_nVScroll);
+
+}
+
+void CCameraImageView::DrawCenterLine(CDC *pDC)
+{
+	if (m_rtClientRect.Width()==0 || m_rtClientRect.Height()==0) return;
+
+	CRect rtDraw = m_rtClientRect;
+	if (m_nDrawMode==0)
+	{
+		rtDraw.right = GetWidth();
+		rtDraw.bottom = GetHeight();
+	}
+
+	rtDraw.left -= m_nHScroll;
+	rtDraw.top -= m_nVScroll;
+	rtDraw.right -= m_nHScroll;
+	rtDraw.bottom -= m_nVScroll;
+
+	CPen pen, *pPen=NULL;
+	pen.CreatePen(PS_SOLID, 2, RGB(255,0,0));
+	pDC->SelectObject(&pen);
+
+	//pDC->SelectStockObject(WHITE_PEN);
+
+	// center line
+	pDC->MoveTo( (rtDraw.Width()/2)-m_nHScroll,	0);
+	pDC->LineTo((rtDraw.Width()/2)-m_nHScroll,	rtDraw.Height());
+	pDC->MoveTo(0,					(rtDraw.Height()/2)-m_nVScroll);
+	pDC->LineTo(rtDraw.Width(),		(rtDraw.Height()/2)-m_nVScroll);
+}
+
+void CCameraImageView::DrawRuler(CDC *pDC)
+{
+	if (m_dRulerGab==0.0) return;
+
+	if (m_rtClientRect.Width()==0 || m_rtClientRect.Height()==0) return;
+
+	CRect rtDraw = m_rtClientRect;
+	if (m_nDrawMode==0)
+	{
+		rtDraw.right = GetWidth();
+		rtDraw.bottom = GetHeight();
+	}
+
+	rtDraw.left -= m_nHScroll;
+	rtDraw.top -= m_nVScroll;
+	rtDraw.right -= m_nHScroll;
+	rtDraw.bottom -= m_nVScroll;
+
+	pDC->SelectStockObject(WHITE_PEN);
+
+	CFont font;
+	VERIFY(font.CreateFont(
+		10,                        // nHeight
+		5,                         // nWidth
+		0,                         // nEscapement
+		0,                         // nOrientation
+		FW_NORMAL,                 // nWeight
+		FALSE,                     // bItalic
+		FALSE,                     // bUnderline
+		0,                         // cStrikeOut
+		ANSI_CHARSET,              // nCharSet
+		OUT_DEFAULT_PRECIS,        // nOutPrecision
+		CLIP_DEFAULT_PRECIS,       // nClipPrecision
+		DEFAULT_QUALITY,           // nQuality
+		DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
+		_T("Arial")));                 // lpszFacename
+
+	// Do something with the font just created...
+	CFont* def_font = pDC->SelectObject(&font);
+	pDC->SetTextColor(RGB(255,255,255));
+	pDC->SetBkMode(TRANSPARENT);
+
+	// ruler 
+	double dResX = m_dResolution / m_dWidthScale;
+	double dResY = m_dResolution / m_dHeightScale;
+	double dGabX = m_dRulerGab / dResX; // um
+	double dGabY = m_dRulerGab / dResY; // um
+
+	if (dGabX<=0.0 || dGabY<=0.0) return;
+
+	double dWidth = GetScaleWidth();
+	double dHeight = GetScaleHeight();
+
+	double dCenterX = rtDraw.Width()/2;
+	double dCenterY = rtDraw.Height()/2;
+
+	// x direction
+	CString strValue = _T("");
+	strValue.Format(_T("%.1lf um"), m_dRulerGab);
+	pDC->TextOut(-m_nHScroll+5, rtDraw.Height()/2-m_nVScroll+5, strValue);
+	for (double dPos=dCenterX; dPos>=0.0; dPos-=dGabX)
+	{
+		pDC->MoveTo((int)(dPos+0.5)-m_nHScroll, -m_nVScroll);
+		pDC->LineTo((int)(dPos+0.5)-m_nHScroll, -m_nVScroll+6);
+	}
+	for (double dPos=dCenterX+dGabX; dPos<dWidth; dPos+=dGabX)
+	{
+		pDC->MoveTo((int)(dPos+0.5)-m_nHScroll, -m_nVScroll);
+		pDC->LineTo((int)(dPos+0.5)-m_nHScroll, -m_nVScroll+6);
+	}
+
+	// y direction
+	strValue.Format(_T("%.1lf um"), m_dRulerGab);
+	pDC->TextOut(rtDraw.Width()/2-m_nHScroll+5, 5-m_nVScroll, strValue);
+	for (double dPos=dCenterY; dPos>0.0; dPos-=dGabY)
+	{
+		pDC->MoveTo(-m_nHScroll, (int)(dPos+0.5)-m_nVScroll);
+		pDC->LineTo(-m_nHScroll+6, (int)(dPos+0.5)-m_nVScroll);
+	}
+	for (double dPos=dCenterY+dGabY; dPos<dHeight; dPos+=dGabY)
+	{
+		pDC->MoveTo(-m_nHScroll, (int)(dPos+0.5)-m_nVScroll);
+		pDC->LineTo(-m_nHScroll+6, (int)(dPos+0.5)-m_nVScroll);
+	}
+}
+
+BOOL CCameraImageView::SetViewImage(CCHImageData* pImageData)
+{
+	if (pImageData==NULL) return FALSE;
+
+	if (!pImageData->GetImageExist()) return FALSE;
+
+	EnterCriticalSection(&m_csImageData);
+
+	this->CopyImageFrom(pImageData);
+
+	LeaveCriticalSection(&m_csImageData);
+
+	this->Invalidate(TRUE);
+
+	return TRUE;
+}
+
+BOOL CCameraImageView::SetOriginImage(CCHImageData* pImageData)
+{
+	if (pImageData==NULL) return FALSE;
+
+	if (!pImageData->GetImageExist()) return FALSE;
+
+	EnterCriticalSection(&m_csImageData);
+
+	m_OriginImage.CopyImageFrom(pImageData);
+
+	m_OriginImage.GetBandImage(m_nViewBand, this);
+
+	LeaveCriticalSection(&m_csImageData);
+
+	this->Invalidate(TRUE);
+
+	return TRUE;
+}
+
+BOOL CCameraImageView::SetOriginImage(int nWidth, int nHeight, int nChannels, int nWidthStep, const BYTE* pBuffer)
+{
+	if (nWidth<0 || nHeight<0 || nChannels<0 || pBuffer==NULL) return FALSE;
+
+	EnterCriticalSection(&m_csImageData);
+
+	if (nWidth!=m_OriginImage.GetWidth() || nHeight!=m_OriginImage.GetHeight() || nChannels!=m_OriginImage.GetChannels())
+	{
+		if (m_OriginImage.CreateImage(nWidth, nHeight, 8, nChannels)==FALSE) 
+		{
+			LeaveCriticalSection(&m_csImageData);
+			return FALSE;
+		}
+	}
+
+	memcpy(m_OriginImage.GetImageBuffer(), pBuffer, nWidthStep*nHeight);
+
+	if (nChannels==1) m_nViewBand = BandTypeGray;
+
+	BOOL bResult = m_OriginImage.GetBandImage(m_nViewBand, this);
+
+	LeaveCriticalSection(&m_csImageData);
+
+	return bResult;
+}
+
+
+BOOL CCameraImageView::GetViewImage(CCHImageData* pImageData)
+{
+	if (pImageData==NULL) return FALSE;
+
+	EnterCriticalSection(&m_csImageData);
+	
+	BOOL bReturn = this->CopyImageTo(pImageData);
+
+	LeaveCriticalSection(&m_csImageData);
+
+	return bReturn;
+}
+
+BOOL CCameraImageView::GetOriginImage(CCHImageData* pImageData)
+{
+	if (pImageData==NULL) return FALSE;
+
+	EnterCriticalSection(&m_csImageData);
+
+	BOOL bReturn = m_OriginImage.CopyImageTo(pImageData);
+
+	LeaveCriticalSection(&m_csImageData);
+
+	return TRUE;
+}
+
+void  CCameraImageView::DrawViewName(CDC *pDC)
+{
+	CFont font;
+	VERIFY(font.CreateFont(
+		20,                        // nHeight
+		10,                         // nWidth
+		0,                         // nEscapement
+		0,                         // nOrientation
+		FW_NORMAL,                 // nWeight
+		FALSE,                     // bItalic
+		FALSE,                     // bUnderline
+		0,                         // cStrikeOut
+		ANSI_CHARSET,              // nCharSet
+		OUT_DEFAULT_PRECIS,        // nOutPrecision
+		CLIP_DEFAULT_PRECIS,       // nClipPrecision
+		DEFAULT_QUALITY,           // nQuality
+		DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
+		_T("Arial")));                 // lpszFacename
+
+	// Do something with the font just created...
+	CFont* def_font = pDC->SelectObject(&font);
+	pDC->SetTextColor(RGB(255,255,255));
+	pDC->SetBkMode(TRANSPARENT);
+
+	int nStrLength = (m_strViewName.GetLength() * 10);
+
+	pDC->TextOut(m_rtClientRect.Width() - nStrLength - 30, 5, m_strViewName);
+	pDC->SelectObject(def_font);
+}
+
+int	CCameraImageView::GetScaleWidth()
+{
+	CRect rect;
+	int nWidth = GetWidth();
+
+	switch(m_nDrawMode)
+	{
+	case 0:
+		m_dWidthScale = 1.0;
+		return nWidth;
+
+	case 1:
+		GetClientRect(rect);
+		if (nWidth!=0)
+			m_dWidthScale = double(rect.Width()) / double(nWidth);
+		return int(double(nWidth) * m_dWidthScale + 0.5);
+	}
+
+	return 0;
+}
+
+int	CCameraImageView::GetScaleHeight()
+{ 
+	CRect rect;
+	int nHeight = GetHeight();
+
+	switch(m_nDrawMode)
+	{
+	case 0:
+		m_dHeightScale = 1.0;
+		return nHeight;
+
+	case 1:
+		GetClientRect(rect);
+		if (nHeight!=0)
+			m_dHeightScale = double(rect.Height()) / double(nHeight);
+		return int(double(nHeight) * m_dHeightScale + 0.5);
+	}
+
+	return 0;
+}
+
+int	CCameraImageView::GetHScrollPos(void)
+{ 
+	return m_nHScroll; 
+}
+
+int	CCameraImageView::GetVScrollPos(void)	
+{ 
+	return m_nVScroll; 
+}
+
+void CCameraImageView::SetViewName(const CString strViewName)
+{ 
+	m_strViewName = strViewName; 
+}
+
+void CCameraImageView::SetParentWnd(CWnd* pParentWnd)			
+{ 
+	m_pParentWnd = pParentWnd; 
+}
+
+BOOL CCameraImageView::LoadImage(const CString& strFilename)
+{
+	if (!CCHImageData::LoadImage(strFilename)) 
+	{
+		m_nHScroll = m_nVScroll = 0;
+		m_nMaxHScroll = m_nMaxVScroll = 0;
+		SetScrollRange(SB_HORZ, 0, m_nMaxHScroll);
+		SetScrollRange(SB_VERT, 0, m_nMaxVScroll);
+		SetScrollPos(SB_HORZ, m_nHScroll);
+		SetScrollPos(SB_VERT, m_nVScroll);
+		return FALSE;
+	}
+
+	SetDrawMode(m_nDrawMode);
+
+	return TRUE;
+}
+
+void CCameraImageView::OnDestroy()
+{
+	__super::OnDestroy();
+}
+
+void CCameraImageView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
+{
+	// TODO: �뿬湲곗뿉 硫붿떆吏� 泥섎━湲� 肄붾뱶瑜� 異붽� 諛�/�삉�뒗 湲곕낯媛믪쓣 �샇異쒗빀�땲�떎.
+	switch (nSBCode)
+	{
+	case SB_LEFT:      // Scroll to far left.
+		break;
+	case SB_RIGHT:      // Scroll to far right.
+		break;
+	case SB_ENDSCROLL:   // End scroll.
+		break;
+	case SB_LINELEFT:      // Scroll left.
+		if (m_nHScroll > 0)
+			m_nHScroll--;
+		break;
+	case SB_LINERIGHT:   // Scroll right.
+		if (m_nHScroll < m_nMaxHScroll)
+			m_nHScroll++;
+		break;
+	case SB_PAGELEFT:    // Scroll one page left.
+		if (5 < m_nMaxHScroll / 256)
+			m_nHScroll -= 20;//m_nHScroll -= 5;
+		else
+			m_nHScroll -= 10;//m_nHScroll -= m_nMaxHScroll / 256;
+
+		if (m_nHScroll < 0)
+			m_nHScroll = 0;
+		break;
+	case SB_PAGERIGHT:      // Scroll one page right.
+		if (5 < m_nMaxHScroll / 256)
+			m_nHScroll += 20;//m_nHScroll += 5;
+		else
+			m_nHScroll += 10;//m_nHScroll += m_nMaxHScroll / 256;
+
+		if (m_nHScroll > m_nMaxHScroll)
+			m_nHScroll = m_nMaxHScroll;
+		break;
+	case SB_THUMBPOSITION: // Scroll to absolute position. nPos is the position
+		break;
+	case SB_THUMBTRACK:   // Drag scroll box to specified position. nPos is the
+		m_nHScroll = nPos;
+		break;
+	}
+
+	// Set the new position of the thumb (scroll box).
+	SetScrollPos(SB_HORZ, m_nHScroll);
+
+	Invalidate(FALSE);
+
+	__super::OnHScroll(nSBCode, nPos, pScrollBar);
+}
+
+void CCameraImageView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
+{
+	// TODO: �뿬湲곗뿉 硫붿떆吏� 泥섎━湲� 肄붾뱶瑜� 異붽� 諛�/�삉�뒗 湲곕낯媛믪쓣 �샇異쒗빀�땲�떎.
+	switch (nSBCode)
+	{
+	case SB_BOTTOM:			// Scroll to bottom. 
+		break;
+	case SB_ENDSCROLL:		// End scroll.
+		break;
+	case SB_LINEDOWN:		// Scroll one line down.
+		if (m_nVScroll < m_nMaxVScroll)
+			m_nVScroll++;
+		break;
+	case SB_LINEUP:			// Scroll one line up. 
+		if (m_nVScroll > 0)
+			m_nVScroll--;
+		break;
+	case SB_PAGEDOWN:		// Scroll one page down. 
+		if (5 < m_nMaxVScroll / 256)
+			m_nVScroll += 20;//m_nVScroll += 5;
+		else
+			m_nVScroll += 10;//m_nVScroll += (m_nMaxVScroll / 256);
+
+		if (m_nVScroll > m_nMaxVScroll)
+			m_nVScroll = m_nMaxVScroll;
+		break;
+	case SB_PAGEUP:			// Scroll one page up.
+		if (5 < m_nMaxVScroll / 256)
+			m_nVScroll -= 20;//m_nVScroll -= 5;
+		else
+			m_nVScroll -= 10;//m_nVScroll -= (m_nMaxVScroll / 256);
+
+		if (m_nVScroll < 0)
+			m_nVScroll = 0;
+		break;
+	case SB_THUMBPOSITION:	// Scroll to the absolute position. The current position is provided in nPos. 
+		break;
+	case SB_THUMBTRACK:		// Drag scroll box to specified position. The current position is provided in nPos. 
+		m_nVScroll = nPos;
+		break;
+	case SB_TOP:			// Scroll to top. 
+		break;
+	}
+
+	// Set the new position of the thumb (scroll box).
+	SetScrollPos(SB_VERT, m_nVScroll);
+
+	Invalidate(FALSE);
+
+	__super::OnVScroll(nSBCode, nPos, pScrollBar);
+}
+
+
+void CCameraImageView::OnLoadImage()
+{
+	//CString szFilter = _T("All Files(*.*)|*.*||");
+	CString szFilter = _T("BMP(*.bmp)|*.bmp| JPG(*.jpg)|*.jpg| All Files(*.*)|*.*||");
+
+	CString strPath;
+	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter);
+	dlg.m_ofn.lpstrTitle = _T("Load Image");
+
+	if(dlg.DoModal() == IDOK)
+	{
+		if (m_OriginImage.LoadImage(dlg.GetPathName()))
+		{
+			if (m_nViewBand==4)
+			{
+				m_OriginImage.CopyImageTo(this);
+			}
+			else
+			{
+				m_OriginImage.GetBandImage(m_nViewBand, this);
+			}
+
+			Invalidate(TRUE);
+		}
+	}
+}
+
+void CCameraImageView::OnSaveImage()
+{
+	CString szFilter = _T("BMP(*.bmp)|*.bmp| JPG(*.jpg)|*.jpg| All Files(*.*)|*.*||");
+
+	CString strPath;
+	CFileDialog dlg(FALSE, szFilter, NULL, OFN_HIDEREADONLY, szFilter);
+	dlg.m_ofn.lpstrTitle = _T("Save Image");
+
+	if(dlg.DoModal() == IDOK)
+	{
+		if (SaveImage(dlg.GetPathName()))
+		{
+
+		}
+	}
+}
+
+void CCameraImageView::OnCenterLine()
+{
+	m_bDrawCenterLine = !m_bDrawCenterLine;
+	Invalidate(TRUE);
+}
+
+void CCameraImageView::OnRuler()
+{
+	m_bDrawRuler = !m_bDrawRuler;
+	Invalidate(TRUE);
+}
+
+void CCameraImageView::OnViewOrigin()
+{
+	m_nDrawMode = 0;
+
+	SetDrawMode(m_nDrawMode);
+	Invalidate(TRUE);
+}
+
+void CCameraImageView::OnViewFit()
+{
+	m_nDrawMode = 1;
+
+	SetDrawMode(m_nDrawMode);
+	Invalidate(TRUE);
+}
+
+void CCameraImageView::OnViewColor()
+{
+	if (m_OriginImage.GetChannels()==1)
+	{
+		m_nViewBand = BandTypeGray;
+		return;
+	}
+
+	if (m_nViewBand == BandTypeColor) return;
+
+	if (m_OriginImage.CopyImageTo(this))
+	{
+		m_nViewBand = BandTypeColor;
+		Invalidate(TRUE);
+	}
+}
+
+void CCameraImageView::OnViewGray()
+{
+	if (m_nViewBand == BandTypeGray) return;
+
+	if (m_OriginImage.GetBandImage(BandTypeGray, this))
+	{
+		m_nViewBand = BandTypeGray;
+		Invalidate(TRUE);
+	}
+}
+
+void CCameraImageView::OnViewRed()
+{
+	if (m_OriginImage.GetChannels()==1)
+	{
+		m_nViewBand = BandTypeGray;
+		return;
+	}
+
+	if (m_nViewBand == BandTypeRed) return;
+
+	if (m_OriginImage.GetBandImage(BandTypeRed, this))
+	{
+		m_nViewBand = BandTypeRed;
+		Invalidate(TRUE);
+	}
+}
+
+void CCameraImageView::OnViewGreen()
+{
+	if (m_OriginImage.GetChannels()==1)
+	{
+		m_nViewBand = BandTypeGray;
+		return;
+	}
+
+	if (m_nViewBand == BandTypeGreen) return;
+
+	if (m_OriginImage.GetBandImage(BandTypeGreen, this))
+	{
+		m_nViewBand = BandTypeGreen;
+		Invalidate(TRUE);
+	}
+}
+
+void CCameraImageView::OnViewBlue()
+{
+	if (m_OriginImage.GetChannels()==1)
+	{
+		m_nViewBand = BandTypeGray;
+		return;
+	}
+
+	if (m_nViewBand == BandTypeBlue) return;
+
+	if (m_OriginImage.GetBandImage(BandTypeBlue, this))
+	{
+		m_nViewBand = BandTypeBlue;
+		Invalidate(TRUE);
+	}
+}
+
+void CCameraImageView::SetResolution(double dRes)
+{
+	if (dRes<0.0) return;
+
+	m_dResolution = dRes;
+}
+
+void CCameraImageView::SetRulerGab(double dGab)
+{
+	if (dGab<0.0) return;
+
+	m_dRulerGab = dGab;
+}
+

--
Gitblit v1.9.3