학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

온도제어(싱글다큐먼트)

학습목표

다이어로그 박스를 만들고 메뉴에서 이를 선택하여 제어한다.

학습주제

송신과 수신 신호의 처리

통신속도

예습내용

통신 인터럽트, 통신버퍼

실습방법

다이어로그를 만든다.

ID “IDD_DLG_TEMP” 한다.

 

    

다이어로그 박스의 속성청에서 다음 빨간색 부분의 3개를 수정한다.

다이어로그박스를 마우스로 더블크릭하여 아래와 같이 클래스 이름을 “DlgTemp” 한다.

 

 

CDlgTemp 클래스에서 Create 함수를 추가한다.

생성된 Create 함수를 헤더 파일과 소스파일에서 아래와 같이 수정한다.

// 헤더 파일 수정

public:

        //virtual BOOL Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);

        virtual BOOL Create(CWnd* pParentWnd = NULL);

 

//소스파일 수정

//BOOL CDlgTemp::Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd)

BOOL CDlgTemp::Create(CWnd* pParentWnd)

{

        // TODO: 여기에특수화된코드를추가및/또는기본클래스를호출합니다.

 

        //return CDialog::Create(lpszTemplateName, pParentWnd);

        return CDialog::Create(IDD, pParentWnd);

}

 

같은 방법으로 다이로그 박스를 만들고 ID “IDD_DLG_CONTROL” 한다. 속성은 앞의 다이어로그와 같이 하고 클래스 이름은 “CDlgControl” 한다. 그리고 Create 함수를 동일하게 만든다.

 

 

Create 함수를 동일하게 수정한다.

// 헤더 파일 수정

public:

        virtual BOOL Create(CWnd* pParentWnd = NULL);

 

//소스파일 수정

BOOL CDlgControl::Create(CWnd* pParentWnd)

{

        // TODO: 여기에특수화된코드를추가및/또는기본클래스를호출합니다.

 

        return CDialog::Create(IDD, pParentWnd);

}

 

SRs232View.h 다이어로그 박스의 헤더 파일을 include 하고 각각의 포인터를 정의 한다.

#pragma once

 

#include "CommThread.h"          // (1)

#include "DlgTemp.h"

#include "DlgControl.h" 

 

class CSRs232View : public CView

{

protected: // serialization에서만만들어집니다.

        CSRs232View();

        DECLARE_DYNCREATE(CSRs232View)

 

// 특성입니다.

public:

        CCommThread m_ComuPort; // (1)

        CSRs232Doc* GetDocument() const;

 

// 작업입니다.

public:

        int nActDlg; // 화면에작업중인판넬번호

        CDlgTemp *pDlgTemp;   //다이어로그박스를포인터로선언m_nActPanel=0

        CDlgConfig *pDlgConfig;      //다이어로그박스를포인터로선언m_nActPanel=1

 

// 재정의입니다.

 

메뉴에 온도보기 ID “ID_Menu_DlgTemp” 하고 온도제어변수 ID “,ID_Menu_DlgControl” 만든다.

CSRs232View 클래스를 선택하고 속성에서 ID_Menu_DlgTemp Command 함수를 만든다. 같은 방법으로 ID_Menu_DlgControl Command 함수를 만든다.

 

CSRs232View 클래스에 메뉴를 선택하면 해당하는 다이어로그박스를 띄우기 위한 함수를 만든다.

CSRs232Doc 클래스에 온도를 저장하기 위한 변수를 선언한다.

 

// SRs232Doc.h : CSRs232Doc 클래스의인터페이스

//

 

#pragma once

 

class CSRs232Doc : public CDocument

{

protected: // serialization에서만만들어집니다.

        CSRs232Doc();

        DECLARE_DYNCREATE(CSRs232Doc)

 

// 특성입니다.

public:

        double dTemp; //현재온도저장

 

 

IDD_DLG_TEMP 다이어로그 박스에 도구상자 CWNumEdit Control 숫자 표시창을 넣고 마우스 오른쪽키를 눌러 변수추가를 선택하고 변수명을 “m_dTemp” 한다.

 

그래프를 추가하고 변수명을 “m_Graph” 한다.

CDlgTemp 클래스에 아래와 같이 현재 데이터를 업데이트 하기 위한 함수를 만든다.

 

 

#include "stdafx.h"

#include "SRs232.h"

#include "DlgTemp.h"

 

// 다음순서대로해더파일을추가해야에러가없다.

#include "MainFrm.h"        

#include "SRs232Doc.h"

#include "SRs232View.h"

 

//===============  생략 =====================

void CDlgTemp::UpdatePanelData(void)

{

        m_dTemp.Value=((CSRs232Doc *)((CMainFrame *)AfxGetMainWnd())->GetActiveDocument())->dTemp;

       m_Graph.GetPlots().Item("Plot-1").ChartY(m_dTemp.Value);

}

 

 

View 클래스에서 다음을 수정한다.

LONG CSRs232View::OnCommunication(UINT port, LONG lParam)  // (7)

{

        BYTE aByte=0x00;

        int size= (m_ComuPort.m_QueueRead).GetSize();

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

        {

                (m_ComuPort.m_QueueRead).GetByte(&aByte);

                if(aByte==0x02) iText=0; // 통신시작을나타낸다.

                if( aByte!= NULL ) buff[iText++]= aByte;

                else { iText--; size--; }

        }

 

        CSRs232Doc* pDoc = GetDocument();

        if(aByte==0x0A) {// 통신끝을나타낸다.

                if(buff[3]=='D' && buff[4]=='R' && buff[5]=='S' && buff[7]=='O' && buff[8]=='K') {

                        dTemp=StringToDouble(&buff[10])/10.;

                        //RedrawWindow();

                        pDoc->dTemp = dTemp;

                     pDlgTemp->UpdatePanelData();

                }

        }

 

        return 0;

}

 

다음은 프로그램이 시작하면 화면에 바로 온도 다이어로그박스가 나오도록 프로그램한다.

CSRs232App::InitInstance() 함수에 다음을 추가한다.

BOOL CSRs232App::InitInstance()

{

        // 응용프로그램매니페스트가ComCtl32.dll 버전6 이상을사용하여비주얼스타일을

        // 사용하도록지정하는경우, Windows XP 상에서반드시InitCommonControlsEx()가필요합니다.

        // InitCommonControlsEx()를사용하지않으면창을만들수없습니다.

        INITCOMMONCONTROLSEX InitCtrls;

        InitCtrls.dwSize = sizeof(InitCtrls);

        // 응용프로그램에서사용할모든공용컨트롤클래스를포함하도록

        // 이항목을설정하십시오.

        InitCtrls.dwICC = ICC_WIN95_CLASSES;

        InitCommonControlsEx(&InitCtrls);

 

        CWinApp::InitInstance();

 

        // OLE 라이브러리를초기화합니다.

        if (!AfxOleInit())

        {

                AfxMessageBox(IDP_OLE_INIT_FAILED);

                return FALSE;

        }

        AfxEnableControlContainer();

        // 표준초기화

        // 이들기능을사용하지않고최종실행파일의크기를줄이려면

        // 아래에서필요없는특정초기화

        // 루틴을제거해야합니다.

        // 해당설정이저장된레지스트리키를변경하십시오.

        // TODO: 이문자열을회사또는조직의이름과같은

        // 적절한내용으로수정해야합니다.

        SetRegistryKey(_T("로컬응용프로그램마법사에서생성된응용프로그램"));

        LoadStdProfileSettings(4);  // MRU를포함하여표준INI 파일옵션을로드합니다.

        // 응용프로그램의문서템플릿을등록합니다. 문서템플릿은

        //  문서, 프레임창및뷰사이의연결역할을합니다.

        CSingleDocTemplate* pDocTemplate;

        pDocTemplate = new CSingleDocTemplate(

                IDR_MAINFRAME,

                RUNTIME_CLASS(CSRs232Doc),

                RUNTIME_CLASS(CMainFrame),       // SDI 프레임창입니다.

                RUNTIME_CLASS(CSRs232View));

        if (!pDocTemplate)

                return FALSE;

        AddDocTemplate(pDocTemplate);

 

 

 

        // 표준셸명령, DDE, 파일열기에대한명령줄을구문분석합니다.

        CCommandLineInfo cmdInfo;

        ParseCommandLine(cmdInfo);

 

 

        // 명령줄에지정된명령을디스패치합니다.

        // 응용프로그램이/RegServer, /Register, /Unregserver 또는/Unregister로시작된경우FALSE를반환합니다.

        if (!ProcessShellCommand(cmdInfo))

                return FALSE;

 

        // 창하나만초기화되었으므로이를표시하고업데이트합니다.

        m_pMainWnd->ShowWindow(SW_SHOW);

        m_pMainWnd->UpdateWindow();

 

        ((CSRs232View *)((CMainFrame *)AfxGetMainWnd())->GetActiveView())->pDlgTemp->ShowWindow(SW_MAXIMIZE);;

 

        // 접미사가있을경우에만DragAcceptFiles를호출합니다.

        //  SDI 응용프로그램에서는ProcessShellCommand 후에이러한호출이발생해야합니다.

        return TRUE;

}

 

 arrow01c처음