510 likes | 1.11k Views
2 주차. Visual C++ 프로그램 구조 및 작성단계. 1. 3 MFC 의 개요 (1) MFC 의 구조 (2) 클래스 구성 1.4 Visual C++ 프로그램 구조 및 작성단계 (1) Visual Developer Studio 의 구성 (2) Visual C++ 프로그램 작성 단계 < 실습 1-5> 간단한 문서 편집기 작성 편집기 작성 < 실습 1-6> Hello Program [SDI Application type]
E N D
2주차 Visual C++ 프로그램 구조 및 작성단계 Visual C++
1. 3 MFC의 개요 • (1) MFC의 구조 • (2) 클래스 구성 • 1.4 Visual C++ 프로그램 구조 및 작성단계 • (1) Visual Developer Studio의 구성 • (2) Visual C++ 프로그램 작성 단계 • <실습 1-5>간단한 문서 편집기 작성 편집기 작성 • <실습 1-6> Hello Program [SDI Application type] • <실습 1-7> Hello Program[Dialog Based] Visual C++
1장 • Visual Developer Studio의 구성 Visual C++
1장 • Visual C++ 프로그램 작성 단계 • 첫 번째 과정 : 프레임워크 생성 • 두 번째 과정 : 자원편집 • 세 번째 과정 : Class 멤버변수 정의 및 초기화 • 네 번째 과정 : Class 멤버함수 코딩 • 다섯 번째 과정 : Build 및 실행 • ※ 응용마법사와 클래스 마법사 Visual C++
1장 2주차 MFC 프로그램 • 복잡한 API를 마이크로소프트사가 응용프로그래머가 편리하게 사용할 수 있도록 클래스로 포장하여 MFC(Microsoft Foundation Classes) 라는 라이브러리에 넣어 제공 Visual C++
MFC 상속 < 응용프로그램의 프레임워크 클래스 > 1장 • 응용마법사 - SDI 프로토타입 생성시 SDI형 프로토타입 생성 4개의 클래스 생성 Visual C++
MFC 상속 1장 • 응용마법사 - Dialog Based 프로토타입 생성시 대화상자형 프로토타입 생성 2개의 클래스 생성 대화상자를 통한 입출력 수행 기능은 CDlg 클래스에서 작성 Visual C++
1장 <실습 1-7> Hello Program[Dialog Based] Visual C++
대화상자 • 대화상자 기반과 SDI 또는 MDI 기반의 차이점 • View 클래스와 Document 클래스가 만들어지지 않음 • 입출력 수행시 대화상자의 각종 컨트롤을 통해서 행함 • 프로그램에서 발생되는 자료들 별도의 클래스를 만들어서 처리 또는 Dlg 클래스에서 별도 처리해야 함.
대화상자 • 다이얼로그 기반의 프로그램 • 애플리케이션 클래스와 다이얼로그 클래스로 구성
대화상자 2가지 유형 • 모달 대화상자 • 현재 사용중인 대화상자 종료후에 다른 대화상자 사용가능한 형태 • 예) 삭제시 나타나는 대화상자 • 비모달대화상자 • 현재 사용중인 대화상자 종료 전에도 다른 대화상자 사용가능한 형태 • 예) 찾기 대화상자 Visual C++
대화상자 • 메시지 박스 사용 • 가장 단순한 형태의 대화상자 • MFC 클래스 라이브러리 이용 • AfxMessageBox 함수 이용함 int AfxMessageBox (본문내용, 버튼 | 아이콘) 예) AfxMessageBox(“덮어쓸까요?“ , MB_YESNO | MB_ICONQUESTION); Visual C++
대화상자 int n = AfxMessageBox("덮어쓸까요?", MB_YESNOCANCEL | MB_ICONQUESTION); if(n == IDYES) pDC->TextOut(50,50, "예 선택했군요"); else if(n == IDNO) pDC->TextOut(50,50, "아니오 선택했군요"); else pDC->TextOut(50,50, "취소 선택했군요"); Visual C++
SetWindowText 함수 • CWindow::SetWindowText • 윈도우 제목줄의 문자열 변경시에 사용하는 함수임. • 사용예 SetWindowText(“제목줄 문자열 출력내용임”); BOOL SetWindowText( LPCTSTR lpszString ) throw();
EnableWindow 함수 • CWnd::EnableWindow • 객체의 활성화/ 비활성화를 결정지음 • 사용예 m_btnAmp. EnableWindow(TRUE); m_btnAmp에 연결된 컨트롤을 활성화시켜라. BOOL EnableWindow(BOOL bEnable);
ShowWindow 함수 • CWnd::ShowWindow • 윈도우를 화면에 출력하는기능을 함 • nCmdShow : 윈도우를 화면에 출력하는 방법을 지정하며 다음과 같은 매크로 상수들이 정의되어 있다. • SW_HIDE : 윈도우를 숨긴다. • SW_SHOW : 윈도우를 활성화시켜 보여준다. • SW_MINIMIZE : 윈도우를 최소화시키고 활성화시키지 않는다. • SW_RESTORE : 최대, 최소화된 윈도우를 이전 위치로 복구한다. • 사용예 : m_btnAmp.ShowWindow(SW_HIDE); BOOL ShowWindow(intnCmdShow);
SetWindowText 함수 • CWindow::SetWindowText • CWnd 클래스를 상속받은 각 컨트롤들이 이 함수를 사용하게 되면 해당 컨트롤의 문자열변경이 가능하다. • 사용예 CEdit m_ed; m_ed.SetWindowText(“홍길동”); 명령 실행후
GetWindowText 함수 • CWindow::GetWindowText • CWnd 캡션 타이틀을 괄호안의 bstrText에 복사함 • 사용예 CString str; m_str.GetWindowText(str); BOOL GetWindowText( BSTR& bstrText )
CString 함수 • CString • 문자열 형태의 자료형 및 문자열 처리 함수들의 집합체인 클래스 • 사용예 CStringstr; str = “안녕”; • Format 함수 사용예 CStringstr = “나이는 “, sz; int age = 20; sz.Format(“%s %d 입니다”, str, age); AfxMessagebox(sz);
컨트롤과 클래스 연결 • 대화상자의 데이터 관리를 도와주는 함수임 • DDV(dialogData Validation) • 컨트롤과 변수에 연결된 데이터를 확인하는데 사용함 • DDX(dialogData eXcahnge) • 대화상자의컨트롤에 데이터를 보내거나 받을때 사용함. Visual C++
컨트롤과 클래스 연결 • 컨트롤과 클래스의 연결방법- 1번째 • DDX를 이용하는 방법 • 컨트롤과 연결되는 방법 • Value : • 컨트롤과 변수를 연결하여 컨트롤에 입력된 값을 변수에 저장 • DDX_Text계열 함수를 이용하여 자원에 연결
컨트롤과 클래스 연결 Control형 멤버변수 CComboBox m_cb; • Control : • 해당 컨트롤을 제어할 수 있는 컨트롤 클래스와 연결 • DDX_Control계열 함수를 이용하여 자원에 연결
컨트롤과 Value형 멤버 변수 연결 • 다이얼로그 템플릿에서 Value형 멤버 변수와 연결시키려는 컨트롤을 선택[Ctrl]키를 누른 상태에서 마우스 버튼을 더블 클릭
컨트롤과 Value형 멤버 변수 연결 dlg 생성자함수 CxxxDlg::CxxxDlg(CWnd* pParent /*=NULL*/) : CDialog(CNameDlg::IDD, pParent) { //{{AFX_DATA_INIT(CNameDlg) m_strName = _T(""); m_nAge = 0; //}}AFX_DATA_INIT } • 코드의 변화 dlg.h class CxxxDlg : public CDialog { //… //{{AFX_DATA(CNameDlg) enum { IDD = IDD_DIALOG1 }; CString m_strName; int m_nAge; //}}AFX_DATA //… }; void CxxxDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CNameDlg) DDX_Text(pDX, IDC_EDIT1, m_strName); DDX_Text(pDX, IDC_EDIT2, m_nAge); //}}AFX_DATA_MAP } DoDataExchange
컨트롤과 클래스 연결 • 컨트롤과 클래스의 연결방법- 1번째 • DDX 관련 함수 • DDX_Control : 리스트박스, 콤보박스등과 같은 컨트롤들에 대한 리소스를 해당 멤버변수에 연결함 • DDX_Text : 에디터상자 컨트롤을 CString, int, long, UINT 형태의 멤버변수에 연결할때 사용함. • DDX_Check : 체크상자 컨트롤을 int, BOOL 형태의 멤버변수에 연결할때 사용함. • DDX_Radio : 라디오버튼 컨트롤을 해당 멤버 데이터에 연결할때 사용함
컨트롤과 클래스 연결 • 컨트롤과 클래스의 연결방법- 2번째 • 컨트롤의 핸들로 클래스와 연결하는 방법 • 핸들을 얻기 위해 컨트롤의 포인터를 받을 포인터 변수를 선언 • GetDlgItem()함수를 이용하여 컨트롤의 포인터를 선언된 포인터 변수에 치환한다. • 클래스의 멤버를 이용하여 컨트롤을 다룬다. • 예) CListBox *pList; pList = (CListBox *)GeDlgItem(IDC_LIST1); pList->AddString(“데이터”);
컨트롤과 클래스 연결 • DoDataExchange 함수 • MFC 프레임워크가 호출하게 되는 가상함수 • 컨트롤과 대화상자 멤버변수 사이의 자료전송과정을 처리함 • DDX_Text 함수, DDX_Control 함수 이용해 자원과 연결 • DDX_Control 형태로 연결되었을 경우 변수가 클래스를 상속 받으므로 클래스의 멤버 변수를 마음대로 사용할 수 있다. • 이 함수를 직접 호출할 필요없음 • 대신, UpdataData() 함수를 호출함 Visual C++
컨트롤과 Value형 멤버변수사이의 데이터전송 • UpdateData() 함수 • DDX_Value 형태로 연결되었을 경우에 이 함수를 사용하여 자원을 updata 함. • UpdateData(TRUE) : 컨트롤의 데이터 연결 변수에 할당 • UpdateData(FALSE) : 변수의 값 컨트롤에 할당 • UpdateData 함수는 내부적으로 DoDataExchange 함수를 호출
사칙연산 대화상자 만들기 • <실습 3_1> 사칙연산 대화상자 • 두 개의 정수 데이터를 입력받아 사직연산을 수행하는 사용자 정의 대화상자를 만들어 보자. 에디터 박스에 대해 멤버 변수를 선언하고 DDE내에 DDX 계열 함수들을 사용하여 대화상자와 프로그램간의 정보전달을 어떻게 수행하는지 자세히 살펴보기로 하자.
atof 함수 • atoi() : 문자열 인수에 해당하는 int 값 반환. • atoi(“234”) 문자열 234를 정수로 변환 • itoa() : 정수를 문자열로 반환 • itoa(234, buf, n) buf에 234를 n진수로 변환 • atof() : 문자열 인수에 해당하는 double값 반환. • atof(“23.4”) 문자열 23.4를 실수로 변환 • 실수를 문자열로 변환하는 것은 sprintf 이용할 것 • fcvt,gcvt - 실수를 text로 변환 CString -> char * 변환시 CString str;str = "Hello";char* ss = LPSTR(LPCTSTR(str));
sprintf 함수 • Sprintf 함수 • argument를 format 형식에 맞춰서 값을 변환해 buffer에 저장함 • Printf는 내용을 화면에 출력하는 것이고, sprintf는 메모리에 출력하는 것만 다르다. • 예) intsprintf(char*buffer,constchar*format [,argument] ... ); int i = 10.537;char str[80];sprintf(str, "%.2f", i); i의 값을 문자열로 변환해서 str에 저장함
Create 윈도우를 생성 ShowWindow : 컨트롤을 보이기, 감추기 SW_SHOW ,SW_HIDE EnableWindow 윈도우를 활성화 시키거나 비활성화 시킴 SetWindowPos 윈도우의 크기와 위치를 변경 SetWindowText 윈도우의 메인 텍스트를 변경 CWnd 클래스
다이얼로그 상자가 생성될때 발생되는메시지임 주로 컨트롤들의 값 초기화를 할때 사용됨 WM_INITDIALOG
GetSel 선택된 부분의 문자열을 얻어옴 SetSel 특정 부분을 선택 영역으로 설정 ReplaceSel 선택된 부분의 텍스트를 지정한 텍스트로 치환 GetLineCount 편집 박스의 텍스트의 줄 수 반환 GetLine 지정된 라인의 텍스트를 얻어옴 CEdit 클래스
문자열을 추가 함수 : AddString, InsertString AddString 리스트박스의 마지막줄에 항목 추가 리스트박스에 sort 설정시, 새로 추가되는 문자열 자동 정렬됨. m_listBox.AddString(“장미”); InsertString 리스트상의 특정 위치에 항목 추가 m_listBox.InsertString(0, “장미”); 0번째 위치에 장미 항목 추가 보통 리스트박스, 콤보박스의 항목 추가는 프로그램실행 초기에 일어나도록 한다. 이때 항목 초기화를 해주는 함수는 OnInitDialog 함수이다. CListBox, CComboBox 클래스
DeleteString 지정한 위치의 문자열 삭제 m_list.DeleteString(8); 9번째 항목 삭제 ResetContent m_list.ResetCount(); CListBox, CComboBox 클래스
CListBox, CComboBox 클래스 • GetCount • 리스트내에 저장된 항목의 개수 반환 • int cnt = m_list.Getcount(); • GetCurSel • 현재 항목의 첨자값 반환 • int cnt = m_list.GetCursel(); int nItems = listBox.GetCount(); while(nItems > 3 && nItems !=LB_ERR) nItems = listBox.DeleteString(nItmes-1); 4번째 항목부터 마지막항목까지 삭제 Visual C++ 37
GetCurSel, SetCurSel 선택된 문자열의 인덱스 반환하거나 설정 인덱스는 0부터 시작 GetText 현재 선택한 줄의 항목을 제시한 문자열변수에 할당함. m_list.GetText(n, sz); DeleteString, ResetContent : 문자열을 삭제 DeleteString 한 행씩 삭제 ResetContent 전체 행 삭제 GetCount 컨트롤에 들어있는 총 문자열의 수를 반환 CListBox, CComboBox 클래스
ListBox 실습 리스트박스에 InitDialog를 통해서 항목추가를 하고, 항목을 더블클릭하면 해당 항목이 메시지박스를 통해서 출력되도록 한다. 수행 과정 OnInitDialog에 항목추가 코딩 Ctrl + W (클래스 위저드) 리스트박스의 더블클릭메시지 (LBN_DBLCLK) 선택 Add Function 선택 EditCode 선택 CListBox, CComboBox 클래스
ListBox 실습 수행 과정 CListBoxDlgDlg::OnDblclkList1() 함수에 코딩함. CListBox, CComboBox 클래스 int n = m_list.GetCurSel(); if(n != LB_ERR) { CStringsz; m_list.GetText(n, sz); AfxMessageBox(sz); }
CListBox, CComboBox 클래스 • ListBox 실습 • 수행 과정 • 대화상자에 에디트박스와 • 버튼 3개를 추가함 • 리스트박스의 속성에서 • SORT 항목 체크해제함 • Ctrl + W (클래스 위저드) • Member Variable • IDC_EDIT 더블클릭 • 멤버변수 할당함
CListBox, CComboBox 클래스 • ListBox 실습 • 코딩
WM_INITDIALOG 메시지 (OnInitDialog 메시지 핸들러 함수) 컨트롤의 초기화 루틴은 여기 들어간다. 통지 (NOTIFICATION) 메시지 통지 메시지는 컨트롤에 발생한 사건을 알려주기 위해 그 컨트롤을 품고 있는 부모 윈도우인 다이얼로그 박스로 메시지를 보냄 통지 메시지의 전달 통지 메시지는 다이얼로그로 전달이 된다. 컨트롤의 제어
Button BN_CLICKED, BN_DBLCLK Edit Box EN_CHANGE, EN_SETFOCUS, EN_KILLFOCUS List Box LBN_DBLCLK, LBN_SELCHANGE, LBN_SETFOCUS, LBN_KILLFOCUS Combo Box CBN_DBLCLK, CBN_SELCHANGE, CBN_SETFOCUS, CBN_KILLFOCUS, CBN_EDITCHAGE Notification Message
에디트컨트롤과 리스트박스가 결합된 형태의 컨트롤임. 종류 단순콤보박스 : 에디트컨트롤과 리스트박스가 함께 표시됨. 드롭다운 콤보박스 : 리스트박스가 감추어진 형태. 드롭다운 리스트박스 : 드롭다운과 비슷함. 단, 에디트컨트롤을 사용할 수 없다. 콤보박스
속성 GetLBText 콤보박스내 리스트박스의 선택된 값을 반환 M_combo.GetLBText(1, str) ; 2번째 항목의 문자열을 str에 저장함 FindString 콤보박스안의 특정 문자열 검색해서 그 문자열이 위치해 있는 첨자번호를 반환함 M_combo.FindString(-1, “찾고자하는 문자열”) ; -1 다음행부터 제시한 문자열로 시작하는 문자열을 콤보박스내에서 찾음. 콤보박스
메시지 CBN_CLOSEUP 콤보박스의 리스트박스가 열렸다 닫힐때 발생하는 메시지 CBN_EDITUPDATE 콤보박스의 에디트컨트롤에 문자열을 입력한 경우에 발생하는 메시지. 콤보박스
ASSERT 프로그래머가 의도한 대로 입력 값 또는 결과가 정확하게 존재하는지를 확인하기 위한 작업이다 Assert() 는 FALSE 일 때 실패했다고 나타낸다. assert(FALSE) : 메시지로 Assert() 안의 내용이 넘어온다. assert( !"TEST" ) 콤보박스
대화상자에 생성된 컨트롤의 주소를 얻는데 사용함. 프로그래머는 기본적으로 리소스 편집기에서 편집할때 사용한 컨트롤 번호만을 알고 있기 때문에 이 컨트롤 번호를 이용하여 해당 컨트롤의 주소를 얻을 때, 이 함수를 사용합니다. 함수원형 nID : 컨트롤 ID 사용예 CWnd *p_wnd = GetDlgItem(IDC_MY_EDIT); CEdit *p_edit = (CEdit *)GetDlgItem(IDC_MY_EDIT); GetDlgItem CWnd *GetDlgItem(int nID) const;
본문예제 설명 Visual C++