지난 시간에 이어 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 버튼을 누르면 어떤 일을 해야 하는지를 만드는 것이지요.
다음 시간에 계속 하겠습니다.
원보은 여기에 있습니다.
'잡다한이야기' 카테고리의 다른 글
c/c++에서 matlab mat 파일 저장하기. (0) | 2015.01.21 |
---|---|
VS2008 MFC 를 이용한 시리얼 통신 프로그램 만들기(6) 마지막 (0) | 2015.01.20 |
VS2008 MFC 를 이용한 시리얼 통신 프로그램 만들기(4) (0) | 2015.01.20 |
VS2008 MFC 를 이용한 시리얼 통신 프로그램 만들기(3) (0) | 2015.01.20 |
VS2008 MFC 를 이용한 시리얼 통신 프로그램 만들기(2) (0) | 2015.01.20 |