Dialog에 BMP 이미지 올리기


1. Dialog에 Picture Control을 하나 넣고  속성의 Type을 Bitmap으로 바꾼다.



2. "클래스 마법사"를 통해서 Control변수를 하나 등록한다.


3. Bitmap이미지도 추가하고, ID를 부여하자.



4. 이미지를 띄우고 싶은 곳에, 아래의 코드를 추가하면 BMP이미지가 나타난다.

HBITMAP hbit;

hbit = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_INFOICON));

m_MyIcon.SetBitmap(hbit);




끝!

Posted by 둔한늑대
,

대화상자기반(Dialog) 프로그램을 실행하고 엔터키를 누르면 프로그램이 닫혀버린다.

이것을 방지하는 방법을 적어놓자.

 

1. 함수추가하기 

 

    - 우선 가상함수 하나를 추가해야 한다.

      클래스 마법사를 띄우고, 가상함수의 PreTranslateMessage 함수를 추가한다.

 

2. 함수 확인

    - Source에 PreTranslateMessage 함수가 추가 되었을 것이다.

 

3. Source코드 넣기 

    - PreTranslateMessage 함수에 이 코드를 넣으면 아무리 엔터키를 눌러도 프로그램은 닫히지 않는다.

    - 대충 설명

       if ( Key가 눌러졌다는 메시지를 받으면)

       {

              if (Key가 13번(엔터키)이면)

              {

                      돌아가라~

              }

       }

Posted by 둔한늑대
,

Edit Box에 사용자가 입력한 값 가져오기

 

1. Edit Box?

    - 사용자에게서 텍스트값을 입력받을 수 있는 박스.  

 

2. Edit Box 그리기

    - 오른쪽 두번째 Edit Box클릭. 그릴 곳에 클릭. 끝  

 

3. Edit Box 사용자 입력값 표시 방법

    - 사용자가 입력한 값 그대로 보이게 할거면 그냥 쓰면 되고, 1번처럼 '*'로 보이게 할거면 Properties에서

       StylesPassword를 체크 

 

4. 사용자 입력값 가져오기

    - 우선 Edit Box의 ID를 확인한다. 

 

    - GetDlgItemText을 사용. 값을 읽어와서 CString 변수에 넣어주면 된다. 

 

Tip> strcmp를 사용해서 CString 값 비교하기. 

 

 

 

 

Posted by 둔한늑대
,

Visual C++ 6.0에서 Timer 사용하기

 

1. Timer가 뭐야?

    - 간단히 말해서, 셋팅한 타임마다 실행하는 함수. 예를들어 5초로 셋팅해놓으면 5초마다 Timer함수가 호출됨.

 

2. Timer 이벤트 함수 만들기

    1) ClassWizard로 들어가자.

   

    2) Messages에 WM_TIMER를 선택하고 Add Function을 클릭해.

 

    3) 그럼 OnTimer(UINT nIDEvent)라는 함수가 생길거야.

        이 함수안에 셋팅한 시간마다 할 일을 작성하면 되는거야. 그럼 셋팅은 어떻게 하느냐?

 

3. Timer 셋팅하기   

    - 이 한줄만 있으면 Timer셋팅은 끝.

       첫번째 인자는 타이머번호야. 타이머를 여러개 쓸때 구분하기위한 것이니 겹치지 않게 하도록...

       두번째 인자는 타이머함수를 호출하는 주기야. 시간단위는 1000분의 1초. 예를들어 1000은 1초, 2000은 2초....

       세번째 인자는 그냥 NULL로 두자. 깊이있게 가지마...

    - 이렇게 SetTimer를 선언하면 이때부터 셋팅된 시간마다 함수가 호출될거야. 그럼 멈추는건 어떻게 하느냐?

 

4. Timer 멈추기 

    - KillTimer 한줄이면 Timer는 멈춰. 무섭게도 죽여버리는거지.

 

 

Posted by 둔한늑대
,

Visual C++ 6.0에서 현재시간 가져오는 방법

 

  - Ctrl+C / Ctrl+V 용 소스

     CString LogWriteString;

     CTime cTime = CTime::GetCurrentTime(); 
      LogWriteString.Format("%04d/%02d/%02d %02d:%02d:%02d", cTime.GetYear(), cTime.GetMonth(),  

                                        cTime.GetDay(), cTime.GetHour(), cTime.GetMinute(), cTime.GetSecond());   

 

  - 설명이 필요없는 코드지만, 그래도 적어두자.

      cTime.GetYear()     : 현재시간의 년(年)을 가지고 있음.

      cTime.GetMonth()   : 현재시간의 월(月)을 가지고 있음.

      cTime.GetDay()      : 현재시간의 일(日)을 가지고 있음.

      cTime.GetHour()     : 현재시간의 시(時)를 가지고 있음.

      cTime.GetMinute()  : 현재시간의 분(分)을 가지고 있음.

      cTime.GetSecond() : 현재시간의 초(秒)를 가지고 있음.

 

 

    

 

 

Posted by 둔한늑대
,

Visual C++ 6.0에서 COM포트 오픈하기

 

1. 아래 소스대로 Ctrl+C/Ctrl+V 하면 COM포트는 활짝 열린다.

 

 DCB    dcb = {sizeof(DCB)};

 CString ComPortName;
 ComPortName.Format(_T("COM%d"),ComPortNum+3);
 HANDLE m_hComm;

 m_hComm = CreateFile(ComPortName,
  GENERIC_READ | GENERIC_WRITE,             // 접근모드 읽기쓰기인가 읽기 전용인가
  0 ,                                                           // 다른 프로그램과 공유를 할것인가 아닌가.
  NULL,                                                       // 보안에 관한 속성
  OPEN_EXISTING,                                        // 어떻게 열것인가

  0,                                                             // 파일 속성(보통 파일이면서 overlapped 되게 한다.)
  NULL);                                                      // 템플릿 파일 핸들러
 
 if (m_hComm == (HANDLE) -1)
 {
  AfxMessageBox("Com Port Connect Fail!");
  return;
 }
 
 // EV_RXCHAR event 설정
 SetCommMask(m_hComm, EV_BREAK | EV_ERR | EV_RXCHAR | EV_TXEMPTY); 


 // InQueue, OutQueue 크기 설정.
 SetupComm(m_hComm, 4096, 4096); 


 // 포트 비우기.
 PurgeComm(m_hComm, PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
 
 // dcb 설정
 dcb.DCBlength = sizeof(DCB);
 GetCommState(m_hComm, &dcb); // 예전 값을 읽음.
 dcb.BaudRate = CBR_115200;      //BaudRate 비트/초
 dcb.ByteSize = 8;               //데이터비트
 dcb.Parity = NOPARITY;          // 패리티
 dcb.StopBits = ONESTOPBIT;      // 정지비트

 dcb.fParity = FALSE;
 dcb.fNull = FALSE;

 if (! SetCommState(m_hComm, &dcb))
 {
      AfxMessageBox("Com Port Connect Setting Fail!");
      //ClosePort();
      return;
 }

 

 COMMTIMEOUTS timeouts;
 timeouts.ReadIntervalTimeout = 0;
 timeouts.ReadTotalTimeoutMultiplier = 0;
 timeouts.ReadTotalTimeoutConstant = 0;
 timeouts.WriteTotalTimeoutMultiplier = 0;
 timeouts.WriteTotalTimeoutConstant = 0;
 if (!SetCommTimeouts(m_hComm, &timeouts))
      return;

 

2. 하나씩 뜯어보자. 물론 내가 아는거만 적는다.

     1) CreateFile() - COM포트 열기

           - 1번째 인자 : 연결할 COM포트 정하기.

                               여기서는 ComPortName 문자열에 들어간 값의 포트가 열린다. ex) COM3, COM4, COM5.....

           - 2번째 인자 : 포트의 엑서스 권한을 정하기.

                                GENERIC_READ | GENERIC_WRITE => 읽기, 쓰기 권한을 가진다. 나머지 옵션은 검색~

           - 3번째 인자 : 공유모드 정하기. 다른 프로세스에서 접근할 수 있게 할지 정하기.

                                FILE_SHARE_READ | FILE_SHARE_WRITE => 다른프로세스의 읽기, 쓰기 권한을 가진다.

           - 4번째 인자 : 보안에 관한 속성. 잘 모른다. 그냥 NULL로 정하자.

           - 5번째 인자 : COM포트를 어떻게 열것인가? 하나만 지정할 수 있다.

                                OPEN_ALWAYS => 항상 새로 연다. 역시나 나머지는 옵션은 검색~

           - 6번째 인자 : COM포트의 속성을 지정한다고 하지만, 무슨말인지 모른다.

                               FILE_FLAG_OVERLAPPED로 정하고 쓰자. 검색해도 뭔말인지 모른다.

           - 7번째 인자 : 그냥 NULL로 쓰자.

 

     2) 포트설정 

 

           - dcb.BaudRate : 전송속도 정하는 것이다. 9.6K, 14.4K같은거... 9600, 14400 이렇게 넣으면 된다.

                                    이거만 정하고 나머진 기본으로 가면 그냥 뚫린다. 귀찮게 다른 값들은 건들면 노노~

           - dcb.ByteSize : 데이터비트다. 기본 8

           - dcb.Parity : 패리티다. 기본 0

           - dcb.StopBits : 정지비트다. 기본 1

 

3. 사용완료했으면 닫아줘야지.

    - COM포트를 열어서 다 사용했다면 그만쓰겠다고 신고해야하는거 아니겠어.

 

     SetCommMask(m_hComm, 0);
     PurgeComm(m_hComm, PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
     CloseHandle(m_hComm);

                     

     열때 사용했던 핸들만 조용히 CloseHandle해주면 된다.

 

4. COM포트로 데이터 날려보내기.

    - WriteFile을 사용해서 Open한 포트로 데이터를 날려보내면 된다. Writedata[]의 값이 날아간다.

       dwWritten의 값이 0으로 return되면 안 날아간거니 소스 다시 뜯어보도록~

 

5. 데이터 받기.

    - ReadFile을 사용해서 들어오는 데이터를 읽으면 된다. 읽은 데이터는 pBuff에 저장된다.

 

 

 

 

 

           

          

 

 

Posted by 둔한늑대
,

Visual C++ 6.0에서 ListBox (리스트박스)를 추가하는 방법에 대해서 기록해놓자. 

 

1. ListBox는 무엇이냐?

    - 선택할 수 있는 목록들이 나열되어있는 박스다.

 

 

 

2. ListBox 그리기

    - 저녀석이 ListBox를 그리는 놈이다. 클릭질 두번이면 끝!

 

 

3. ListBox 컨트롤 변수 등록

    - ListBox를 그렸다면, 이제 ListBox에 값을 집어넣어야 사용자가 선택할 수 있겠지? ListBox에 값을 넣기

      위해서는 컨트롤을 하기위한 변수를 등록해줘야 한다.

 

4. ListBox에 목록 추가하기

    - 목록추가는 간단하다. 3번에서 등록한 컨트롤변수를 이용하면 된다. 

 

    - 여기까지하면 리스트박스는 이렇게 구성된다.

 

5. 사용자가 선택한 값 가져오기

    - ComportNum변수에는 4번 목록추가에 들어갔던 숫자값이 들어간다.

       ex) COM3를 선택하면 Return값은 0, COM8을 선택하면 Return값은 5

 

 

 

 

 

 

 

 

 

 

 

Posted by 둔한늑대
,