반응형
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 | // AMOLLANGDlg.cpp : 구현 파일 // #include "stdafx.h" #include "AMOLLANG.h" #include "AMOLLANGDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다. class CAboutDlg : public CDialog { public: CAboutDlg(); // 대화 상자 데이터입니다. enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다. // 구현입니다. protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CAMOLLANGDlg 대화 상자 CAMOLLANGDlg::CAMOLLANGDlg(CWnd* pParent /*=NULL*/) : CDialog(CAMOLLANGDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CAMOLLANGDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAMOLLANGDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_OPEN, &CAMOLLANGDlg::OnBnClickedOpen) ON_BN_CLICKED(IDC_FORMAT, &CAMOLLANGDlg::OnBnClickedFormat) END_MESSAGE_MAP() // CAMOLLANGDlg 메시지 처리기 BOOL CAMOLLANGDlg::OnInitDialog() { CDialog::OnInitDialog(); // 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다. // IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는 // 프레임워크가 이 작업을 자동으로 수행합니다. SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다. SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다. // TODO: 여기에 추가 초기화 작업을 추가합니다. return TRUE; // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다. } void CAMOLLANGDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면 // 아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 응용 프로그램의 경우에는 // 프레임워크에서 이 작업을 자동으로 수행합니다. void CAMOLLANGDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다. int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 아이콘을 그립니다. dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서 // 이 함수를 호출합니다. HCURSOR CAMOLLANGDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CAMOLLANGDlg::OnBnClickedOpen() { // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. CFileDialog dlgFile(TRUE, "hex", "", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "텍스트(*.hex)|*.hex|모든파일(*.*)|*.*||"); //TRUE 열기 FALSE 저장, HEX파일, 덮어쓰기여부, 읽기전용열기체크박스 안보임 if (dlgFile.DoModal()==IDOK) // 다이얼로그가 종료될 때 반환되는 값을 검사, OK 버튼으로 종료되었을 경우 IDOK를 반환 { // OK 로 다이얼로그가 종료되었을 경우의 작업 코딩 CFile rfile; if (rfile.Open(dlgFile.GetPathName(), CFile::modeRead | CFile::typeBinary)) { DWORD dwSize=rfile.GetLength(); TCHAR *str=new TCHAR[dwSize+1]; // 마지막 NULL문자를 위해 1만큼 더 할당함 if (str) { rfile.Read(str, dwSize*sizeof(TCHAR)); str[dwSize]=0; GetDlgItem(IDC_EDIT_TEXT)->SetWindowText(str); // str 를 EDIT 로 출력 delete []str; } rfile.Close(); } } } void CAMOLLANGDlg::OnBnClickedFormat() { //------------------------------- EDIT창에있는 문자열 한줄씩 받아오기---------------------------------------// CString ReadData; CString strTmp=""; CString str; GetDlgItemText(IDC_EDIT_TEXT, ReadData);//edit창에서 읽어서 read data에 넣음. int index=0; int length=0; char chBuf[2]; length = ReadData.GetLength();//문자열 길이 length에 넣음 int nListCount=0; CString csLineData[10240]; CString csBuf=_T(""); for(int i=0; i<length; i++) //length는 문자열 길이 nlistcount는 문장의갯수 { csBuf=ReadData.Mid(i,1);//한글자씩 버퍼에 넣어 if(csBuf=="\n")//줄바꿈을 만났을때(\n은 캐럿이 다음 줄로 갑니다.) { csBuf=""; //" "로 변경 nListCount++;//카운트를 증가시켜 문장의 갯수를 셈 } else { if(csBuf!="\r")//줄바꿈을 만기전까지(\r은 캐럿이 그 줄 맨 앞으로 갑니다.) { chBuf[0]=csBuf.GetAt(0); chBuf[1]='\0'; csLineData[nListCount]+=chBuf;//csLineData[]에 한문장씩 넣음 } } } //------------------------------------체크썸 및 데이터 오류 확인-----------------------------------------// int a=0; int ha=0; int sang=0; int su=0; for(int n=0; n<nListCount+1; n++)//첫번째 문장부터 끝문장까지 for문을 돌림 { CString check = csLineData[n]; CString C;//checksum C=check.Mid(check.GetLength()-2,2);//체크썸부분 뒤에두자리받아옴 CString ee;//앞에갯수 나타내는 두자리 int g=0; int sum=0; a=2; for(g=0; g<check.GetLength()/2-2; g++)//문장의 세번째부터 끝에서 세번째까지 두글자씩 받아와 더함 { ee=check.Mid(a,2);//ee변수에 CString으로 두글자씩 받아옴 int jeongsu = strtol(ee,NULL,16);//jeongsu변수에 16진수를 10진수로바꾸어 받음 sum=sum+jeongsu;//sum변수에 받아온 정수들을 더함 a=a+2;//두글자씩 받기위해 a=a+2 } //--------------sum에 받은 정수들의 합을 2로나누어 2진수로 namuze[]버퍼에받음------------------// int mok; int namuze[8]; for(g=0; g<=7; g++)//8자리만 받아서 처리해줌 { mok=sum/2; namuze[g] = sum-(mok*2);//2로나눈나머지들 나머지버퍼에 저장 sum=mok; } //------namuze[]배열에 보수취함---------// for(g=7; g>=0; g--) { namuze[g]=~namuze[g]+2; } //------rew는 보수 첫번째수, ff는 보수두번째수---------// int rew; rew = namuze[7]*8+namuze[6]*4+namuze[5]*2+namuze[4]*1; int ff; ff = namuze[3]*8+namuze[2]*4+namuze[1]*2+namuze[0]*1; int lu = strtol(C,NULL,16);//Checksum lu변수에 16진수 10진수로바꾸어 저장 //------checksum과 모두더한값이 같다면 ha변수 값 1 올려줌---------// if( lu== (rew*16)+ff)//rew변수는 앞자리라 16을곱해서 처리 { ha=ha+1; } //-------------------- 데이터 오류 확인------------------------// CString B;//갯수체크하는 부분 B=check.Mid(2,2); int d=strtol(B,NULL,16);//16진수 10진수로 바꾸기(갯수체크부분) int e=check.GetLength()/2-2;//문자열길이/2-2_10진수로 if(e==d)//문자열길이와 갯수체크바이트부분이(16진수를10진수로변환하여) 같으면 { sang=sang+1; //sang변수 값 1 올려줌 } //------------- 체크썸부분과 데이터갯수모두 제대로 들어갔다면--------------// if(sang==nListCount && ha==nListCount) { su=1;//su변수 1로 변경 //MessageBox(_T("포멧확인 ok"),NULL,NULL);//메세지박스로 나타냄 } } //-------------------------------EDIT창에 데이터 뿌리기-------------------------------------// for(int n=0; n<nListCount+1; n++) { //GetDlgItem(IDC_EDIT2_TEXT)->SetWindowText(csLineData[n]); CString t_cstr = csLineData[n];//t_cstr변수에 한문장씩 받아옴 CString tmp; int i; //start hex값 정수변환 int j; //editbox의 주소값 정수값 변환 int p; //end hex값 정수변환 CString addr;//주소값받기 addr=t_cstr.Mid(4,4); //주소값 4개만 잘라서 저장 char *addr2 = (LPSTR)(LPCTSTR) addr; j=strtol(addr2,NULL,16);//16진수 INT형으로 변환 CString start;//시작주소 CString end;//끝주소 GetDlgItemText(IDC_EDIT_START, start); GetDlgItemText(IDC_EDIT_END, end); char *start2 = (LPSTR)(LPCTSTR) start; i=strtol(start2,NULL,16);//16진수 INT형으로 변환 char *end2 = (LPSTR)(LPCTSTR) end; p=strtol(end2,NULL,16);//16진수 INT형으로 변환 //---------------------edit창에입력받은 시작주소보다 크고 끝주소보다 작다면--------------------------------// if(j>i &&j<p) { t_cstr.Delete(0,8);//앞에 8자리지우기 t_cstr.Delete(t_cstr.GetLength()-2,2);//뒤에 2자리지우기 GetDlgItem(IDC_EDIT_TEXT)->GetWindowText(tmp); //-------2글자사이 공백넣기----------------// int k=2; int f=t_cstr.GetLength(); for(k=2;k!=f;k=k+3) { t_cstr.Insert(k," "); f=t_cstr.GetLength(); } str = str + t_cstr;//str에추가하기 str = str + "\r\n";//줄바꿈 //-------------------데이터오류체크하여 맞다면 데이터출력 아니라면 빈화면출력------------------------// if(su==1)// { GetDlgItem(IDC_EDIT_TEXT)->SetWindowText(str);//str EDIT창에표시 } if(su==0) { GetDlgItem(IDC_EDIT_TEXT)->SetWindowText(_T(""));//빈화면포시 } } } } | cs |
실행화면
AMOLLANG (7).zip
8.56MB
반응형
'C++ > C++MFC' 카테고리의 다른 글
EDIT창에서 한줄씩 받아오기 (0) | 2018.08.23 |
---|---|
파일 입력 (0) | 2018.08.23 |
[C++] 버튼을 클릭하면 STATIC이 EDIT창에 쓴것 처럼 변경 (0) | 2017.09.28 |