SDC C-Project CF Review 프로그램
LYW
2021-09-14 ffe71aadfdcb4a9ea2ac4d8d320983d42ef3cad5
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;
}