From 07a62310a7480610663ffc608491cf46370d99b8 Mon Sep 17 00:00:00 2001 From: LYW <leeyeanwoo@diteam.co.kr> Date: 금, 15 10월 2021 15:26:33 +0900 Subject: [PATCH] Ongoing90 #3671 CF AOI Review 전설비 Align Matching 방법 개선 --- 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