SDC C-Project CF Review 프로그램
LYW
2021-07-08 9cbd9e554f9956b3b945b51602f1d4a3fa0353e1
ReviewHistory/ReveiwHistory/akImageView.cpp
»õ ÆÄÀÏ
@@ -0,0 +1,497 @@
#include "stdafx.h"
#include "akImageView.h"
#include "akGraph/akGraphUtil.h"
CakImageView::CakImageView()
{
   SetReverseModeY(true);
   {
      CakGraphBase::setAK();
      m_AxisX.m_Size = 80;
      m_AxisX.m_TickGabStep = 1;
      m_AxisX.m_MinorTickNum = 4;
      m_AxisY.m_MinorTickNum = 4;
      //m_AxisX.m_TickGabPixel = 30;
      //m_AxisX.m_FontTick.DeleteObject();
      //m_AxisX.m_FontTick.CreatePointFont(120, _T("Tahoma"));
      //m_AxisX.SetRotateFont(&m_AxisX.m_FontTick, 270);
      m_AxisY.SetRotateFont(&m_AxisY.m_FontTick, 90);
      m_AxisY2.SetRotateFont(&m_AxisY2.m_FontTick, 270);
      SetClossLine(false);
      SetDragStyle(DS_All_HOR);
      m_bGrid = false;
      m_AxisY.m_TickGabPixel = 70;
      m_AxisX.m_Size = 20;
      m_AxisY.m_Size = 20;
      m_AxisY2.m_Size = 20;
      m_Title.m_Size = 20;
      m_AxisX.m_strTitle = "";
      m_AxisY.m_strTitle = "";
      m_Title.m_strTitle = "  ";
      m_MouseMoveInfo.m_nType = 0;
   }
}
CakImageView::~CakImageView()
{
}
void CakImageView::RenderSeries(Graphics* grfx, CDC* pDC)
{
   RenderImage(grfx, pDC);
}
void CakImageView::SetAutoScale()
{
   CakGraphBasic3::SetAutoScale();
   if (1)//글라스 í¬ê¸° ë° ê·¸ë¦¬ê¸° ë°©í–¥ ê²°ì • íƒœí˜„[2016/3/23]
   {
      double nGlassSizeX = 2400;
      double nGlassSizeY = 2048;
      if (!m_vecImageData.empty())
      {
         nGlassSizeX = m_vecImageData[0]->m_Bits.bmWidth;
         nGlassSizeY = m_vecImageData[0]->m_Bits.bmHeight;
      }
      double dWindowRate = (double)m_rectData.Width() / (double)m_rectData.Height();
      double dValueRate = (double)nGlassSizeX / (double)nGlassSizeY;
      if (dWindowRate < dValueRate)//가로풀 ê¸°ì¤€ íƒœí˜„[2016/3/25]
      {
         m_AxisX.m_RangeValueMin = 0;
         m_AxisX.m_RangeValueMax = nGlassSizeX;
         m_AxisY.m_RangeValueMin = 0;
         m_AxisY.m_RangeValueMax = (float)nGlassSizeX*((float)m_rectData.Height() / (float)m_rectData.Width());
         m_AxisY.SetRangePos(nGlassSizeY / 2);
      }
      else //세로풀기준 íƒœí˜„[2016/3/25]
      {
         m_AxisX.m_RangeValueMin = 0;
         m_AxisX.m_RangeValueMax = (float)nGlassSizeY*((float)m_rectData.Width() / (float)m_rectData.Height());
         m_AxisY.m_RangeValueMin = 0;
         m_AxisY.m_RangeValueMax = nGlassSizeY;
         m_AxisX.SetRangePos(nGlassSizeX / 2);
      }
      //0,0이 ì¤‘앙에 ì˜¤ë„록 [김태현2021/2/16]
      m_AxisX.SetRangePos(0);
      m_AxisY.SetRangePos(0);
   }
}
void CakImageView::SetResize()
{
   double dPosOldX = m_AxisX.m_RangeValueMin + m_AxisX.GetRangeValue() / 2.0;
   double dPosOldY = m_AxisY.m_RangeValueMin + m_AxisY.GetRangeValue() / 2.0;
   CakGraphBasic3::SetAutoScale();
   if (1)//글라스 í¬ê¸° ë° ê·¸ë¦¬ê¸° ë°©í–¥ ê²°ì • íƒœí˜„[2016/3/23]
   {
      double nGlassSizeX = 2400;
      double nGlassSizeY = 2048;
      if (!m_vecImageData.empty())
      {
         nGlassSizeX = m_vecImageData[0]->m_Bits.bmWidth;
         nGlassSizeY = m_vecImageData[0]->m_Bits.bmHeight;
      }
      double dWindowRate = (double)m_rectData.Width() / (double)m_rectData.Height();
      double dValueRate = (double)nGlassSizeX / (double)nGlassSizeY;
      //double dPosOldX = m_AxisX.m_RangeValueMin + m_AxisX.GetRangeValue() / 2.0;
      //double dPosOldY = m_AxisY.m_RangeValueMin + m_AxisY.GetRangeValue() / 2.0;
      if (dWindowRate < dValueRate)//가로풀 ê¸°ì¤€ íƒœí˜„[2016/3/25]
      {
         m_AxisX.m_RangeValueMin = 0;
         m_AxisX.m_RangeValueMax = nGlassSizeX;
         m_AxisY.m_RangeValueMin = 0;
         m_AxisY.m_RangeValueMax = (float)nGlassSizeX*((float)m_rectData.Height() / (float)m_rectData.Width());
         m_AxisY.SetRangePos(nGlassSizeY / 2);
      }
      else //세로풀기준 íƒœí˜„[2016/3/25]
      {
         m_AxisX.m_RangeValueMin = 0;
         m_AxisX.m_RangeValueMax = (float)nGlassSizeY*((float)m_rectData.Width() / (float)m_rectData.Height());
         m_AxisY.m_RangeValueMin = 0;
         m_AxisY.m_RangeValueMax = nGlassSizeY;
         m_AxisX.SetRangePos(nGlassSizeX / 2);
      }
      m_AxisX.SetRangePos(dPosOldX);
      m_AxisY.SetRangePos(dPosOldY);
   }
}
void CakImageView::RenderImage(Graphics* grfx, CDC* pDC)
{
   if (m_vecImageData.empty()) return;
   //pDC->SetStretchBltMode(HALFTONE); //<-- ìµœëŒ€ í™•대시 ê·¸ë¦¬ëŠ” ì‹œê°„ ê³¼ë‹¤ ì†Œìš”
   pDC->SetStretchBltMode(COLORONCOLOR);// <--최대 í™•대시 ì´ë¯¸ì§€ í‘œì‹œ ì•ˆë¨
   CRgn rgn;
   rgn.CreateRectRgnIndirect(CakRectToCRect(m_rectData));
   pDC->SelectClipRgn(&rgn);
   CBitmap* pOldBitmap;
   CDC BitmapDC;
   BitmapDC.CreateCompatibleDC(pDC);
   _DataImage2* pImageData;
   double dAlignX, dAlignY;
   for (int i = 0; i < m_vecImageData.size(); i++)
   {
      dAlignX = dAlignY = 0;
      int x1, x2, y1, y2;
      pImageData = m_vecImageData[i];
      x1 = pImageData->m_nDrawPosX-dAlignX;
      y1 = pImageData->m_nDrawPosY-dAlignY;
      x2 = pImageData->m_nDrawPosX + pImageData->m_Bits.bmWidth;
      y2 = pImageData->m_nDrawPosY + pImageData->m_Bits.bmHeight;
      CakRect rectImage(x1, y1, x2, y2);
      CakRect rectOutRangeTemp, rectOutRange;
      rectOutRangeTemp.left = m_AxisX.m_RangeValueMin;
      rectOutRangeTemp.right = ceil(m_AxisX.m_RangeValueMax);
      rectOutRangeTemp.top = m_AxisY.m_RangeValueMin;
      rectOutRangeTemp.bottom = ceil(m_AxisY.m_RangeValueMax);
      if (rectOutRange.IntersectRect(&rectOutRangeTemp, &rectImage) == FALSE)
      {
         continue;
      }
      pOldBitmap = BitmapDC.SelectObject(&pImageData->m_Bitmap);
      double dOnePixelX = (double)m_rectData.Width() / m_AxisX.GetRangeValue();
      double dOnePixelY = (double)m_rectData.Height() / m_AxisY.GetRangeValue();
      if (1)//dOnePixelX > 2 && dOnePixelY > 2)
      {
         CakRect rectDraw;
         rectDraw.set(
            GetWindowPosX(rectOutRange.left),
            GetWindowPosY(rectOutRange.top),
            GetWindowPosX(rectOutRange.right),
            GetWindowPosY(rectOutRange.bottom)
         );
         CakRect rectImage;
         rectImage.set(
            rectOutRange.left - x1,
            rectOutRange.top - y1,
            rectOutRange.right - x1,
            rectOutRange.bottom - y1
         );
         if (m_bReverseY == FALSE)
         {
            AKSWAP_INT(rectDraw.top, rectDraw.bottom);
            rectImage.top = pImageData->m_Bits.bmHeight - rectOutRange.bottom + y1;
            rectImage.bottom = rectImage.top + rectOutRange.getHeight();
         }
         if (m_bReverseX == TRUE)
         {
            AKSWAP_INT(rectDraw.left, rectDraw.right);
            rectImage.left = pImageData->m_Bits.bmWidth - rectOutRange.right + x1;
            rectImage.right = rectImage.left + rectOutRange.getWidth();
         }
         pDC->StretchBlt(rectDraw.left, rectDraw.top, rectDraw.Width(), rectDraw.Height(), &BitmapDC,
            rectImage.left, rectImage.top,
            rectImage.getWidth(), rectImage.getHeight(), SRCCOPY);
      }
      else
      {
         //좌표축 ê·¸ëŒ€ë¡œ ê·¸ë¦´ë•Œ [김태현 2018/12/10]
         /*pDC->StretchBlt(GetWindowPosX(x1), GetWindowPosY(y1), GetWindowPosX(x2)-GetWindowPosX(x1),GetWindowPosY(y2)-GetWindowPosY(y1), &BitmapDC,
            0, 0,
            pImageData->m_Bits.bmWidth, pImageData->m_Bits.bmHeight, SRCCOPY);*/
         pDC->StretchBlt(GetWindowPosX(x1), GetWindowPosY(y1), GetWindowPosX(x2) - GetWindowPosX(x1), GetWindowPosY(y2) - GetWindowPosY(y1), &BitmapDC,
            0, 0,
            pImageData->m_Bits.bmWidth, pImageData->m_Bits.bmHeight, SRCCOPY);
      }
      BitmapDC.SelectObject(pOldBitmap);
      continue;
   }
   BitmapDC.DeleteDC();
   if(m_vecImageData.empty() == FALSE)
   {
      pImageData = m_vecImageData[0];
      double nGlassSizeX = pImageData->m_Bits.bmWidth;
      double nGlassSizeY = pImageData->m_Bits.bmHeight;
      CBrush BrushGlass, *pOldBrush;
      BrushGlass.CreateSolidBrush(RGB(255, 255, 255));
      CakRectd rectGlass;
      rectGlass.set(0, 0, nGlassSizeX, nGlassSizeY);
      rectGlass.MoveToXY(-nGlassSizeX / 2, -nGlassSizeY / 2);
      //글라스 ì™¸ê°ì„  ê·¸ë¦¬ê¸° íƒœí˜„[2016/3/23]
      {
         pOldBrush = (CBrush*)pDC->SelectObject(&BrushGlass);
         CPen pen;
         pen.CreatePen(PS_SOLID, 1, RGB(64, 191, 79));
         pDC->SelectObject(&pen);
         pDC->MoveTo(GetWindowPosX(rectGlass.left), GetWindowPosY(rectGlass.top));
         pDC->LineTo(GetWindowPosX(rectGlass.right), GetWindowPosY(rectGlass.top));
         pDC->LineTo(GetWindowPosX(rectGlass.right), GetWindowPosY(rectGlass.bottom));
         pDC->LineTo(GetWindowPosX(rectGlass.left), GetWindowPosY(rectGlass.bottom));
         pDC->LineTo(GetWindowPosX(rectGlass.left), GetWindowPosY(rectGlass.top));
         pDC->SelectObject(&pOldBrush);
      }
   }
   pDC->SelectClipRgn(NULL);
   //DrawROIRect(pDC);
}
void CakImageView::OnMouseInput(akMouseEvent mouseevent, CPoint point)
{
   CakGraphBasic3::OnMouseInput(mouseevent, point);
   switch (mouseevent)
   {
   case MouseMove:
   {
      break;
   }
   case MouseLeftButtonDown:
   {
      if (point.x > -1 && point.x < GetScaleWidth() &&
         point.y > -1 && point.y < GetScaleHeight())
      {
//          if (m_rectTracker.HitTest(point) < 0)
//          {
//             // just to demonstrate CRectTracker::TrackRubberBand
//             if (m_rectTracker.TrackRubberBand(this, point, TRUE))
//             {
//                Invalidate();
//             }
//          }
//          else if (m_rectTracker.Track(this, point, TRUE))
//          {
//             Invalidate();
//          }
      }
      CRect rect;
      this->GetClientRect(rect);
      point.x += m_nHScroll;
      point.y += m_nVScroll;
      /*m_pParentWnd->SendMessage(WM_LBUTTONDOWN, static_cast<WPARAM>(nFlags), MAKELPARAM(point.x, point.y));*/
   }
   break;
   case MouseLeftButtonUp:
   {
      CRect rect;
      this->GetClientRect(rect);
      point.x += m_nHScroll;
      point.y += m_nVScroll;
   /*   m_pParentWnd->SendMessage(WM_LBUTTONUP, static_cast<WPARAM>(nFlags), MAKELPARAM(point.x, point.y));*/
      if (GetTrackerRect(m_rtROIRect))
      {
         m_sROIInfo.nWidthPixel = m_rtROIRect.Width();
         m_sROIInfo.nHeightPixel = m_rtROIRect.Height();
         m_sROIInfo.dDiagonalPixel = sqrt(double(m_sROIInfo.nWidthPixel*m_sROIInfo.nWidthPixel + m_sROIInfo.nHeightPixel*m_sROIInfo.nHeightPixel));
         m_sROIInfo.dWidthRealUM = m_sROIInfo.nWidthPixel * (m_dResolution / m_dWidthScale);
         m_sROIInfo.dHeightRealUM = m_sROIInfo.nHeightPixel * (m_dResolution / m_dHeightScale);
         m_sROIInfo.dDiagonalRealUM = sqrt((m_sROIInfo.dWidthRealUM*m_sROIInfo.dWidthRealUM) + (m_sROIInfo.dHeightRealUM*m_sROIInfo.dHeightRealUM));
         Invalidate(TRUE);
      }
   }
   break;
   }
}
CakDataImage2::CakDataImage2(void)
{
}
CakDataImage2::~CakDataImage2(void)
{
}
int CakDataImage2::SetImageData(char* pFileName, int nImageIndex /*= 0*/)
{
   HBITMAP hBitmap = NULL;
   hBitmap = (HBITMAP)LoadImage(NULL, pFileName, IMAGE_BITMAP, 0, 0,
      LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
   _DataImage2* pNewImage;
   if (hBitmap)
   {
      pNewImage = new _DataImage2;
      pNewImage->m_Bitmap.Attach(hBitmap);
      pNewImage->m_Bitmap.GetBitmap(&pNewImage->m_Bits);
      pNewImage->m_pBitmapData = (unsigned char*)pNewImage->m_Bits.bmBits;
      pNewImage->m_nDrawPosX = -pNewImage->m_Bits.bmWidth / 2;
      pNewImage->m_nDrawPosY = -pNewImage->m_Bits.bmHeight / 2;
   }
   else
   {
      CImage imgJPG;
      HRESULT ret = imgJPG.Load(pFileName);
      if (ret == S_OK)
      {
         pNewImage = new _DataImage2;
         pNewImage->m_Bitmap.Attach(imgJPG.Detach());
         pNewImage->m_Bitmap.GetBitmap(&pNewImage->m_Bits);
         pNewImage->m_pBitmapData = (unsigned char*)pNewImage->m_Bits.bmBits;
         pNewImage->m_nDrawPosX = -pNewImage->m_Bits.bmWidth / 2;
         pNewImage->m_nDrawPosY = -pNewImage->m_Bits.bmHeight / 2;
      }
      else
      {
         return 0;
      }
   }
   if (m_vecImageData.size() <= nImageIndex)
   {
      m_vecImageData.push_back(pNewImage);
   }
   else
   {
      _DataImage2* pDelImage = m_vecImageData[nImageIndex];
      m_vecImageData[nImageIndex] = pNewImage;
      pDelImage->m_Bitmap.DeleteObject();
      delete pDelImage;
   }
   return 1;
}
int   CakDataImage2::GetScaleWidth()
{
   CRect rect;
   int nWidth;
   //GetClientRect(rect);
   if (nWidth != 0)
      m_dWidthScale = double(rect.Width()) / double(nWidth);
   return int(double(nWidth) * m_dWidthScale + 0.5);
}
int   CakDataImage2::GetScaleHeight()
{
   CRect rect;
   int nHeight;// = GetHeight();
   //GetClientRect(rect);
   if (nHeight != 0)
      m_dHeightScale = double(rect.Height()) / double(nHeight);
   return int(double(nHeight) * m_dHeightScale + 0.5);
}
BOOL CakDataImage2::GetTrackerRect(CRect& rtRect)
{
//    if (m_rectTracker.m_rect.Width() < 0 || m_rectTracker.m_rect.Height() < 0)
//    {
//       return FALSE;
//    }
//
//    rtRect = m_rectTracker.m_rect;
   return TRUE;
}
void CakDataImage2::DrawROIRect(CDC *pDC)
{
   if (m_rtROIRect.Width() == 0 || m_rtROIRect.Height() == 0) return;
   //    CPen pen, *pOldPen;
   //    pen.CreatePen(PS_DOT, 1, RGB(255,255,255));
   //    pOldPen = pDC->SelectObject(&pen);
   //    pDC->SelectStockObject(NULL_BRUSH);
   //
   //    pDC->Rectangle(m_rtROIRect);
   CFont font;
   VERIFY(font.CreateFont(
      15,                        // nHeight
      6,                         // 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);
   pDC->SetTextColor(RGB(255, 255, 0));
   pDC->SetBkColor(RGB(0, 0, 0));
   pDC->SetBkMode(OPAQUE);
   CString strValue = _T("");
   strValue.Format(_T("[Region] %d, %d, %d, %d"), m_rtROIRect.left, m_rtROIRect.top, m_rtROIRect.right, m_rtROIRect.bottom);
   pDC->TextOut(m_rtROIRect.right + 5, m_rtROIRect.top + 5, strValue);
   strValue.Format(_T("[Width] %d pix, %.3lf um"), m_sROIInfo.nWidthPixel, m_sROIInfo.dWidthRealUM);
   pDC->TextOut(m_rtROIRect.right + 5, m_rtROIRect.top + 25, strValue);
   strValue.Format(_T("[Height] %d pix, %.3lf um"), m_sROIInfo.nHeightPixel, m_sROIInfo.dHeightRealUM);
   pDC->TextOut(m_rtROIRect.right + 5, m_rtROIRect.top + 45, strValue);
   strValue.Format(_T("[Diagonal] %.3lf pix, %.3lf um"), m_sROIInfo.dDiagonalPixel, m_sROIInfo.dDiagonalRealUM);
   pDC->TextOut(m_rtROIRect.right + 5, m_rtROIRect.top + 65, strValue);
   strValue.Format(_T("[Resol_X] %.6lf um/pixel"), (m_dResolution / m_dWidthScale));
   pDC->TextOut(m_rtROIRect.right + 5, m_rtROIRect.top + 85, strValue);
   strValue.Format(_T("[Resol_Y] %.6lf um/pixel"), (m_dResolution / m_dHeightScale));
   pDC->TextOut(m_rtROIRect.right + 5, m_rtROIRect.top + 105, strValue);
   pDC->SelectObject(def_font);
}