지난 시간에 이어 CMycomm 클래스를 다이얼로그 에서 사용 하는 과정을 알아 보겠습니다.


1. 클래스 사용 준비

  - CMycomm 클래스의 객체 포인터를 맴버 변수로 선언하고, 스레드가 종료될 때 발생하는 메시지를 처리할 콜백 함수와 

    스레드에서 데이터가 수신되었음을 알리는 메시지를 처리하는 콜백함수 이렇게 두개를 먼저 선언 합니다.

    물론 선언 위치는 serialDlg.h 파일이며, 정화기 CserialDlg 클래스의 맴버로 선언 해야 합니다.

 // serialDlg.h : header file

//

 

#pragma once

#include "afxwin.h"

#include "Mycomm.h"

 

 

// CserialDlg dialog

class CserialDlg : public CDialog

{

// Construction

public:

       CMycomm* m_comm;

       LRESULT      OnThreadClosed(WPARAM length, LPARAM lpara);

       LRESULT      OnReceive(WPARAM length, LPARAM lpara);

        CserialDlg(CWnd* pParent = NULL);     // standard constructor

-> 붉은색 글씨 부분 추가

 

 - 그다음 수신 데이터 발생시 전달되는 메시지와 스레드 종료 메시지를 처리하기 위해 메시지 맵에서 매핑 시켜 줘야 합니다.

BEGIN_MESSAGE_MAP(CserialDlg, CDialog)

        ON_WM_SYSCOMMAND()

        ON_WM_PAINT()

        ON_WM_QUERYDRAGICON()

        //}}AFX_MSG_MAP

 

        ON_MESSAGE(WM_MYCLOSE, &CserialDlg::OnThreadClosed)

       ON_MESSAGE(WM_MYRECEIVE,&CserialDlg::OnReceive)

 

        ON_BN_CLICKED(IDC_BT_CONNECT, &CserialDlg::OnBnClickedBtConnect)

        ON_BN_CLICKED(IDC_BT_CLEAR, &CserialDlg::OnBnClickedBtClear)

        ON_CBN_SELCHANGE(IDC_COMBO_COMPORT, &CserialDlg::OnCbnSelchangeComboComport)

        ON_CBN_SELCHANGE(IDC_COMBO_BAUDRATE, &CserialDlg::OnCbnSelchangeComboBaudrate)

END_MESSAGE_MAP() 

-> BEGIN_MESSAGE_MAP 은 발생된 메시지를 메시지 처리 함수와 연결 시켜주는 역할을 합니다.


 - 이제 연결되어 처리될 함수를 구현해 넣으면 됩니다.

LRESULT CserialDlg::OnThreadClosed(WPARAM length, LPARAM lpara)

{

        //overlapped i/o 핸들을닫는다.

        ((CMycomm*)lpara)->HandleClose();

        delete ((CMycomm*)lpara);

 

        return 0;

}

LRESULT CserialDlg::OnReceive(WPARAM length, LPARAM lpara)

{

        CString str;

        char data[20000];

        if(m_comm)

        {

               m_comm->Receive(data,length); //length 길이만큼데이터를받는다.

               data[length]=_T('\0');

               str+=_T("\r\n");

               for(int i = 0;i<length;i++)

               {

                       str += data[i];

               }

               m_edit_rcv_view.ReplaceSel(str); //에디트박스에표시하기위함

               str = "";

               //UpdateData(FALSE);

               m_edit_rcv_view.LineScroll(m_edit_rcv_view.GetLineCount());

        }

        return 0;

} 

->OnThreadClosed :  COM 포트를 닫는다고 해서 완전히 종료 된것은 아니고 overlapped I/O 핸들도 종료를 해야 하는데요

    그걸 스레드 종료 할 때 하도록 하는 것입니다.

-> OnReceive :데이터 수신메시지가 발생되면 스레드에서 저장해 놓은 버퍼에서 읽어와 다이얼로그 가운데 큰 EDIT BOX

    에 추가 하는 기능윽 합니다.

-> 여기서 한가지 추가 하면  m_edit_rcv_view.LineScroll(m_edit_rcv_view.GetLineCount());  은 edit box의 

   화면이 넘어가면 우측 스크롤을 맨 아래로 내려 주는 역알을 합니다. 알면 쉽고 모르면 짜증나는 녀석이죠.


여기 까지 해서 UI 뒤에서 도는 코드들은 완성이 되었습니다.

이제 남은 것은 다이얼로그에 배치된 각 컨트롤들에 이벤트를 부여 하는 것이죠, 예를 들어 OPEN 버튼을 누르면 무슨일을 하고,

CLOSE 버튼을 누르면 어떤 일을 해야  하는지를 만드는 것이지요.

다음 시간에 계속 하겠습니다.