반응형
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=0int 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>&&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
반응형


EDIT창에서 한줄씩 받아오기


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
 
        CString ReadData; 
        CString strTmp=""; CString str;
        GetDlgItemText(IDC_EDIT_TEXT, ReadData);//edit창에서 읽어서 read data에 넣음.
     
        int index=0int 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[]에 한문장씩 넣음
                            }
                        }
            }
cs


반응형
반응형


 파일 입력

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
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();
        }
    }    
}
cs




반응형
반응형


도구상자의  Button, Edit Control, Static Text을 더블클릭하여 생성해 줍니다.



대화상자를 오른쪽클릭해 변수추가 -> 변수이름 생성 


변수 생성하던중 static은 변수추가가 되지않았음.ㅠㅠ


그래서 아래 처럼 id의 이름을 IDC_txt로 바꿔주었음. (대화상자->오른쪽클릭->속성)



  button을 더블클릭하여 소스로 들어가봄.



아래와 같이 get set 함수를 써주었음

void CmfcDlg::OnBnClickedButton1()
{
 CString temp;
 INPUT.GetWindowTextW(temp);
 TXT.SetWindowTextW(temp);
 // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}



짜잔 완성했음! ^^


반응형

'C++ > C++MFC' 카테고리의 다른 글

MOTOROLA S FORMAT 특정주소찾아 데이터부분만 뿌리기(vs2008)  (0) 2018.08.23
EDIT창에서 한줄씩 받아오기  (0) 2018.08.23
파일 입력  (0) 2018.08.23

+ Recent posts