// DlgReflowMasterImage.cpp : 구현 파일입니다. // #include "stdafx.h" #include "ReviewRecipeEditor.h" #include "DlgReflowMasterImage.h" #include "afxdialogex.h" // CDlgReflowMasterImage 대화 상자입니다. #include "CHImageControls/CHImageView.h" #include "CHImageControls/CHImageProcess.h" #include "DlgCommon.h" IMPLEMENT_DYNAMIC(CDlgReflowMasterImage, CDialogEx) CDlgReflowMasterImage::CDlgReflowMasterImage(CWnd* pParent /*=NULL*/) : CDialogEx(CDlgReflowMasterImage::IDD, pParent) { m_ImageBuffer = NULL; m_bImagecheck = false; m_damCount = 0; } CDlgReflowMasterImage::~CDlgReflowMasterImage() { } void CDlgReflowMasterImage::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CDlgReflowMasterImage, CDialogEx) ON_WM_PAINT() ON_WM_SIZE() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() BOOL CDlgReflowMasterImage::OnInitDialog() { m_damCount = 0; m_nHScrollPos = 0; m_nVScrollPos = 0; return TRUE; } void CDlgReflowMasterImage::OnPaint() { CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다. CDialogEx::OnPaint(); CDC *pDC = GetDC(); //CRect rect; //GetClientRect(rect); CDC MemDC; MemDC.CreateCompatibleDC(pDC); CBitmap bmpOffScreen; bmpOffScreen.CreateCompatibleBitmap(pDC, m_RectDialog.Width(), m_RectDialog.Height()); CBitmap *oldBitmap; oldBitmap = MemDC.SelectObject(&bmpOffScreen); //pDC->SelectObject(&bmpOffScreen); //MemDC.BitBlt(0, 0, m_RectDialog.Width(), m_RectDialog.Height(), pDC, 0, 0, SRCCOPY); // Draw image if a source bitmap is currently loaded if ( !m_Image.IsNull() ) { //image.Draw(pDC->m_hDC, -m_nHScrollPos, -m_nVScrollPos); //m_Image.Draw(MemDC.m_hDC, -m_nHScrollPos, -m_nVScrollPos); m_Image.Draw(MemDC.m_hDC, 0, 0); } CRect *rtWindow = new CRect; CString strCount; GetWindowRect(rtWindow); ScreenToClient(rtWindow); CPen pen3, pen4; pen3.CreatePen( PS_SOLID, 5, RGB(0,0,255) ); // 파란색 펜 생성 pen4.CreatePen( PS_SOLID, 5, RGB(255,0,0) ); // 붉은색 펜 생성 CPen* oldPen2; if(m_Image.GetWidth() > m_Image.GetHeight()) { for(int i = 0; i < 4; i++) { strCount.Format(_T("%d"), i); if(i == (m_damCount + 3) % 4) { oldPen2 = MemDC.SelectObject( &pen3 ); } else { oldPen2 = MemDC.SelectObject( &pen4 ); } MemDC.MoveTo(m_damPoint[i].x - m_nHScrollPos, rtWindow->top - m_nVScrollPos); MemDC.LineTo(m_damPoint[i].x - m_nHScrollPos, rtWindow->bottom - m_nVScrollPos); MemDC.SelectObject( oldPen2 ); MemDC.TextOut(m_damPoint[i].x - m_nHScrollPos, (rtWindow->top + rtWindow->bottom) / 2, strCount); } } else { for(int i = 0; i < 4; i++) { strCount.Format(_T("%d"), i); if(i == (m_damCount + 3) % 4) { oldPen2 = MemDC.SelectObject( &pen3 ); } else { oldPen2 = MemDC.SelectObject( &pen4 ); } MemDC.MoveTo(rtWindow->left - m_nHScrollPos, m_damPoint[i].y - m_nVScrollPos); MemDC.LineTo(rtWindow->right - m_nHScrollPos, m_damPoint[i].y - m_nVScrollPos); MemDC.SelectObject( oldPen2 ); MemDC.TextOut((rtWindow->left + rtWindow->right) / 2, m_damPoint[i].y - m_nVScrollPos, strCount); } } delete rtWindow; pDC->BitBlt(0, 0, m_RectDialog.Width(), m_RectDialog.Height(), &MemDC, 0, 0, SRCCOPY); MemDC.SelectObject( oldBitmap ); //pDC->DeleteDC(); MemDC.DeleteDC(); } int CDlgReflowMasterImage::ImageGetWidth() { int retVal = m_Image.GetWidth(); if (retVal < 0) retVal = 0; return retVal; } int CDlgReflowMasterImage::ImageGetHeight() { int retVal = m_Image.GetHeight(); if (retVal < 0) retVal = 0; return retVal; } int CDlgReflowMasterImage::ImageGetBPP() { return 0; } int CDlgReflowMasterImage::LoadImage(CString sFileName) { // Detaches the bitmap from the CImage object and destroys the bitmap if image already loaded if ( !m_Image.IsNull() ) m_Image.Destroy(); memset(m_nBoe_line, 0, 6 * sizeof(int)); m_ROIRect = CRect(0, 0, 0, 0); if(m_ImageBuffer != NULL) { delete m_ImageBuffer; m_ImageBuffer = NULL; m_bImagecheck = false; } //m_ImageBuffer.DeleteBuffer(); if(m_Image.Load(sFileName)) { // m_ImageBuffer.SetSize(0, 0); return -1; } int width = m_Image.GetWidth(); int height = m_Image.GetHeight(); int channel = m_Image.GetBPP() >> 3; m_ImageBuffer = new BYTE[width * height * channel]; memset(m_ImageBuffer, 0, sizeof(BYTE) * width * height * channel); BYTE* temp; //COLORREF rgb; for(int y = 0 ; y < height; y++) { temp = (BYTE*)m_Image.GetPixelAddress(0, y); memcpy((m_ImageBuffer+y*width*channel), (temp), sizeof(BYTE) * width * channel); } m_bImagecheck = true; m_ImagePath = sFileName; return 0; } void CDlgReflowMasterImage::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); CSize sMonitor, sWindow; sMonitor.cx = ::GetSystemMetrics(SM_CXFULLSCREEN); sMonitor.cy = ::GetSystemMetrics(SM_CYFULLSCREEN); if(m_Image.GetWidth() > sMonitor.cx * 0.9) sWindow.cx = min(m_Image.GetWidth() / 2, sMonitor.cx * 0.9); else sWindow.cx = m_Image.GetWidth(); if(m_Image.GetHeight() > sMonitor.cy * 0.9) sWindow.cy = min(m_Image.GetHeight() / 2, sMonitor.cy * 0.9); else sWindow.cy = m_Image.GetHeight() + 50; if(m_bImagecheck) { //this->SetWindowPos(NULL, 0, 0, m_ImageBuffer.m_nImageWidth/2, m_ImageBuffer.m_nImageHeight/2, SWP_NOZORDER //this->SetWindowPos(NULL, 0, 0, image.GetWidth()/2, image.GetHeight()/2, SWP_NOZORDER); this->SetWindowPos(NULL, 0, 0, sWindow.cx, sWindow.cy, SWP_NOZORDER); HWND hwnd = GetParent()->GetSafeHwnd(); //::SendMessage(hwnd, WM_LOADIMAGE_EVENT, m_ImageBuffer.m_nImageWidth, m_ImageBuffer.m_nImageHeight); ::SendMessage(hwnd, WM_LOADIMAGE_EVENT, m_Image.GetWidth(), m_Image.GetHeight()); m_bImagecheck = false; } this->GetWindowRect(m_RectDialog); m_nViewWidth = m_RectDialog.Width() + GetSystemMetrics(SM_CXHSCROLL); m_nViewHeight = m_RectDialog.Height() + GetSystemMetrics(SM_CXVSCROLL); int HScrollMax = 0; m_nHPageSize = 0; if(cx < m_nViewWidth) { m_nHPageSize = m_Image.GetWidth() / 10 + 0.5; HScrollMax = m_Image.GetWidth() - m_nViewWidth + m_nHPageSize; m_nHScrollPos = min(m_nHScrollPos,m_nViewWidth - 1); } SCROLLINFO si; si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; si.nMin = 0; si.nMax = HScrollMax; si.nPos = m_nHScrollPos; si.nPage = m_nHPageSize; SetScrollInfo(SB_HORZ, &si, TRUE); int VScrollMax = 0; m_nVPageSize = 0; if( cy < m_nViewHeight) { m_nVPageSize = m_Image.GetHeight() / 10 + 0.5; VScrollMax = m_Image.GetHeight() - m_nViewHeight + m_nVPageSize; m_nVScrollPos = min(m_nVScrollPos,m_nViewHeight - 1); } si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; si.nMin = 0; si.nMax = VScrollMax; si.nPos = m_nVScrollPos; si.nPage = m_nVPageSize; SetScrollInfo(SB_VERT,&si,TRUE); Invalidate(true); } void CDlgReflowMasterImage::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다. m_damPoint[(m_damCount % 4)] = CPoint(m_nHScrollPos + point.x, m_nVScrollPos + point.y); m_damCount++; Invalidate(FALSE); if(m_damCount >= 4) { m_DlgCommon->OnSetMaster(TRUE, m_nDir, m_damPoint); } CDialogEx::OnLButtonDown(nFlags, point); }