Chap. 1 : C++ 언어및윈도우프로그래밍 = 강의핵심내용 = 1. C++ 프로그래밍언어소개 2. C++ 응용프로그래밍작성 3. 윈도우프로그래밍
1.1 C++ 프로그래밍언어소개 C++ 프로그래밍언어 Developed by B. Stroustrup at AT&T in the early 1980s. Superset of the C language commercially most popular among object-oriented languages of today. C++ supports objects classes, subclasses(derived classes) methods(member functions) instance variables(data members) messages(member function calls) multiple inheritance(derivation) 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 2
주요특징 (significant features) 중첩성 (overloading) 가상함수 (virtual function) 접근제어, visibility control(information Hiding) private, protected, public 다중상속성 (multiple inheritance ) 단점 (drawbacks) 순수한의미의객체지향언어가아님.(a hybrid language) 복잡성증가 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 3
Design Issues of C++ a better C data abstraction OOP Why was C chosen as the base language for C++? it is versatile, terse, and relatively low-level. it is adequate for most system programming tasks. it runs everywhere and on everything. it fits into the UNIX programming environments. 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 4
Observations 1970's : 구조화프로그래밍 (Structured Programming ) 1980's : 구조화프로그래밍에서 OOP로전환 1990's : 객체지향프로그래밍시대 (Age of OOP ) 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 5
몇가지용어들 (terminologies ) 객체 (object) A self-contained software structure which usually models an application domain entity. 객체 = 데이터 (data) + 연산 (operations) A combination of data and operations that represents some real world entity. 클래스 (class) A template from which objects with the same representation and same behavior can be created. 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 6
인스턴스변수 (Instance variables) The variables(data) contained in an object. 메소드 (method) An operation of an object is called method. 메시지 (message) A request to invoke an operation. 행위 (behavior), 연산 (operations) The set of all methods of an object is called its behavior or interface. 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 7
캡슐화 (encapsulation) The data of an object can only be accessed via the methods of the objects. 자료추상화 (data abstraction) Definition of an abstract type. Encapsulation is needed. 상속성 (inheritance) A mechanism which allows a new class to be incrementally defined from an existing class. 다형성 (polymorphism ) A message may behave differently on different classes. User can send a generic message and leave the exact implementation details to the receiving objects. 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 8
1.2 The C++ Sample Program Simple I/O Program : hello.cpp #include <iostream.h> void int main() { cout << "Hello, World!\n"; } The operator << writes its second argument onto the standard output stream cout. It is a binary operator. Overloading : Multiple use of a name. << : shift left or output operator int power(int, int); int power(double, double); 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 9
프로그래밍과정 Editor Source <hello.cpp> Preprocessor Compiler Header Files <iostream.h> Object File hello.obj Object Files Linker Libraries kernel32.lib Executable File(s) \WinRel\hello.exe \WinDebug\hello.exe 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 10
History of C++ Major C++ Timeline 1979 May 1983 Dec 1986 Sep 1987 Nov Dec 1990 May Mar July Nov 1992 Feb Mar May 1994 Sep Work on C with Classes starts C++ named 1st OOPSLA conference 1st USENIX C++ conference(santa Fe, NM) 1st GNU C++ release 1st Boland C++ release 1st ANSI X3J16 Technical meeting Templates accepted(seattle, WA) Exceptions accepted(palo Alto, CA) 1st DEC C++ release 1st Microsoft C++ release 1st IBM C++ release Draft ANSI/ISO standard due. 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 11
OOPLs 의계보 ALGOL Simula BCPL Smalltalk C Eiffel Objective C C++ Actor 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 12
특징 Smalltalk Alan Key at Xerox PARC in the early 1970s. 순수한객체지향언어 지원요소 객체 클래스, 서브클래스 => 단일상속성 메소드, 인스턴스변수 (= 필드 ) 메시지 개발환경에비해성능이낮음. 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 13
1.3 윈도우프로그래밍이란? 윈도우프로그래밍이란? 사용자가발생시키는이벤트에대한메시지를처리하는것 메시지기반 (Message Driven) 프로그래밍 이벤트기반 (Event Driven) 프로그래밍 윈도우프로그래밍하는방법 Win32 SDK(Software Development Kit) 윈도우에서애플리케이션을개발할때필요한 C 언어용표준라이브러리. MFC(Microsoft Foundation Class) 윈도우에서애플리케이션을개발할때필요한 C++ 언어로작성된클래스라이브러리. 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 14
기본구조 윈도우프로그램기본구조 초기화부분 : WinMain( ) 메시지를처리하는부분 ( 커널과의통신 ) : WndProc( ) Application program 윈도우커널 초기화 메시지교환 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 15
실제프로그램에서의형태 초기화부분 int WINAPI WinMain( ) { 초기화부분 } 메시지처리부분 LRESULT CALLBACK WndProc( ) { 메시지처리루틴 } 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 16
WinMain 함수 int WINAPI WinMain( { } 초기화함수 어플리케이션 ID 인수 HINSTANCE hinstance, HINSTANCE hprevinstance, LPTSTR lpszcmdline, int ncmdshow) 윈도우상태 1 윈도우클래스생성 2 윈도우클래스등록 3 프레임윈도우생성 4 프레임윈도우화면에표시 5 메시지큐로부터메시지를받아해당프로시저로보냄 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 17
프로시쥬어 (procedure) 윈도우는 Message Driven 방식 메시지를처리하는함수를 procedure라함 보통함수명다음에 Proc가붙으면프로시저로간주 프로시저는여러개가될수있다. 윈도우클래스마다수행되는프로시저가다르다. 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 18
WinProc 함수 윈도우에서들어온메시지를처리하는루틴 : switch( ) 결과값저장자료형 (32 비트 ) LRESULT CALLBACK WinProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { switch(imsg) { 해당메시지에대한처리 } } WinMain() 에서보내지는메시지 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 19
실습 : Win32 SDK 어플리케이션작성 주제 윈도우에 I love Window Programming! 텍스트출력 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 20
Step 1 : Win32 SDK 프로젝트생성 1. Visual C++ 실행, File/New 프로젝트이름 ( 디렉토리생성 ) 디렉토리변경 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 21
제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 22
File/New Step 2 : 소스코드삽입 Practice1.c 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 23
Practice1.c Step 3 : 소스코드입력 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 24
Step 4 : 프로그램실행 Build/Build Practice1.exe 실행또는 F7 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 25
switch(message) { 에플리케이션분석 } case WM_CREATE : // 윈도우가처음생성메시지가온경우 break; case WM_PAINT : // 화면에출력메시지가온경우 PaintDC = BeginPaint(hwnd,&PaintStruct); // 윈도우에텍스트를출력 TextOut(PaintDC, 10, 10, szmsg, strlen(szmsg)); EndPaint(hwnd, &PaintStruct); break; case WM_DESTROY : // 프로그램종료메시지가온경우 PostQuitMessage(0); break; default : // 그외의메시지가온경우 return DefWindowProc(hwnd, message, wparam, lparam); 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 26
TextOut() 함수 텍스트출력하기 기본적인텍스트출력 BOOL TextOut ( HDC hdc, // 디바이스컨텍스핸들 int nxstart, // 문자출력시작점 X 좌표 int nystart, // 문자출력시작점 Y 좌표 LPCTSTR lpstring, // 출력할문자열 int cbstring // 문자열의길이 ) ; 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 27
DrawText( ) 함수 문자를출력할때어느영역을정하고이영역에출력하는함수 Int DrawText ( HDC hdc, // 디바이스컨텍스핸들 LPCSTR lpstring, // 출력할문자 int nlength, // 출력할문자의수 LPRECT lprect, // 출력할영역 UINT Flags // 출력형식플러그 ) ; 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 28
출력형식플러그 플러그값 DT_TOP DT_BOTTOM DT_LEFT DT_RIGHT DT_CENTER DT_VCENTER DT_CALCRECT DT_SINGLELINE 내용 설정된영역의상단으로 설정된영역의하단으로 설정된영역의좌측으로 설정된영역의우측으로 (DT_SINGLELINE과함께지정되어야한다 ) 설정된영역의가로중앙에정렬 설정된영역의세로중앙에정렬 (DT_SINGLELINE 과함께지정되어야한다 ) 텍스트가출력할사각형의영역을계산 행바꿈과라인피드를무시하고한줄로출력 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 29
자료형 1.4 윈도우프로그램의기본형식 C 언어의표준자료형을대신하는자료형 Windows.h 에정의된윈도우프로그램을위한구조체 구조체로시작하여구조체로끝난다 H가붙지않는이상한것은모두구조체이다. 핸들 (handle) 자원을식별하기위한정수 윈도우시스템은핸들 ( 정수번호 ) 을모든자원에부과 핸들자료형 : H로시작 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 30
기본처리방법 핸들을받아서사용하거나, 핸들을만들어서설정하여사용. 예 : 라인을그린다. 그릴화면에대한핸들을받고, 라인을그릴펜이라는핸들을만들고, 펜이라는핸들을이용하여그릴화면핸들에라인을그린다. 핸들처리에관련된함수 Get 계열함수 : 핸들을얻을경우사용 Create 계열함수 : 핸들을만들때사용 Set 계열함수 : 함수를설정할때사용 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 31
새로운데이터형식 MSG 구조체 (windows.h) 메시지큐에저장되는정보 ( 메시지 ) 를담고있는구조체 GetMessage( ) : 메시지큐에서메시지를가져와 MSG 구조체에메시지정보를입력 typedef struct tagmsg { HWND hwnd; UINT message; WPARAM wparam; LPARAM lparam; DWORD time; POINT pt; } MSG; 제1장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 32
WNDCLASS 구조체 윈도우속성에대한정보를포함하는구조체 typedef struct _WNDCLASS { UINT style; // 윈도우의스타일을지정한다. 정수값의조합으로지정 WNDPROC lpfnwndproc; // 윈도우프로시저에대한포인터를지정한다. int cbclsextra; int cbwndextra; HANDLE hinstance; // 인스턴스에대한핸들 HICON hicon; // 윈도우에서사용될아이콘에대한핸들지정 HCURSOR hcursor; // 윈도우에서사용할커서에대한핸들지정 HBRUSH hbrbackground; // 윈도우백그라운드브러쉬에대한핸들지정 LPCTSTR lpszmenuname; // 윈도우에서메뉴이름지정, 리소스에서사용 LPCTSTR lpszclassname; // 윈도우클래스의이름을명시 } WNDCLASS; 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 33
PAINTSTRUCT 구조체 텍스트나이미지를윈도우의클라이언트영역에그리고자할때, 사용자정보를포함 typedef struct tagpaintstruct { HDC hdc; // 디스플레이컨텍스트에대한핸들을지정. BOOL ferase; // 윈도우의백그라운드를다시그릴지지정. RECT rcpaint; // 그리고자하는영역을사각형구조체를이용해지정. BOOL frestore; // 시스템에예약되어있으며, 내부적으로이용. BOOL fincupdate; // 시스템에예약되어있으며, 내부적으로이용. BYTE rgbreserved[16]; // 시스템에예약되어있으며, 내부적으로이용. } PAINTSTRUCT; 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 34
RECT 구조체 사각형형태의좌표를지정하는구조체 typedef struct tagrect { LONG left; // 맨왼쪽의좌표를명시한다. LONG top; // 맨위쪽의좌표를명시한다. LONG right; // 맨오른쪽의좌표를명시한다. LONG bottom; // 맨아래쪽의좌표를명시한다. } RECT; 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 35
헝가리언표기법 특이하게지정된변수이름 윈도우프로그램에서변수이름지정방법중하나. 특징, [ 표 1-1] 참고 변수이름은데이터형식을의미하는하나이상의소문자로시작. Microsoft의프로그래머인 Charles Simonyi를기리는뜻으로붙여진이름 작성한프로그램에서오류나버그가발생하기전에에러를방지할수있음. 변수의사용과더불어데이터형식을기술해줌으로써, 데이터형식불일치같은코딩오류를방지. 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 36
윈도우시스템의이해 윈도우는 GUI 이다. 윈도우는멀티태스킹을지원한다. 윈도우는메시지기반구조이다. 윈도우는윈도우프로시저를호출한다. 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 37
< 실습 1-1> 응용 연습문제 1-1 생성된윈도우에서키보드를눌렀다떼었다했을경우, 윈도우의상하 / 좌우중앙에텍스트를출력해보자. 키보드를눌렀을경우는 " 키보드가눌러졌습니다." 라는텍스트를, 키보드를떼었을경우는 " 키보드가떼어졌습니다." 라는텍스트를출력한다. 제공된소스분석 (project1_1.c) 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 38
// 1 커널에서들어온메시지를 switch문을이용하여처리 switch(message) { case WM_CREATE : // 윈도우가처음생성메시지가온경우 break; case WM_PAINT : // 화면에출력메시지가온경우 PaintDC = BeginPaint(hwnd,&PaintStruct); TextOut(PaintDC, 10, 10, szmsg1, strlen(szmsg1)); // 윈도우에텍스트를출력 EndPaint(hwnd, &PaintStruct); break; case WM_KEYDOWN : hdc = GetDC(hwnd); GetClientRect(hwnd, &rect); DrawText(hdc, szmsg2, strlen(szmsg2),&rect,dt_singleline DT_CENTER DT_VCENTER); ReleaseDC(hwnd,hdc); break; case WM_KEYUP : hdc = GetDC(hwnd); GetClientRect(hwnd, &rect); DrawText(hdc, szmsg3, strlen(szmsg3),&rect,dt_singleline DT_CENTER DT_VCENTER); ReleaseDC(hwnd,hdc); break; } case WM_DESTROY : PostQuitMessage(0); break; default : return DefWindowProc(hwnd, message, wparam, lparam); // 프로그램종료메시지가온경우 // 그외의메시지가온경우 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 39
1.5 Visual C++ 프로그래밍 Visual C++ 개발환경에서의주요작업 프로젝트생성또는열기 (Application Wizard) 메시지핸들러재정의 (Class Wizard) MFC 버추얼메소드재정의 (Class Wizard) 필요한경우새클래스추가 리소스추가및편집 프로젝트빌드 디버깅 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 40
목표 AppWizard 사용법 AppWizard를사용한프로그램개발 Project의확장 Device Context 문자열출력 기타Class Graphic 출력 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 41
AppWizard Project 생성 (1) 새로운 Project 작성 File / New / Projects 선택 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 42
참고 여러가지유형의프로젝트생성 윈도우어플리케이션개발 "MFC AppWizard (exe)" 항목선택, 프로젝트생성 Application Wizard 마법사가기본코드생성 여러가지옵션선택가능 텍스트모드어플리케이션개발 "Win32 Console Application" 항목선택. 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 43
AppWizard Project 생성 (2) Project 의종류 항목 MFC AppWizard(exe) MFC AppWizard(dll) Win32 Application Win32 Dynamic Link Library 의미 MFC library 를사용하여단독실행가능한프로그램작성 MFC library 를사용하여 DLL 작성 Win32 SDK 를사용하여실행파일작성 Win32 SDK 를사용하여 DLL 작성 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 44
AppWizard Project 생성 (3) MFC AppWizard-Step 1 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 45
MFC AppWizard-Step 1 : Architecture type Single document 한번에하나의 document 사용 예 : notepad Multiple document 여러 document 사용 예 : 탐색기 Dialog-based 사용자의입력을위해하나의단순한 dialog box 제공 예 : MFC Trace Options 언어 resource text 지원언어 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 46
AppWizard Project 생성 (4) MFC AppWizard-Step 2 : Database option 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 47
MFC AppWizard-Step 2 : Database option None DB 를사용하지않을때 Header files only 데이터베이스코딩에필요한 AFXDB.H 헤더파일만을 include해준다. 데이터베이스기능은직접코딩해야함. A database view without file support : CRecordView, CRecordset 클래스를상속받아데이터베이스지원기능을생성 문서저장기능 (Serialization) 은생성하지않음 A database view, with file support CRecordView, CRecordset 클래스를상속받아데이터베이스지원기능을생성. 문서저장기능 (Serialization) 도생성. 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 48
AppWizard Project 생성 (5) MFC AppWizard-Step 3 : OLE option 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 49
MFC AppWizard-Step 3 : OLE option OLE 복합문서기능 예 ) MS Word 의문서에 MS Excel 의표를삽입 삽입된 Excel 표를 Word 에서직접편집가능 OLE Server 와 Container 기능을제공하는 Excel 은 OLE Server 이고 기능을제공받아문서에포함하는 Word 는 OLE Container Mini server 독립된어플리케이션으로실행될수는없고 다른어플리케이션에 OLE server 기능제공만해준다 예 : MS Equation Editor Full server 다른어플리케이션에 OLE server 기능을제공하며 독립된어플리케이션으로실행될수도있다 예 : MS Excel 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 50
AppWizard Project 생성 (6) MFC AppWizard-Step 4 : 사용지인터페이스설정 툴바, 상태바, 인쇄기능, 문맥도움말기능 소켓프로그래밍하려면선택함 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 51
MFC AppWizard-Step 4 : 사용지인터페이스설정 Docking Toolbar : 툴바지원여부선택 Initial Status Bar : 상태바지원연부선택 Printing and Print Preview Print, Print Setup, Print Preview 메뉴기능이생성 Context-Sensitive Help : 도움말기능 3D controls 다이얼로그박스컨트롤의모양을 3차원입체로설정 "How many files would you " 파일메뉴에가장최근에작업한팔일목록을몇개표시할것인가? 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 52
Step 4 에서 "Advanced " 버튼을누름 문서의확장자등록 메인윈도우타이틀바제목 파일열기대화상자에표시될파일종류 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 53
참고 File type ID 시스템레지스트리에등록되는문서종류이름 Doc Type Name 클래스의파일이름설정 File new name (short name) File New 대화상자에나오는파일의이름설정 OLE server 일경우 OLE object의 short 이름 File type name (long name) OLE server 일경우 OLE object의긴이름 Use Splitter Window splitter 윈도우기능사용 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 54
AppWizard Project 생성 (7) MFC AppWizard-Step 5 : 기타사항설정 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 55
MFC AppWizard-Step 5 : 기타사항설정 "a shared DLL" MFC 라이브러리가실행파일에포함되지않음 생성되는실행파일의크기는작지만 실행시 MFC의 DLL 파일을필요로함 "a statically linked library" MFC 라이브러리가실행파일에포함됨 생성되는실행파일의크기는커지지만 실행시 MFC의 DLL 파일을필요로하지않음 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 56
AppWizard Project 생성 (9) MFC AppWizard-Step 6 : 생성될클래스파일 생성된클래스들 생성된파일 부모클래스를선택 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 57
Project Workspace Project Workspace 프로젝트를구성하는클래스, 리소스 (resource), 파일목록을관리 Class View Resource View FileView 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 58
특징 Project Workspace - Class View 클래스, 메소드, 멤버변수를보여준다 클래스노드를확장하면클래스의메소드와멤버변수목록을볼수있다 아이콘 클래스 protected 메소드 private 메소드 public 메소드 protected 멤버변수 private 멤버변수 public 멤버변수 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 59
클래스이름클릭, 마우스오른쪽버튼을누르면 Go to Definition : 클래스가정의된헤더파일열기 Add Member Function : 클래스에메소드추가하기 Add Member Variable : 클래스에멤버변수추가하기 Add Virtual Function : 클래스에 MFC 버추얼메소드추가하기 Add Windows Message Handler : 클래스에메시지핸들러추가하기 References : 클래스정의된곳, 참조된곳목록보기 Derived Classes : 하위클래스의목록, 메소드, 멤버변수, 정의된곳, 참조된곳보기 Base Classes : 상위클래스의목록, 메소드, 멤버변수, 정의된곳, 참조된곳보기 Group by Access : 멤버의정렬순서선택 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 60
실습 1 CTestView 클래스노드를확장하기 2 OnDraw 멤버함수더블클릭하여멤버함수정의로가기 3 GetDocument() 를오른쪽버튼으로클릭 Goto Reference 4 클래스이름더블클릭하여클래스정의로가기 5 전역변수 theapp 더블클릭하여변수정의로가기 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 61
Project Workspace - File View 프로젝트를구성하는파일관리 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 62
파일이름더블클릭, 텍스트윈도우에파일이열린다. 오른쪽버튼클릭, 컴파일또는컴파일옵션설정 파일살펴보기 Test.cpp Test.h : CTestApp, CAboutDlg 클래스 Test.rc : 리소스소스파일 TestDoc.cpp TestDoc.h : CTestDoc 클래스 TestView.cpp TestView.h : CTestView 클래스 MainFrm.cpp MainFrm.h : CMainFrame 클래스 ReadMe.txt StdAfx.h : pre-compiled header 파일 StdAfx.cpp : pre-compiled header의소스파일 Test.ico TestDoc.ico : 어플리케이션아이콘, 도큐먼트아이콘 Test.rc2 : 리소스에디터로편집할수없는리소스 Toolbar.bmp : 툴바의비트맵파일제1장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 63
Project Workspace - Resource View 리소스 : 메뉴, 대화상자, 템플릿, 비트맵, 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 64
참고 1 Accelerator : 메뉴항목에대한단축키정의 Dialog : 대화상자템플릿 Menu IDR_MAINFRAME : 메인윈도우메뉴 IDR_TESTTYPE : 도큐먼트윈도우메뉴 String Table : 문자열을리소스로저장 Toolbar Bitmap Cursor : 마우스포인터 Icon 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 65
참고 2 어플리케이션의 GUI 각요소들의많은부분은실행화일에리소스형태로추가. 실행화일에추가된리소스는프로그램을다시컴파일하지않고도직접수정가능. 리소스는프로그램이실행될때모두메모리로로드될필요는없고그순간에필요한리소스만로드될수있기때문에효율적인메모리사용이가능. 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 66
AppWizard Project 생성 (11) Build(F7) / 실행 (Ctrl+F5) 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 67
Project 의확장 (1) Code 추가 TestView.cpp : OnDraw(CDC* pdc) { } 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 68
TestView.cpp : OnDraw(CDC* pdc) { } void CTestView::OnDraw(CDC* pdc) { CTestDoc* pdoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here } pdc->textout(100, 100, "I will find a way or make one.", 30) ; 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 69
CDC Class Device Context 화면, 프린터에출력하기위한 DC(Device Context) 정보 화면영역, 선의색상, 채색색상, 글꼴모양 void CTestView::OnDraw(CDC* pdc) { pdc->textout(0, 0, I will., 30) } 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 70
문자열출력 (1) TextOut() 형식 출력하려는문자열 Bool TextOut(int x, int y, LPCTSTR lpszstring, int ncount); 출력하려는문자열의길이 예 void CTestView::OnDraw(CDC* pdc) { CTestDoc* pdoc = GetDocument(); ASSERT_VALID(pDOC) pdc->textout(0, 0, I will be a Visual C++ expert, 30); } 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 71
문자열출력 (2) Cstring Class 형식 문자열 Class Bool TextOut(int x, int y, const Cstring& str); Cstring Class 형의객체 예 void CTestView::OnDraw(CDC* pdc) { CTestDoc* pdoc = GetDocument(); ASSERT_VALID(pDOC) CString str( I will be a Visual C++ expert ); pdc->textout(0, 0, str); } 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 72
문자열출력 (3) Cstring Class 에정의된멤버연산자 멤버함수 = 기능 다른문자열대입 + 문자열연결 == 문자열비교 += 문자열에다른문자열추가 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 73
문자열출력 (4) 예 void CTestView::OnDraw(CDC* pdc) { CString str1, str2, str3; str1="object Oriented Programming->"; str2="visual C++!!!"; ASSERT_VALID(pDoc); pdc->textout(10, 10, str1); str3 = str1 + " " + str2; pdc->textout(10, 50, str3); str1 += " " + str2; pdc->textout(10, 100, str1); } if(str1 == str3){ pdc->textout(10, 150, "True", 4); }else{ pdc->textout(10, 150, "False", 5); } 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 74
실행결과 문자열출력 (5) 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 75
문자열출력 (6) Cstring Class 에정의된멤버함수 멤버함수 GetLength( ) Mid(int nfirst, ncount) Left(int ncount) Right(int ncount) MakeUpper( ) MakerLower( ) Format(LPCTSTR lpszformat) 기능문자열길이문자열에서중간문자열추출문자열의왼쪽에서문자열추출문자열의오른쪽에서문자열추출문자열을대문자로변환문자열을소문자로변환서식화된문자열 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 76
문자열출력 (7) 예 void CTestView::OnDraw(CDC* pdc) { CString str1, str2, str3, str4, str5; str1="object Oriented Programming->Visual C++!!!"; int i = str1.getlength(); str2.format("length = %d", i); pdc->textout(10, 10, str2); str3 = str1.mid(7, 8); pdc->textout(10, 50, str3); // 문자열길이구하기 // 서식화된문자열 } str4 = str1.left(6); pdc->textout(10, 100, str4); str5 = str1.right(14); pdc->textout(10, 150, str5); str5.makeupper(); pdc->textout(10, 200, str5); str5.makelower(); pdc->textout(10, 250, str5); // 중간문자열추출 // 왼쪽에서문자열추출 // 오른쪽에서문자열추출 // 문자열대문자로변경 // 문자열소문자로변경 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 77
실행결과 문자열출력 (8) 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 78
문자열출력 (9) DrawText () 형식 출력하려는문자열 int DrawText(LPCTSTR lpszstring, int ncount, LPRECT lprect, UINT nformat); 예 출력하려는문자열의길이출력영역출력형식 void CTestView::OnDraw(CDC* pdc) { RECT DTRECT; CHAR *MyStr= " 천리안 \ 특집 1 천리안과함께떠나는 98 년메뉴여행 \ 특빕 2 사이버저널리즘의결정체, 웹진의세계 "; } SetRect(&DTRECT, 10,10, 200, 200); pdc->drawtext(mystr, -1, &DTRECT, DT_LEFT DT_WORDBREAK); 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 79
실행결과 문자열출력 (10) 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 80
기타 Class (1) Class CRect CPoint CSize 설명 사각영역표현한점의좌표표현폭, 높이등의크기표현 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 81
Format 기타 Class (2) Bool DrawEdge(LPRECT, lprect, UINT nedge, UINT nflags) 사각형의속성 사각형속성 (nedge) 값 BDR_RAISEDINNER BDR_SUNKENINNER BDR_RAISEDOUTER BDR_ SUNKENOUTER EDGE_BUMP EDGE_ETCHED EDGE_RAISED EDGE_SUNKEN 사각형의 4 변중그리고자하는변지정 설명 내부가올라간모양내부가내려간모양외부가올라간모양외부가내려간모양내부가내려간모양 & 외부가올라간모양내부가올라간모양 & 외부가내려간모양내부가올라간모양 & 외부가올라간모양내부가내려간모양 & 외부가내려간모양 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 82
기타 Class (3) 사각형의 4변중에서그리는변지정 (nflags) 값설명 BF_RECT BF_LEFT BF_BOTTOM BF_ RIGHT EF_TOP EF_TOPLEFT EF_TOPRIGHT EF_BOTTOMLEFT BF_ BOTTOMRIGHT EF_DIAGONAL_ENDBOTTOMLEFT EF_DIAGONAL_ENDBOTTOMRIGHT EF_DIAGONAL_ENDTOPLEFT EF_DIAGONAL_ENDTOPRIGHT 4 변모두그림 좌측변만그림 하변만그림 우측변만그림 상변만그림 상변 & 좌측변만그림 상변 & 우측변만그림 하변 & 좌측변만그림 하변 & 우측변만그림 우측상에서좌측하변으로대각선 좌측상에서우측하변으로대각선 우측하에서좌측상변으로대각선 좌측하에서좌측상변으로대각선 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 83
기타 Class (4) 예제 CRect void CTestView::OnDraw(CDC* pdc) { CRect r(10, 10, 200,100); // TODO: add draw code for native data here } pdc->drawedge(r, EDGE_BUMP, BF_RECT); 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 84
실행결과 기타 Class (5) 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 85
Graphic 출력 (1) Rectangle () 형식 Bool Rectangle(int x1, int y1, int x2, int y2); Ellipse () 형식 Bool Ellipse(int x1, int y1, int x2, int y2); MoveTo () 형식 CPoint MoveTo(int x, int y); 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 86
Graphic 출력 (2) LineTo () 형식 Bool LineTo(int x, int y); 예 void CTestView::OnDraw(CDC* pdc) { pdc->rectangle(10, 10, 100, 100); pdc->ellipse(150, 10, 300, 100); pdc->moveto(10, 120); pdc->lineto(300, 200); } 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 87
실행결과 Graphic 출력 (3) 제 1 장 : C++ 언어및윈도우프로그래밍개요, Q) kkman@sangji.ac.kr 88