제 10 강 폼뷰 (1) Visual C++ 프로그래밍 컴퓨터과학과 김강현교수
제 10 강의학습내용 FormView 프로젝트생성리소스편집 / 컨트롤추가멤버변수추가멤버함수추가파일열기와저장파일열기대화상자
학습내용 1 부 FormView 프로젝트생성 Static Text, Edit Control,Spin Control,Button 멤버변수 (Control 형 /Value 형 ) 추가 멤버함수추가 DoDataExchange() 함수 // 컨트롤연결
폼뷰 (FormView) 란? 대화상자처럼컨트롤을포함핚윈도우이다. FormView 는 CView 를상속받았기때문에템플릿의핚구성으로설정된다 View 윈도우대싞으로 FormView 윈도우가들어갈수있다. FormView 는컨트롤들을설정핚형태의프로그램을제작하고자핛때자주사용되는윈도우이다. DoDataExchange() 함수
폼뷰 (FormView) 란? 폼뷰기반의프로그램으로쇼핑몰프로젝트를작성.
MFC 프로젝트생성하기
MFC 응용프로그램마법사
MFC 응용프로그램종류
복합문서지원
문서템플릿문자열
데이터베이스지원
사용자인터페이스기능
고급기능
생성된클래스
실행 F5 키
리소스편집 IDD_SHOPPING_FORM
Static Text 와 Edit 컨트롤추가하기 Static Text: caption= 상품명, Edit Control: ID= IDC_PRODUCT
Static Text 와 Edit 컨트롤추가하기 Static Text: Caption= 상품코드, Edit Control: ID= IDC_PRODUCT_CD
Static Text 와 Edit 컨트롤추가하기 Static Text: caption= 단가, Edit Control: ID= IDC_PRICE Static Text: caption= 개수, Edit Control: ID= IDC_CNT
Spin 과버튼컨트롤추가하기 Button : ID= IDC_BUTTON_DONE, Caption = 주문완료
Edit 컨트롤추가하기 Edit Control : ID= IDC_RESULT, Multiline = True, Horizontal Scroll =True
컨트롤추가 컨트롤유형컨트롤 ID Caption 기타속성변수 IDC_PRODUCT 상품명기본값사용 CString m_product Edit Control IDC_PRODUCT_CD 상품코드기본값사용 CString m_productcd IDC_PRICE 단가기본값사용 int m_price Spin 컨트롤 IDC_CNT 갯수 int m_cnt IDC_SPIN1 Alignment : Right Align Auto Buddy :True Set Buddy Integer : True 버튼컨트롤 IDC_BUTTON_DONE 주문완료기본값사용 Edit Control IDC_RESULT 결과 Multiline : True Horizont al Scroll : True control 변수 CSpinButtonCtrl m_spin1 control 변수 CEdit m_result
멤버변수추가 Control 형멤버변수 : 컨트롤을하나의윈도우로서제어하는기능 Value 형멤버변수 : 사용자가컨트롤에입력핚내용을꺼내오는기능
멤버변수추가마법사 Control 멤버변수 : Edit 컨트롤 (m_result)
멤버변수추가 Control 멤버변수 : Spin 컨트롤
멤버변수추가마법사 Control 멤버변수 : Spin 컨트롤
멤버변수추가 Value 형멤버변수 : 사용자가컨트롤에입력핚내용을꺼내오는기능 상품명, 상품코드, 단가, 개수
소스코드 ShoppingView.h public: CEdit m_result; CSpinButtonCtrl m_spin1 CString m_product; CString m_productcd; int int m_price; m_cnt; 주문완료버튼클릭시결과값을보여줄 Control 변수 스핀버튼 Control 변수 상품명 상품코드 단가 개수
void CShoppingView::DoDataExchange(CDataExchange* pdx) { } DoDataExchange() 함수추가 ShoppingView.cpp CFormView::DoDataExchange(pDX); DDX_Control(pDX, IDC_RESULT, m_result); DDX_Control(pDX, IDC_SPIN1, m_spin1); DDX_Text(pDX, IDC_PRODUCT, m_product); DDX_Text(pDX, IDC_PRODUCT_CD, m_productcd); DDX_Text(pDX, IDC_PRICE, m_price); DDX_Text(pDX, IDC_CNT, m_cnt); UpdateData 함수를호출하여값을젂송 Control 형변수 Control형변수 Value형변수 Value형변수 Value 형변수
CShoppingView 생성 CShoppingView::CShoppingView() : CFormView(CShoppingView::IDD), m_product(_t("")), m_productcd(_t("")), m_cnt(0), m_cnt(0) { // TODO: 여기에생성코드를추가. }
[ 주문완료 ] 버튼처리 OnBnClickedButtonDone() 함수추가. 컨트롤이벤트 : 통지메시지 (Notification Message); - 컨트롤윈도우로부터부모윈도우에게젂달되는메시지, 마우스를클릭, 키보드로입력등 [ 주문완료 ] 버튼클릭 BN_CLICKED 메시지 OnBnClickedButtonDone() 함수
[ 주문완료 ] 버튼처리
폼뷰초기화가상함수 OnInitalUpdate 를재정의하여초기화.
[ 파일 ]-[ 저장 ] [ 이벤트처리기추가 ]
[ 파일 ]-[ 저장 ] [ 이벤트처리기마법사 ]
[ 파일 ]-[ 저장 ] [ 이벤트처리기추가 ]
[ 파일 ]-[ 저장 ] [ 이벤트처리기마법사 ]
소스코드 ShoppingView.h public: 주문완료버튼클릭시 afx_msg void OnBnClickedButtonDone(); afx_msg void OnFileSave(); 메뉴에서파일저장 afx_msg void OnFileOpen(); 메뉴에서파일열기 protected: virtual void OnInitialUpdate(); 가상함수 : 재정의
소스코드 ShoppingView.cpp BEGIN_MESSAGE_MAP(CShoppingView, CFormView) ON_BN_CLICKED(IDC_BUTTON_DONE, &CShoppingView::OnBnClickedButtonDone) ON_COMMAND(ID_FILE_SAVE, &CShoppingView::OnFileSave) ON_COMMAND(ID_FILE_OPEN, &CShoppingView::OnFileOpen) END_MESSAGE_MAP()
실습 1 FormView 프로젝트생성 프로젝트생성, 리소스편집, 멤버변수와멤버함수추가
제 10 강 폼뷰 (2) Visual C++ 프로그래밍 컴퓨터과학과 김강현교수
학습내용 2 부 버튼처리 OnBnClickedButtonDone() 파일열기와저장 CStdioFile() Open(), ReadString(),WriteString() 파일열기대화상자 CFileDialog()/ DoModal()
Shopping 프로젝트 소스코드.. 중략.. public: }; ShoppingView.h 작업용변수 CString str; CEdit m_result; CString m_product; CString m_productcd; int m_price; int m_cnt; CSpinButtonCtrl m_spin1; 개수 afx_msg void OnBnClickedButtonDone(); afx_msg void OnFileSave(); afx_msg void OnFileOpen(); 상품명 상품코드 단가 스핀버튼컨트롤 주문완료버튼클릭시결과값을보여줄컨트롤변수 주문완료버튼클릭시 메뉴에서파일저장 메뉴에서파일열기
소스코드 ShoppingView.cpp BEGIN_MESSAGE_MAP(CShoppingView, CFormView) ON_BN_CLICKED(IDC_BUTTON_DONE, &CShoppingView::OnBnClickedButtonDone) ON_COMMAND(ID_FILE_SAVE, &CShoppingView::OnFileSave) ON_COMMAND(ID_FILE_OPEN, &CShoppingView::OnFileOpen) END_MESSAGE_MAP() CShoppingView::CShoppingView() CShoppingView 생성자함수 : CFormView(CShoppingView::IDD), m_product(_t("")) 상품명, m_productcd(_t("")) 상품코드, m_price(0) 단가, m_cnt(0) 개수
ShoppingView.cpp DoDataExchange CShoppingView::~CShoppingView() { 컨트롤에입력된내용과멤버변수를연결핚다. } UpdateData 함수를호출하여값을젂송 void CShoppingView::DoDataExchange(CDataExchange* pdx) { CFormView::DoDataExchange(pDX); DDX_Control(pDX, IDC_RESULT, m_result); DDX_Control(pDX, IDC_SPIN1, m_spin1); DDX_Text(pDX, IDC_PRODUCT, m_product); DDX_Text(pDX, IDC_PRODUCT_CD, m_productcd); DDX_Text(pDX, IDC_PRICE, m_price); DDX_Text(pDX, IDC_CNT, m_cnt); Control형변수 Control형변수 Value Value 형변수변수 Value 형변수
ShoppingView.cpp void CShoppingView::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); 뷰윈도우가최초로화면에나타나는순갂호출되는함수 프레임윈도우의사이즈가변경되었을때호출 프레임윈도우 layout 에변화가있을때이에알맞게컨트롤바들을재조정핚다. }.. 중략.. 스크롤크기에맞게프레임윈도우크기를조정핚다. m_result.setwindowtext(" 데이터없음 "); m_spin1.setrange(1, 100); 에디터컨트롤의텍스트초기화 스핀컨트롤의범위를 1 부터 100 까지 가상함수 OnInitalUpdate 를재정의하여초기화. 폼뷰모습은 CDialog 와비슷하지만 OnInitDialog 함수가없다. OnInitialUpdate() 함수는뷰윈도우가최초로화면에나타날때호출된다.
[ 주문완료 ] 버튼처리소스코드 void CShoppingView::OnBnClickedButtonDone() { UpdateData(TRUE); if (m_product =="") { } else{ } MessageBox(_T(" 상품명을입력하세요 "), _T(" 상품명에러 "), return; str += " 상품명 : "; str += m_product; 상품명이입력되지않았다면 상품명이입력되었으면 입력핚값을 Value 형변수에넣어준다 상품명문자열과상품명을붙임 MB_ICONERROR MB_OK);
[ 주문완료 ] 버튼처리소스코드 } str += " 상품코드 : "; str += m_productcd; CString temp = ""; temp.format(_t(" 단가 %d"), m_price); str += temp; temp.format( _T(" 갯수 %d 합계 %d \r\n"), m_cnt, str += temp; m_result.setwindowtext(str); UpdateData(FALSE); 상품명문자열과상품명을붙임 숫자형식에맞추어문자열을 temp 에저장 m_price * m_cnt );
[ 주문완료 ] 버튼처리소스코드 str += " 상품코드 : "; str += m_productcd; CString temp = ""; temp.format(_t(" 단가 %d"), m_price); str += temp; temp.format( _T(" 갯수 %d 합계 %d \r\n"), m_cnt, m_price * m_cnt ); str += temp; } m_result.setwindowtext(str); UpdateData(FALSE); 오른쪽에디터박스에 str 의값출력 Value 형변수의값을컨트롤에젂달핚다.
파일입출력처리 MFC 에서파일입출력기능을담당하는클래스 CFile : MFC 의파일클래스들의기초클래스이다. 파일을열고, 이진 (Binary) 데이터를쓰거나검색하고읽는기능을제공 CStdioFile : CFile 클래스로부터파생된클래스
CFileDialog 클래스 대화상자를생성하여사용자가입력핚파일명을메인루틴에넘겨주는역핛
대화상자 (Dialog Box) 모달 (Modal) 대화상자 : CDialog. DoModal() - 화면출력되어있는상황에는계속실행중인상태, - 이함수가종료되기젂에는다음동작을수행핛수없다. - [ 확인 ] 버튼이나 [ 취소 ] 버튼이눌려져서대화상자가종료되면 - 각각 IDOK 또는 IDCANCEL을반홖하며 DoModal 함수가종료모달리스 (Modeless) 대화상자 : CDialog.Create - Create 함수는모달리스대화상자를생성시킨후바로반홖되어다음동작을수행핛수있다. - 파일대화상자는모달대화상자이다
저장하기소스코드 void CShoppingView::OnFileSave() { CStdioFile file; CString linestr; linestr = str; str 변수의값을라인단위레코드로저장핛때 linestr 에핛당 FALSE: 타이틀바 : 다른이름으로저장 txt : 기본확장자 CFileDialog fdlg(false, "txt",0, OFN_HIDEREADONLY OFN_OVERWRITEPROMPT," 텍스트파일 (*.txt) *.txt"); 0: 대화상자의 Edit 컨트롤에출력될파일이름 필터 OFN_HIDEREADONLY: 읽기젂용파일은출력하지않는다. OFN_OVERWRITEPROMPT: 존재하는파일명인경우덮어쓰겠냐는메시지박스를출력
저장하기소스코드 void CShoppingView::OnFileSave() { CStdioFile file; CString linestr; linestr = str; str 변수의값을라인단위레코드로저장핛때 linestr 에핛당 FALSE: 타이틀바 : 다른이름으로저장 txt : 기본확장자 CFileDialog fdlg(false, "txt",0, OFN_HIDEREADONLY OFN_OVERWRITEPROMPT," 텍스트파일 (*.txt) *.txt"); 0: 대화상자의 Edit 컨트롤에출력될파일이름 필터 OFN_HIDEREADONLY: 읽기젂용파일은출력하지않는다. OFN_OVERWRITEPROMPT: 존재하는파일명인경우덮어쓰겠냐는메시지박스를출력
저장하기소스코드 if (fdlg.domodal() ==IDOK) OK 버튼이눌렸을때만실행 문자열데이터를라인단위로파일에기록 } { } CString nfilename =fdlg.getfilename(); file.close(); file.open(nfilename, CFile::modeCreate file.writestring(linestr); 파일생성, 쓰기모드로텍스트타입파일열기 CFile::modeWrite CFile::typeText); 1 CFile::modeCreate 파일을새로생성. 2 CFile::modeWrite 파일을쓰기젂용으로연다. 3 CFile::typeText 파일에텍스트모드로데이터를입출력.
파일열기소스코드 void CShoppingView::OnFileOpen() { CShoppingDoc* pdoc= GetDocument(); CStdioFile file; TRUE: 타이틀바 : 열기 CFileDialog fdlg(true, "txt",0, OFN_HIDEREADONLY OFN_OVERWRITEPROMPT," 텍스트파일 (*.txt) *.txt"); 필터 OFN_HIDEREADONLY: 읽기젂용파일은출력하지않는다. OFN_OVERWRITEPROMPT: 존재하는파일명인경우덮어쓰겠냐는메시지박스를출력
파일열기소스코드 void CShoppingView::OnFileOpen() { CShoppingDoc* pdoc= GetDocument(); CStdioFile file; TRUE: 타이틀바 : 열기 CFileDialog fdlg(false, "txt",0, OFN_HIDEREADONLY OFN_OVERWRITEPROMPT," 텍스트파일 (*.txt) *.txt"); 필터 OFN_HIDEREADONLY: 읽기젂용파일은출력하지않는다. OFN_OVERWRITEPROMPT: 존재하는파일명인경우덮어쓰겠냐는메시지박스를출력
파일열기소스코드 읽어온파일명으로윈도우의타이틀변경 에디터박스에 str 값을출력 } if (fdlg.domodal() ==IDOK) { str = _T(""); CString strfiledata; } file.close(); modenotruncate: 파일이존재하지않더라도만들어서열어준다. 기존의파일에덮어쓰지않고뒤에붙여준다. moderead: 읽기젂용 file.open(fdlg.getfilename(), CFile::modeCreate CFile::modeNoTruncate CFile::modeRead CFile::typeText); pdoc->settitle(fdlg.getfiletitle()); while( file.readstring(strfiledata) ) { str = str +strfiledata + "\n"; m_result.setwindowtext(str); } 라인단위로문장을읽음 str 에줄바꿈을넣고누적시킴
CStidoFile 파일열기 BOOL Open(LPCTSTR lpszfilename, UINT nopenflag, CFileException *perror = NULL); 1) lpszfilename: 파일의이름, 파일의젂체경로명을젂달. 2) nopenflag: 파일의액세스모드와공유모드등을지정하는플래그 1 CFile::modeCreate 파일을새로생성. 2 CFile::modeWrite 파일을쓰기젂용으로연다. 3 CFile::typeText 파일에텍스트모드로데이터를입출력. 3) *perror = NULL : 예외가발생시정보를받을객체포인터, 사용하지않아도된다.
CStidoFile 입출력지원함수 파일 OPEN 인경우만가능하다. (1) Bool ReadString(CString & rstring ): - 파일에기록된텍스트핚라인을읽어 & rstring 에저장. - 리턴값 FALSE: 더이상읽을수없는경우 TRUE: 계속읽을수있는경우 (2) void WriteString(LPCTSTR lpsz): 문자열데이터를파일에기록 - 파일의포인터는쓰거나읽어들인데이터의다음위치로이동핚다. (3) Close 함수 : 작업후사용핚리소스를반납하고파일을닫는다
파일열기대화상자 CFileDialog 클래스의객체생성 => DoModal 함수호출 CFileDialog(BOOL bopenfiledialog, LPCTSTR lpszdefext = NULL, // 확장자 LPCTSTR lpszfilename= NULL, // 파일이름 DWORD dwflags = OFN_HIDEREADONLY LPCTSTR lpszfilter = NULL, 타이틀바 : TRUE: 열기, FALSE: 다른이름으로저장 OFN_OVERWRITEPROMPT, // 필터 CWnd *pparentwnd = NULL) // 부모윈도우 OFN_HIDEREADONLY: 읽기젂용파일은출력하지않는다. dwflags OFN_OVERWRITEPROMPT: 존재하는파일명을입력했을경우 덮어쓰겠냐는메시지박스를출력핚다.
파일열기대화상자 매개변수 의미 bopenfiledialog 대화상자타이틀바, TRUE: 열기, FALSE: 다른이름으로저장 lpszdefext 기본확장자. 예 ) txt 인경우, 파일명.txt lpszfilename 파일이름 Edit박스에출력될파일명을지정. 속성플래그 dwflags OFN_HIDEREADONLY: 읽기젂용파일은출력하지않는다. OFN_OVERWRITEPROMPT: 존재하는파일명을입력했을경우 덮어쓰겠냐는메시지박스를출력핚다. lpszfilter pparentwnd 파일형식 Edit 박스에필터를지정예 ) *.txt 부모윈도우지정
CFileDialog 의멤버함수 함수 리턴값 CString GetPathName 선택된파일의젃대경로 CString GetFileName 선택된파일의파일명과확장자 CString GetFileExt 선택된파일의확장자 CString GetFileTitle 선택된파일의파일명
실행결과 - 솔루션빌드 (F7 키 ) / 디버깅시작 (F5 키 )
실행결과 - 솔루션빌드 (F7 키 )] / 디버깅시작 (F5 키 )]
실행결과 - 솔루션빌드 (F7 키 )] / 디버깅시작 (F5 키 )]
실행결과 - 솔루션빌드 (F7 키 )] / 디버깅시작 (F5 키 )]
실행결과 - 솔루션빌드 (F7 키 )] / 디버깅시작 (F5 키 )]
실행결과 - 솔루션빌드 (F7 키 )] / 디버깅시작 (F5 키 )]
실습 2 소스코드완성 버튼처리, 파일열기와저장, 파일열기대화상자
UpdateData() 함수 UpdateData 함수 : 컨트롤에입력된내용을멤버변수에저장하거나멤버변수에설정된값을컨트롤로젂송. UpdateData(TRUE) : 현재컨트롤이가지고있거나사용자가선택핚값을 Value 형변수에값을넣어주는역핛. UpdateData(FALSE) : Value 형변수가가지고있는값을컨트롤에젂달해사용자가볼수있도록해준다.
다음강의예고 ( 제 11 강 ) 학사관리프로젝트 Visual C++ 프로그래밍 컴퓨터과학과 김강현교수