// DefectListDlg.cpp: 구현 파일 // #include "stdafx.h" #include "ReveiwHistory.h" #include "AlignDlg.h" #include "afxdialogex.h" #include #include // CFormtListDlg 대화 상자 IMPLEMENT_DYNAMIC(CAlignDlg, CDialog) enum { FORMLIST_POPUP_FORMALL = 15000, FORMLIST_POPUP_FORMSELECT, FORMLIST_POPUP_End }; CAlignDlg::CAlignDlg(CWnd* pParent /*=nullptr*/) : CDialog(IDD_DLG_ALIGN, pParent) { m_pDefectFormation = NULL; m_bAsending = FALSE; m_nLastSortCol = 0; m_nSelectedCol = 0; m_nSelectedRow = 0; m_nSelectedFormIdRclick = -1; } CAlignDlg::~CAlignDlg() { } void CAlignDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BOOL CAlignDlg::Create(CWnd * pParentWnd) { return CDialog::Create(IDD, pParentWnd); } BOOL CAlignDlg::PreTranslateMessage(MSG * pMsg) { if (pMsg->message == WM_KEYDOWN) { if (pMsg->wParam == VK_ESCAPE) { ShowWindow(SW_HIDE); return TRUE; } } return __super::PreTranslateMessage(pMsg); } void CAlignDlg::OnDestroy() { CDialog::OnDestroy(); } void CAlignDlg::OnShowWindow(BOOL bShow, UINT nStatus) { __super::OnShowWindow(bShow, nStatus); // TODO: 여기에 메시지 처리기 코드를 추가합니다. if (TRUE == bShow) { } } BEGIN_MESSAGE_MAP(CAlignDlg, CDialog) ON_BN_CLICKED(IDOK, &CAlignDlg::OnBnClickedOk) ON_CONTROL_RANGE(BN_CLICKED, FORMLIST_POPUP_FORMALL, FORMLIST_POPUP_End, OnPopupMenuFormList) ON_WM_SIZE() END_MESSAGE_MAP() // CFormtListDlg 메시지 처리기 void CAlignDlg::OnBnClickedOk() { // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. CDialog::OnOK(); } BOOL CAlignDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: 여기에 추가 초기화 작업을 추가합니다. m_vecStrGridDefectHeader.push_back(" "); m_vecStrGridDefectHeader.push_back("1st X Pos"); m_vecStrGridDefectHeader.push_back("1st Y Pos"); m_vecStrGridDefectHeader.push_back("2nd X Pos"); m_vecStrGridDefectHeader.push_back("2nd Y Pos"); CakGridCtrl* pGrid = &m_gridFormInfo; { std::vector* pVecHeader = &m_vecStrGridDefectHeader; CRect rectGrid; GetDlgItem(IDC_STATIC_GRID_ALIGN)->GetWindowRect(&rectGrid); ScreenToClient(&rectGrid); pGrid->Create(rectGrid, this, IDC_STATIC_GRID_ALIGN); pGrid->GetDefaultCell(TRUE, FALSE)->SetBackClr(GRID_FIX_COLOR); pGrid->GetDefaultCell(FALSE, TRUE)->SetBackClr(GRID_FIX_COLOR); pGrid->GetDefaultCell(FALSE, FALSE)->SetBackClr(GRID_COLOR); pGrid->SetFixedBkColor(GRID_FIX_COLOR); pGrid->SetGridLines(GVL_BOTH); pGrid->SetVirtualMode(TRUE); pGrid->SetCallbackFunc(NULL, 0); pGrid->AllowReorderColumn(FALSE); // implemented now only if m_bCallback pGrid->EnableDragRowMode(FALSE); pGrid->SetColumnCount((int)pVecHeader->size()); pGrid->SetDoubleBuffering(TRUE); pGrid->SetRowCount(2); pGrid->SetFixedRowCount(1); pGrid->SetFixedColumnCount(0); pGrid->SetEditable(FALSE); pGrid->EnableSelection(TRUE); pGrid->SetFixedRowSelection(TRUE); pGrid->SetHeaderSort(FALSE); // fill it up with stuff pGrid->SetEditable(TRUE); pGrid->EnableDragAndDrop(TRUE); pGrid->AutoSize(); pGrid->Invalidate(); } m_WndArrange.setParentWnd(this); m_WndArrange.addChildWnd(&m_gridFormInfo, WA_RESIZE_WIDTH | WA_RESIZE_HEIGHT); GetDlgItem(IDC_IMG_ALIGN1)->GetWindowRect(m_picture_rect); GetDlgItem(IDC_IMG_ALIGN2)->GetWindowRect(m_picture_rect2); ScreenToClient(m_picture_rect); ScreenToClient(m_picture_rect2); return TRUE; // return TRUE unless you set the focus to a control // 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다. } BOOL CAlignDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다. if (m_gridFormInfo.GetSafeHwnd() && wParam == (WPARAM)m_gridFormInfo.GetDlgCtrlID()) { *pResult = 1; GV_DISPINFO *pDispInfo = (GV_DISPINFO*)lParam; if (GVN_GETDISPINFO == pDispInfo->hdr.code) { getDispInfoDefect(pDispInfo->item.col, pDispInfo->item.row, &pDispInfo->item.strText); return TRUE; } else if (NM_CLICK == pDispInfo->hdr.code) { if (pDispInfo->item.row == 0) { SortListDefect(pDispInfo->item.col); m_gridFormInfo.Refresh(); } else if (pDispInfo->item.row > 0) { if (pDispInfo->item.row <= m_vecSortForm.size()) { int nFormID = m_vecSortForm[pDispInfo->item.row - 1]->m_nFormLabel; GetParent()->PostMessage(UM_FORMLIST_FORMSELECT, nFormID); } } m_nSelectedCol = pDispInfo->item.col; } else if (NM_RCLICK == pDispInfo->hdr.code) { if (pDispInfo->item.row>0 && pDispInfo->item.row <= m_vecSortForm.size()) { m_nSelectedFormIdRclick = m_vecSortForm[pDispInfo->item.row - 1]->m_nFormLabel; } else if (pDispInfo->item.row == 0) { m_nSelectedFormIdRclick = -1; } else { m_nSelectedFormIdRclick = -1; } // { // CString strText; // CMenu menu; // VERIFY(menu.CreatePopupMenu()); // // menu.AppendMenu(MF_STRING, FORMLIST_POPUP_FORMALL, (LPCTSTR)"전체보기"); // // if (m_nSelectedFormIdRclick < 0) // { // // } // else if (m_nSelectedFormIdRclick >= 0) // { // strText.Format("Form%d 보기", m_nSelectedFormIdRclick); // menu.AppendMenu(MF_STRING, FORMLIST_POPUP_FORMSELECT, (LPCTSTR)strText); // } // // // CPoint ptPoint; // GetCursorPos(&ptPoint); // // menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, ptPoint.x, ptPoint.y, this); // // } } else if (GVN_ODCACHEHINT == pDispInfo->hdr.code) { GV_CACHEHINT *pCacheHint = (GV_CACHEHINT*)pDispInfo; } } return CDialog::OnNotify(wParam, lParam, pResult); } void CAlignDlg::setFormShow(int nFormID, BOOL bEnsureVisible) { const int nDefectCol = 1; if (nFormID >= 0) { int iRow = m_nSelectedRow;//for (int iRow = 0; iRow < m_gridDefectInfo.GetRowCount(); iRow++) { for (int iCol = 0; iCol < m_gridFormInfo.GetColumnCount(); iCol++) { m_gridFormInfo.SetItemState(iRow, iCol, m_gridFormInfo.GetItemState(iRow, iCol) & ~GVIS_SELECTED /*& ~GVIS_FOCUSED*/); } } } for (int i = 0; i < m_vecSortForm.size(); i++) { if (m_vecSortForm[i]->m_nFormLabel == nFormID) { int iRow = i+1; for (int iCol = 0; iCol < m_gridFormInfo.GetColumnCount(); iCol++) { m_gridFormInfo.SetItemState(iRow, iCol, LVIS_SELECTED); } m_nSelectedRow = iRow; if (bEnsureVisible) { m_gridFormInfo.EnsureVisible(iRow, m_nSelectedCol); } break; } } m_gridFormInfo.Invalidate(); } void CAlignDlg::getDispInfoDefect(int nCol, int nRow, CString* pStrData) { if (nRow < 0) return; if (nRow == 0) //header { *pStrData = m_vecStrGridDefectHeader[nCol]; } else { if (m_pDefectFormation == NULL) return; int nDataIndex = nRow - 1; if (nDataIndex >= m_vecSortForm.size()) return; _akFormation* pForm = m_vecSortForm[nDataIndex]; if (pForm == NULL) return; CString strItem; BOOL bPixel = FALSE; switch (nCol) { case 0: strItem.Format("%d", nRow); break; case 1: strItem.Format("%d", pForm->m_nFormLabel); break; case 2: { if (pForm->m_nFormJudge == 0) strItem = ""; else if (pForm->m_nFormJudge == 1) strItem = "제거"; }break; case 3: { if (pForm->m_nFormType == 0) strItem = "ROUND"; else if (pForm->m_nFormType == 1) strItem = "LINE"; }break; case 4: strItem.Format("%d", pForm->m_vecForms.size()); break; case 5: strItem.Format("%d", pForm->m_nDefectNumS); break; case 6: strItem.Format("%d", pForm->m_nDefectNumM); break; case 7: strItem.Format("%d", pForm->m_nDefectNumL); break; case 8: strItem.Format("%.3lf", pForm->m_dSizeAvg); break; case 9: strItem.Format("%.3lf", pForm->m_dSizeStdDev); break; case 10: strItem.Format("%d", pForm->m_nDefectNum1Px); break; case 11: strItem.Format("%d", pForm->m_nDefectNumWhite); break; case 12: strItem.Format("%d", pForm->m_nDefectNumBlack); break; case 13: strItem.Format("%d", pForm->m_nDefectNum1PxWhite); break; case 14: strItem.Format("%.0lf", 100.0* ((double)pForm->m_nDefectNum1Px /(double)pForm->m_vecForms.size())); break; case 15: strItem.Format("%.0lf", 100.0* ((double)pForm->m_nDefectNumWhite / (double)pForm->m_vecForms.size())); break; case 16: strItem.Format("%.0lf", 100.0* ((double)pForm->m_nDefectNumBlack / (double)pForm->m_vecForms.size())); break; case 17: strItem.Format("%.0lf", 100.0* ((double)pForm->m_nDefectNum1PxWhite / (double)pForm->m_vecForms.size())); break; case 18: strItem.Format("%.3lf", pForm->m_dDiffStdDev); break; case 19: strItem.Format("%.3lf", pForm->m_dDiffStdDevAbs); break; } *pStrData = strItem; } } void CAlignDlg::updateDefectInfo() { if (m_pDefectFormation && m_pDefectDisplayOption) { int nFormType; int nFormLabel; m_vecSortForm.clear(); for (int i = 0; i < m_pDefectFormation->m_vecFormation.size(); i++) { nFormType = m_pDefectFormation->m_vecFormation[i].m_nFormType; nFormLabel = i; if (nFormLabel >= 0) { nFormType = m_pDefectFormation->m_vecFormation[i].m_nFormType; } if (m_pDefectDisplayOption->m_bShowDefectNormal == FALSE) { if (nFormType < 0) continue;; } if (m_pDefectDisplayOption->m_bShowDefectGroupRound == FALSE) { if (nFormType == 0) continue;; } if (m_pDefectDisplayOption->m_bShowDefectGroupLine == FALSE) { if (nFormType == 1) continue;; } if (m_pDefectDisplayOption->m_nShowLabel >= 0) { if (nFormLabel != m_pDefectDisplayOption->m_nShowLabel) continue;; } m_vecSortForm.push_back(&m_pDefectFormation->m_vecFormation[i]); } if(m_nLastSortCol>0) SortListDefect(m_nLastSortCol); m_gridFormInfo.SetRowCount(m_vecSortForm.size()+1); m_gridFormInfo.Invalidate(); } } void CAlignDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); m_WndArrange.process(cx, cy); } void CAlignDlg::OnPopupMenuFormList(UINT nID) { if (nID == FORMLIST_POPUP_FORMALL) { GetParent()->PostMessage(UM_FORMLIST_FORMSELECT, -1, 1); } else if(nID == FORMLIST_POPUP_FORMSELECT) { GetParent()->PostMessage(UM_FORMLIST_FORMSELECT, m_nSelectedFormIdRclick, 1); } } void CAlignDlg::SortListDefect(int nCol) { if (nCol == 0) return; if (m_pDefectFormation == NULL) return; m_bAsending = !m_bAsending; { _akFormation *pForm; std::vector< std::pair > vecString; std::vector< std::pair > vecValue; CString strValue; double dValue; for (int i = 0; i < m_vecSortForm.size(); i++) { pForm = m_vecSortForm[i]; switch (nCol) { case 1: dValue = pForm->m_nFormLabel; break; case 2: dValue = pForm->m_nFormJudge; break; case 3: dValue = pForm->m_nFormType; break; case 4: dValue = pForm->m_vecForms.size(); break; case 5: dValue = pForm->m_nDefectNumS; break; case 6: dValue = pForm->m_nDefectNumM; break; case 7: dValue = pForm->m_nDefectNumL; break; case 8: dValue = pForm->m_dSizeAvg; break; case 9: dValue = pForm->m_dSizeStdDev; break; case 10: dValue = pForm->m_nDefectNum1Px; break; case 11: dValue = pForm->m_nDefectNumWhite; break; case 12: dValue = pForm->m_nDefectNumBlack; break; case 13: dValue = pForm->m_nDefectNum1PxWhite; break; case 14: dValue = pForm->m_nDefectNum1Px; break; case 15: dValue = pForm->m_nDefectNumWhite ; break; case 16: dValue = pForm->m_nDefectNumBlack ; break; case 17: dValue = pForm->m_nDefectNum1PxWhite ; break; case 18: dValue = pForm->m_dDiffStdDev; break; case 19: dValue = pForm->m_dDiffStdDevAbs; break; } if(strValue.IsEmpty() == FALSE) vecString.push_back(std::make_pair(strValue, pForm)); else vecValue.push_back(std::make_pair(dValue, pForm)); } if (!vecString.empty()) { if (m_bAsending == TRUE) std::sort(vecString.begin(), vecString.end(), std::greater< std::pair >()); else std::sort(vecString.begin(), vecString.end(), std::less< std::pair >()); m_vecSortForm.clear(); std::vector< std::pair >::iterator itVec; for (itVec = vecString.begin(); itVec != vecString.end(); ++itVec) { m_vecSortForm.push_back(itVec->second); } } else//if (!vecString.empty()) { if (m_bAsending == TRUE) std::sort(vecValue.begin(), vecValue.end(), std::greater< std::pair >()); else std::sort(vecValue.begin(), vecValue.end(), std::less< std::pair >()); m_vecSortForm.clear(); std::vector< std::pair >::iterator itVec; for (itVec = vecValue.begin(); itVec != vecValue.end(); ++itVec) { m_vecSortForm.push_back(itVec->second); } } } m_nLastSortCol = nCol; } void CAlignDlg::DrawnoImage() { CPaintDC dc(this); m_AlignImage.Destroy(); m_AlignImage2.Destroy(); CString DeftectPath; CFileStatus FileOn; TCHAR chFilePath[256] = { 0, }; GetModuleFileName(NULL, chFilePath, 256); CString strFolderPath(chFilePath); strFolderPath = strFolderPath.Left(strFolderPath.ReverseFind('\\')); strFolderPath = strFolderPath + "\\no-image.png"; m_AlignImage.Load(strFolderPath); m_AlignImage2.Load(strFolderPath); HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), strFolderPath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); InvalidateRect(m_picture_rect, FALSE); InvalidateRect(m_picture_rect2, FALSE); dc.SetStretchBltMode(COLORONCOLOR); m_AlignImage.Draw(dc, m_picture_rect); m_AlignImage2.Draw(dc, m_picture_rect2); }