SDC C-Project CF Review 프로그램
LYW
2021-07-08 e10b8c2a3f6ee6b639dbb49ff6635d0657531d1e
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp
@@ -1,5 +1,5 @@
// DitGlassRawMessengerDlg.cpp : 구현 파일
// DitGlassRawMessengerDlg.cpp : ���� ����
//
#include "stdafx.h"
@@ -23,20 +23,20 @@
#define GRID_TEXT_COLOR         RGB(255,255,255)
#define GRID_ALARM_TEXT_COLOR   RGB(255,0,0)
#define GRID_LINE_COLOR         GRID_FIX_COLOR
// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.
// ���� ���α׷� ������ ���Ǵ� CAboutDlg ��ȭ �����Դϴ�.
class CAboutDlg : public CDialog
{
public:
   CAboutDlg();
// 대화 상자 데이터입니다.
// ��ȭ ���� �������Դϴ�.
   enum { IDD = IDD_ABOUTBOX };
   protected:
   virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 지원입니다.
   virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV �����Դϴ�.
// 구현입니다.
// �����Դϴ�.
protected:
   DECLARE_MESSAGE_MAP()
};
@@ -54,7 +54,7 @@
END_MESSAGE_MAP()
// CDitGlassRawMessengerDlg 대화 상자
// CDitGlassRawMessengerDlg ��ȭ ����
@@ -127,7 +127,7 @@
   m_vecStrGridDefectHeader.push_back("CellY(mm)");
   m_vecStrGridDefectHeader.push_back("ScrtRatio");
   m_vecStrGridDefectHeader.push_back("Density");
   //201207 CJH - Merge 여부 확인
   //201207 CJH - Merge ���� Ȯ��
   m_vecStrGridDefectHeader.push_back("MergeState");
}
@@ -192,16 +192,16 @@
   if (timestruct.tm_mon>11 || timestruct.tm_mon<0 )
      ASSERT(FALSE);
}
// CDitGlassRawMessengerDlg 메시지 처리기
// CDitGlassRawMessengerDlg �޽��� ó����
BOOL CDitGlassRawMessengerDlg::OnInitDialog()
{
   CDialog::OnInitDialog();
   DragAcceptFiles(TRUE);
   // 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.
   // �ý��� �޴��� "����..." �޴� �׸��� �߰��մϴ�.
   // IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
   // IDM_ABOUTBOX�� �ý��� ��� ������ �־�� �մϴ�.
   ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
   ASSERT(IDM_ABOUTBOX < 0xF000);
@@ -219,16 +219,16 @@
      }
   }
   // 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
   //  프레임워크가 이 작업을 자동으로 수행합니다.
   SetIcon(m_hIcon, TRUE);         // 큰 아이콘을 설정합니다.
   SetIcon(m_hIcon, FALSE);      // 작은 아이콘을 설정합니다.
   // �� ��ȭ ������ �������� �����մϴ�. ���� ���α׷��� �� â�� ��ȭ ���ڰ� �ƴ� ��쿡��
   //  �����ӿ�ũ�� �� �۾��� �ڵ����� �����մϴ�.
   SetIcon(m_hIcon, TRUE);         // ū �������� �����մϴ�.
   SetIcon(m_hIcon, FALSE);      // ���� �������� �����մϴ�.
   //트레이아이콘 구성
   //Ʈ���̾����� ����
   m_TrayIcon = FALSE;
   ResTrayIcon();
   //빌드 정보
   //��� ����
   {
      CString strBuild;
      tm tmBuild;
@@ -237,7 +237,7 @@
      SetDlgItemText(IDC_BUILDDATE, strBuild);
   }
   //설정파일 정보 읽어 오기 [김태현 2018/11/20]
   //�������� ���� �о� ���� [������ 2018/11/20]
   {
      m_strConfigFile;
      {
@@ -268,7 +268,7 @@
      SetDlgItemText(IDC_EDIT_STACK_PARAM2, m_ConfigOption.m_strStackParam2);
   }
   //로그 관련 [김태현 2018/11/20]
   //�α� ���� [������ 2018/11/20]
   {
      CakFileUtil fileutil;
      char strPath[256];
@@ -371,30 +371,30 @@
   if(m_Server.CreateServer(m_ConfigOption.m_nMaxDataNumCell, m_ConfigOption.m_nMaxDataNumDefect) == FALSE)
   {
      AfxMessageBox("서버 생성 실패 종료 합니다.");
      AfxMessageBox("���� ���� ���� ���� �մϴ�.");
      exit(0);
   }
   //현재값 적용 [김태현 2019/1/12]
   //���簪 ���� [������ 2019/1/12]
   {
      CDitGlassRawServer* pServer = (CDitGlassRawServer*) &m_Server;
      CgrmGlassRawData* pRawDataBuffer = &m_GlassRawDataBuffer;
      pRawDataBuffer->ImportGlassRaw(pServer->GetGlassRawInfo(), (char*)pServer->GetGlassData());
   }
   
   //작업 쓰레드 생성 [김태현 2018/11/13]
   //�۾� ������ ���� [������ 2018/11/13]
   {
      _beginthread(threadMain, NULL, this);
   }
   
   PostMessage(UM_GLASSRAW_CLIENTMESSAGE);
   return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
   return TRUE;  // ��Ŀ���� ��Ʈ�ѿ� �������� ������ TRUE�� ��ȯ�մϴ�.
}
void CDitGlassRawMessengerDlg::OnBnClickedOk()
{
   // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
   // TODO: ���⿡ ��Ʈ�� �˸� ó���� �ڵ带 �߰��մϴ�.
   OnOK();
}
@@ -403,14 +403,14 @@
{
   NOTIFYICONDATA nid;
   nid.cbSize = sizeof(nid);
   nid.hWnd = m_hWnd; // 메인 윈도우 핸들
   nid.uID = IDR_MAINFRAME; // 아이콘 리소스 ID
   nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // 플래그 설정
   nid.uCallbackMessage = UM_TRAYICON_MSG; // 콜백메시지 설정
   nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // 아이콘 로드
   nid.hWnd = m_hWnd; // ���� ������ �ڵ�
   nid.uID = IDR_MAINFRAME; // ������ ���ҽ� ID
   nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // �÷��� ����
   nid.uCallbackMessage = UM_TRAYICON_MSG; // �ݹ�޽��� ����
   nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // ������ �ε�
   char strTitle[256];
   GetWindowText(strTitle, sizeof(strTitle)); // 캡션바에 출력된 문자열 얻음
   GetWindowText(strTitle, sizeof(strTitle)); // ĸ�ǹٿ� ��µ� ���ڿ� ����
   lstrcpy(nid.szTip, strTitle);
   Shell_NotifyIcon(NIM_ADD, &nid);
   SendMessage(WM_SETICON, (WPARAM)TRUE, (LPARAM)nid.hIcon);
@@ -433,7 +433,7 @@
      GetCursorPos(&pos);
      {
         HMENU hMenu = CreatePopupMenu();
         AppendMenu(hMenu, MF_STRING, 0, "연구소2파트작품");
         AppendMenu(hMenu, MF_STRING, 0, "������2��Ʈ��ǰ");
         AppendMenu(hMenu, MF_STRING, WM_DESTROY, "Exit");
         TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x, pos.y, 0, GetSafeHwnd(), NULL);
      }
@@ -461,19 +461,19 @@
   }
}
// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면
//  아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 응용 프로그램의 경우에는
//  프레임워크에서 이 작업을 자동으로 수행합니다.
// ��ȭ ���ڿ� �ּ�ȭ ���߸� �߰��� ��� �������� �׸�����
//  �Ʒ� �ڵ尡 �ʿ��մϴ�. ����/�� ���� ����ϴ� MFC ���� ���α׷��� ��쿡��
//  �����ӿ�ũ���� �� �۾��� �ڵ����� �����մϴ�.
void CDitGlassRawMessengerDlg::OnPaint()
{
   if (IsIconic())
   {
      CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트
      CPaintDC dc(this); // �׸��⸦ ���� ����̽� ���ؽ�Ʈ
      SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
      // 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
      // Ŭ���̾�Ʈ �簢������ �������� ����� ����ϴ�.
      int cxIcon = GetSystemMetrics(SM_CXICON);
      int cyIcon = GetSystemMetrics(SM_CYICON);
      CRect rect;
@@ -481,7 +481,7 @@
      int x = (rect.Width() - cxIcon + 1) / 2;
      int y = (rect.Height() - cyIcon + 1) / 2;
      // 아이콘을 그립니다.
      // �������� �׸��ϴ�.
      dc.DrawIcon(x, y, m_hIcon);
   }
   else
@@ -490,8 +490,8 @@
   }
}
// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서
//  이 함수를 호출합니다.
// ����ڰ� �ּ�ȭ�� â�� ��� ���ȿ� Ŀ���� ǥ�õǵ��� �ý��ۿ���
//  �� �Լ��� ȣ���մϴ�.
HCURSOR CDitGlassRawMessengerDlg::OnQueryDragIcon()
{
   return static_cast<HCURSOR>(m_hIcon);
@@ -501,15 +501,15 @@
void CDitGlassRawMessengerDlg::OnDropFiles(HDROP hDropInfo)
{
   int nFiles;
   char szPathName[MAX_PATH];  // 파일 경로면이 들어간다.
   char szPathName[MAX_PATH];  // ���� ��θ��� ����.
   CString strFileName;
   // 드롭된 파일의 갯수
   // ��ӵ� ������ ����
   nFiles = ::DragQueryFile( hDropInfo, 0xFFFFFFFF, szPathName, MAX_PATH );
   for(int i = nFiles-1 ; i >= 0; i--)  //드롭된 파일 갯수만큼 루프를 돌면서 파일 경로를 메세지 박스로 출력
   for(int i = nFiles-1 ; i >= 0; i--)  //��ӵ� ���� ������ŭ ������ ���鼭 ���� ��θ� �޼��� �ڽ��� ���
   {
      // 파일의 경로 얻어옴
      // ������ ��� ����
      ::DragQueryFile(hDropInfo, i, szPathName, MAX_PATH);
      SetDlgItemText(IDC_EDIT_RAWFILENAME, szPathName);
@@ -601,18 +601,18 @@
   if(pRawInfo->m_nCommandIdxWrite != pRawInfo->m_nCommandIdxRead)
   {
      int nReadIdx = (pRawInfo->m_nCommandIdxRead+1)%COMMAND_MAXCOUNT; //현재는 읽은 마지막 포인트임으로 하나 증가시켜서 읽는다. [김태현 2018/11/13]
      int nReadIdx = (pRawInfo->m_nCommandIdxRead+1)%COMMAND_MAXCOUNT; //����� ���� ������ ����Ʈ������ �ϳ� �������Ѽ� �д´�. [������ 2018/11/13]
      _grmDitCommand::_grmCommand* pCommand = &pRawInfo->m_nCommandBuffer[nReadIdx];
      AKLOG("Recv Command ID:%d(r%d/w%d)", pCommand->nCommand, nReadIdx, pRawInfo->m_nCommandIdxWrite);
      pRawInfo->m_nCommandIdxRead = nReadIdx;
      if(pCommand->nResult == -1) //명령 수행 전 [김태현 2018/11/13]
      if(pCommand->nResult == -1) //��� ���� �� [������ 2018/11/13]
      {
         pCommand->nResult = ProcessCommand( (emGlassRawCommand)pCommand->nCommand, pCommand->strParam );
      }
      else
      {
         //이미 처리 된거 [김태현 2018/11/13]
         //�̹� ó�� �Ȱ� [������ 2018/11/13]
      }
      AKLOG("Recv Command ID:%d(r%d/w%d) Process End(Result:%d)", pCommand->nCommand, nReadIdx, pRawInfo->m_nCommandIdxWrite, pCommand->nResult);
@@ -658,7 +658,7 @@
      {
         nResult = m_pGlassRawMaker->SequenceInspectEnd(pRawDataBuffer);
         pServer->GetGlassRawInfo()->m_ServerProcStep = APS_InspectEnd;
         //Stack 정보를 공유메모리에 반영 하기 위한 Export
         //Stack ������ �����޸𸮿� �ݿ� �ϱ� ���� Export
         //pRawDataBuffer->ExportGlassRaw(pServer->GetGlassRawInfo(), (char*)pServer->GetGlassData());
         break;
      }
@@ -677,7 +677,7 @@
   case grcSequenceCustomReviewDataRead:
      {
         nResult = m_pGlassRawMaker->SequenceCustomizeReview(pRawDataBuffer);
         ////Customize Review를 위한 업데이트
         ////Customize Review�� ���� ������Ʈ
         //{
         //   memcpy(pServer->GetDefectData(0), pRawDataBuffer->GetDefectData(0), sizeof(_grmDefectData)*pServer->GetGlassRawInfo()->m_nDefectMaxDataNum);
         //   memcpy(pServer->GetCellData(0), pRawDataBuffer->GetCellData(0), sizeof(_grmCellData)*pServer->GetGlassRawInfo()->m_nCellMaxDataNum);
@@ -707,6 +707,12 @@
         nResult = m_pGlassRawMaker->ReadBinFile(pRawDataBuffer);
         break;
      }
   case grcReviewWriteBIn:
      {
         nResult = m_pGlassRawMaker->ReviewWriteBin(pRawDataBuffer);
         break;
      }
   }
   
   PostMessage(UM_GLASSRAW_CLIENTMESSAGE, nCmd);
@@ -771,14 +777,14 @@
   
   if(m_pGlassRawMaker) delete m_pGlassRawMaker;
   
   if(m_TrayIcon) // 현재 트레이 아이콘으로 설정되었는지 확인
   if(m_TrayIcon) // ���� Ʈ���� ���������� �����Ǿ����� Ȯ��
   {
      NOTIFYICONDATA nid;
      nid.cbSize = sizeof(nid);
      nid.hWnd = m_hWnd; // 메인 윈도우 핸들
      nid.hWnd = m_hWnd; // ���� ������ �ڵ�
      nid.uID = IDR_MAINFRAME;
      // 작업 표시줄(TaskBar)의 상태 영역에 아이콘을 삭제한다.
      // �۾� ǥ����(TaskBar)�� ���� ������ �������� �����Ѵ�.
      Shell_NotifyIcon(NIM_DELETE, &nid);
   }
@@ -936,7 +942,7 @@
BOOL CDitGlassRawMessengerDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
   // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
   // TODO: ���⿡ Ư��ȭ�� �ڵ带 �߰� ��/�Ǵ� �⺻ Ŭ������ ȣ���մϴ�.
   if (m_gridCellInfo.GetSafeHwnd() && wParam == (WPARAM)m_gridCellInfo.GetDlgCtrlID())
   {
      *pResult = 1;
@@ -1258,7 +1264,7 @@
               CString      str;
               strItem = _T("          ");
               // Panel x축, y축은 글라스와 반대 [6/9/2017 bhs]
               // Panel x��, y���� �۶󽺿� �ݴ� [6/9/2017 bhs]
               if(1)//g_pBasic->GetScanCoordination() == SC_XCoord)
                  str.Format("% 5.3f", (double)pDefect->m_nUMCellX / 1000.0);
               else
@@ -1281,7 +1287,7 @@
               CString      str;
               strItem = _T("          ");
               // Panel x축, y축은 글라스와 반대 [6/9/2017 bhs]
               // Panel x��, y���� �۶󽺿� �ݴ� [6/9/2017 bhs]
               if(1)//g_pBasic->GetScanCoordination() == SC_XCoord)
                  str.Format("% 5.3f", (double)pDefect->m_nUMCellY / 1000.0);
               else
@@ -1433,7 +1439,7 @@
void CDitGlassRawMessengerDlg::OnBnClickedBtnImportRaw()
{
   AKLOG("이기능은 가급적 필요가 있겠나.. 싶으네...");
   AKLOG("�̱���� ������ �ʿ䰡 �ְڳ�.. ������...");
   PostMessage(UM_GLASSRAW_CLIENTMESSAGE);
}
@@ -1568,13 +1574,13 @@
   
   
      CString str = _T("All(*.*)|*.*|");   // 선택할 파일 종류
      CString str = _T("All(*.*)|*.*|");   // ������ ���� ����
      CString File;
      CString strFileList; 
      CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, str, this);
      const int c_cMaxFiles = 400 /*선택할 파일 숫자*/ ;   // 메모리 부족현상으로 확장 안해주면 몇개 못씀
      const int c_cMaxFiles = 400 /*������ ���� ����*/ ;   // �޸� ������������ Ȯ�� �����ָ� � ����
      const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;
      dlg.GetOFN().lpstrFile = strFileList.GetBuffer(c_cbBuffSize);
      dlg.GetOFN().nMaxFile = c_cbBuffSize;
@@ -1585,7 +1591,7 @@
      {
         for(POSITION pos=dlg.GetStartPosition(); pos != NULL;)
         {
            // 전체삭제는 ResetContent
            // ��ü������ ResetContent
            File = dlg.GetNextPathName(pos);