// CameraImageView.cpp : 구현 파일입니다. // #include "stdafx.h" #include "ReviewSystem.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(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(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(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(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(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(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(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; dPosMoveTo((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; dPosMoveTo(-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; }