[VC++] 시리얼 통신 프로그램 만들기[3-2] – 설정 다이얼로그 만들기

통신 설정 윈도우에 대한 사용자 화면을 만들었으므로 여기에 다이얼로그 클래스를 생성시켜 연결시켜 보겠습니다.

 

ResourceView 에서 ”통신 포트 설정” 다이얼로그 박스의 타이틀 바를 더블클릭하면 아래 그림처럼 클래스 위저드를 통해 새로 만들어진 다이얼로그 박스에 대한 클래스 코드를 적용시킬 것인지 물어봅니다.

CreateClass

 

우리는 이에 대한 클래스를 새로 만들것이므로 ”Create New Claass” 를 선택 한 후 ”OK” 버튼을 누르면 새로 만들어질 클래스를 정의할 수 있습니다.

CComSettingsDialog

위 그림처럼 클래스명을 ”CComSettingsDialog” 라고 입력하고 Dialog ID 값이 ”IDD_COM_SETTINGS” 라는 것을 확인 후 ”OK” 버튼을 누릅니다.

그리고나서 Workspace 창에서 FileView 탭을 보면 소스와 헤더에 ComSettingsDialog.cpp 와 ComSettingsDialog.h 파일이 만들어 진 것을 알 수 있습니다.

 

CMainFrame 에서 관리되는 m_Serial 이라는 변수를 이 다이얼로그가 생성될 때 다이얼로그 클래스에게 넘겨주기 위해 CComSettingsDialog 클래스의 생성자에 매개변수값을 추가해줍니다.

통신설정 다이얼로그 내에서 이 변수의 포인터를 접근하여 시리얼 관련 동작을 사용할 수 있게 하기 위함입니다.

 

우선  ”ComSettingsDialog.h” 파일에서 ”SerialMFC.h” 파일을 아래 코드와 같이 인클루드 해줍니다.

CComSettingsDialog 클래스 에서 SerialMFC 의 기능을 사용하기 위해 변수를 선언해줘야 하니까요.

#include "SerialMFC.h"

 

CComSettingsDialog 클래스 정의부에서 아래와 같이 m_pSerial 멤버 변수를 public 혹은 protected 로 추가해줍니다.


public:
	CSerialMFC* m_pSerial;

 

”ComSettingsDialog.h” 파일에서 생성자 멤버함수 선언부를 아래 코드와 같이 수정해줍니다.

CComSettingsDialog(CSerialMFC* pSerial, CWnd* pParent = NULL);

 

”ComSettingsDialog.cpp” 파일 에서 생성자 멤버함수 정의부를 아래 코드와 같이 수정해주고 매개변수로 받은 pSerial 변수를 m_pSerial 멤버변수에 대입시켜줍니다.

생성자를 호출하면서 호출하는 쪽의 CSerialMFC 변수의 포인터를 넘겨주면 ComSettingsDialog 다이얼로그가 생성되면서 이 포인터 변수를 받아 시리얼 포트의 설정에 필요한 값들을 참조할 것입니다.

CComSettingsDialog::CComSettingsDialog(CSerialMFC* pSerial, CWnd* pParent /*=NULL*/)
	: CDialog(CComSettingsDialog::IDD, pParent)
{
	//{{AFX_DATA_INIT(CComSettingsDialog)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_pSerial = pSerial;
}

 

새로 만들어진 ”통신 포트 설정” 다이얼로그를 ComConstructor 프로그램 사용시 상위 메뉴를 통해서 불러 올 수 있게 하겠습니다.

본 글 ”시리얼 통신 프로그램 만들기 -2” 4 번째 페이지 ”통신기능 부여하기” 에서 ”접속” 과 ”접속 종료” 메뉴를 만들 때 처럼 상위 메뉴 에디터 (Workspace 의 ResourceView -> Menus) 로 들어가 미리 만들어놓은 ”통신 포트 설정” 메뉴를 확인하고 ”Ctrl+W” 키를 눌러 클래스 위저드를 불러냅니다.

그리고 아래 그림처럼 클래스 위저드 박스에서 CMainFrame 에서 ”ID_CONNECT” ID 값을 찾아 오른쪽 ”Message” 항목에서 ”COMMAND” 를 눌러 핸들러 함수를 만듭니다.

ID_COMSETTING

그러면 CMainFrame 클래스에 ”OnComsetting” 멤버 함수가 만들어지고 해당 함수가 정의된 위치로 커서가 가게 됩니다. 이어서 아래와 같이 코드를 추가하여 메뉴에서 ”통신 포트 설정” 을 클릭하면 다이얼로그 박스가 띄워지게끔 만들어줍니다.

 

CComSettingsDialog 클래스의 생성자가 바뀌었으므로 다이얼로그를 생성하는 부분에 매개변수 ”&m_Serial” (시리얼 클래스의 인스턴스 주소) 가 들어가도록 합니다.

void CMainFrame::OnComsetting()
{
    CComsettingDialog dlg(&m_Serial);
    dlg.DoModal;
}

 

위 코드처럼 ”MainFrame.cpp” 파일 내에서 CComsettingDialog 클래스를 사용하기 위해선 ”ComsettingDialog.h” 파일을 인클루드 해줘야 하므로 파일의 최상단에 아래 코드를 적어줍니다.

#include "CComSettingsDialog.h"

 

그러면 컴파일 후, 상위메뉴의 ”파일->통신 포트 접속” 을 클릭하면 다이얼로그 박스가 띄워지는 것을 확인하실 수 있습니다.

그런데 메뉴의 ”접속” 을 실행하면 이 ”통신포트 접속” 메뉴는 비활성화 되게 하는것이 좋겠습니다. 이것은 다시 클래스 위저드를 불러 아래 그림과 같이 ID_COMSETTING 에 대한 UPDATE_COMMAND_UI 메세지 처리 함수를 CMainFrame 에 생성되게끔 ”Class Name” 항목을 맞춰주고 오른쪽 ”Add Function” 버튼을 누르면 ”Member functions : ” 항목의 리스트에 새로운 함수 이름이 올라옵니다.

통신포트 설정 메뉴의 비활성화를 위한 클래스 위저드 작업

 

리스트에서 OnUpdateComsetting 이라는 이 새로운 함수에 마우스 더블클릭을 하면 코드 에디터 화면으로 바뀌는데 함수의 내용을 아래와 같이 입력합니다.

void CMainFrame::OnUpdateComsetting(CCmdUI* pCmdUI)
{
    if(m_Serial.IsOpen())
        pCmdUI->Enable(FALSE);
    else
        pCmdUI->Enable(TRUE);
}

이 코드에 의해 시리얼 접속이 있으면 해당 메뉴 항목을 비활성화 하고 그 반대이면 활성화 시킵니다. 내용이 메뉴의 ”접속” 에 대한 같은 메세지 처리기의 코드와 같군요.

 

이 후 새로 만들어진 다이얼로그 박스에 대한 프로그래밍을 해보겠습니다.

 

 

이 글을 공유하기:

Be the first to comment

Leave a Reply