#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);
|
|
/*< LYW 20211018 - #3684 MOD Start >*/
|
m_dOnePixelX = m_AxisX.GetRangeValue() / (double)m_rectData.Width();
|
m_dOnePixelY = m_AxisY.GetRangeValue() / (double)m_rectData.Height();
|
/*< LYW 20211018 - #3684 MOD End >*/
|
/*< Origin Code >*/
|
//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, CenterLinePen;
|
pen.CreatePen(PS_SOLID, 1, RGB(64, 191, 79));
|
/*< LYW 20211029 - #3684 ADD Start >*/
|
CenterLinePen.CreatePen(PS_DOT, 1, RGB(255, 0, 0));
|
/*< LYW 20211029 - #3684 ADD End >*/
|
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));
|
|
/*< LYW 20211029 - #3684 ADD Start >*/
|
pDC->SelectObject(&CenterLinePen);
|
pDC->MoveTo(GetWindowPosX((rectGlass.left + rectGlass.right) / 2), GetWindowPosY(rectGlass.top));
|
pDC->LineTo(GetWindowPosX((rectGlass.left + rectGlass.right) / 2), GetWindowPosY(rectGlass.bottom));
|
pDC->MoveTo(GetWindowPosX(rectGlass.left), GetWindowPosY((rectGlass.top + rectGlass.bottom) / 2));
|
pDC->LineTo(GetWindowPosX(rectGlass.right), GetWindowPosY((rectGlass.top + rectGlass.bottom) / 2));
|
/*< LYW 20211029 - #3684 ADD End >*/
|
|
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);
|
|
/*< LYW 20211018 - #3684 ADD Start >*/
|
CPoint Center;
|
Center.x = rect.Width() / 2;
|
Center.y = rect.Height() / 2;
|
/*< LYW 20211018 - #3684 ADD End >*/
|
|
/*< LYW 20211018 - #3684 MOD Start >*/
|
point.x = (point.x - Center.x) * m_dOnePixelX;
|
point.y = (point.y - Center.y) * m_dOnePixelY;
|
/*< LYW 20211018 - #3684 MOD End >*/
|
/*< Origin Code >*/
|
GetParent()->PostMessage(UM_FORMMAP_IMAGEMOUSECLICK, static_cast<WPARAM>(0), MAKELPARAM(point.x, point.y));
|
/*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);
|
|
}
|