강좌 & 팁
지난 시간에 이어 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() |
- 이제 연결되어 처리될 함수를 구현해 넣으면 됩니다.
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 버튼을 누르면 어떤 일을 해야 하는지를 만드는 것이지요.
다음 시간에 계속 하겠습니다.
보면서 열심히 공부하고 있습니다. 좋은 자료 감사합니다.