Stored Program Concept 5 Stored Program Concept 6

  • Slides: 82
Download presentation

Stored Program Concept 5

Stored Program Concept 5

Stored Program Concept + 컴퓨터 구조 6

Stored Program Concept + 컴퓨터 구조 6

윈도우 운영체제 특징 (2/4) • 메시지 큐 1 2 3 System queue A Windows

윈도우 운영체제 특징 (2/4) • 메시지 큐 1 2 3 System queue A Windows procedure() B A B Message loop Application queue Notepad. exe Window. Proc( ) 6 Key & mouse Message B 5 B 4 Tackmgr. exe Window. Proc( ) A A 14

Hello. SDK 예제 작성 (4/9) • 코드 입력 #include <windows. h> // Win. Main(

Hello. SDK 예제 작성 (4/9) • 코드 입력 #include <windows. h> // Win. Main( ) 함수에서 참조하므로 함수 원형을 선언한다. LRESULT CALLBACK Wnd. Proc(HWND, UINT, WPARAM, LPARAM); int APIENTRY Win. Main(HINSTANCE h. Instance, HINSTANCE h. Prev. Instance, LPSTR lp. Cmd. Line, int n. Cmd. Show) { // 윈도우 클래스를 초기화하고 운영체제에 등록한다. wndclass. style = CS_HREDRAW | CS_VREDRAW; wndclass. lpfn. Wnd. Proc = Wnd. Proc; wndclass. cb. Cls. Extra = 0; wndclass. cb. Wnd. Extra = 0; wndclass. h. Instance = h. Instance; 26

Hello. SDK 예제 작성 (5/9) wndclass. h. Icon = Load. Icon(NULL, IDI_APPLICATION); wndclass. h.

Hello. SDK 예제 작성 (5/9) wndclass. h. Icon = Load. Icon(NULL, IDI_APPLICATION); wndclass. h. Cursor = Load. Cursor(NULL, IDC_ARROW); wndclass. hbr. Background = (HBRUSH)Get. Stock. Object(WHITE_BRUSH); wndclass. lpsz. Menu. Name = NULL; wndclass. lpsz. Class. Name = "Hello. Class"; if(!Register. Class(&wndclass)) return -1; // 윈도우를 생성하고 화면에 보이게 한다. hwnd = Create. Window("Hello. Class", "Hello. SDK Application", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, NULL, h. Instance, NULL); Show. Window(hwnd, n. Cmd. Show); Update. Window(hwnd); 27

Hello. SDK 예제 작성 (6/9) } // 메시지 대기열에서 메시지를 하나씩 꺼내 처리한다. while(Get.

Hello. SDK 예제 작성 (6/9) } // 메시지 대기열에서 메시지를 하나씩 꺼내 처리한다. while(Get. Message(&msg, NULL, 0, 0) > 0){ Translate. Message(&msg); Dispatch. Message(&msg); } return msg. w. Param; LRESULT CALLBACK Wnd. Proc(HWND hwnd, UINT message, WPARAM w. Param, LPARAM l. Param) { HDC hdc; PAINTSTRUCT ps; char *str = "Hello, SDK"; 28

Hello. SDK 예제 작성 (7/9) // 메시지 종류에 따라 응용 프로그램이 적절히 처리한다. switch(message)

Hello. SDK 예제 작성 (7/9) // 메시지 종류에 따라 응용 프로그램이 적절히 처리한다. switch(message) { case WM_CREATE: return 0; case WM_PAINT: hdc = Begin. Paint(hwnd, &ps); Text. Out(hdc, 100, str, lstrlen(str)); End. Paint(hwnd, &ps); return 0; case WM_LBUTTONDOWN: Message. Box(hwnd, "마우스를 클릭했습니다. ", "마우스 메시지", MB_OK); return 0; 29

Hello. SDK 예제 작성 (8/9) case WM_DESTROY: Post. Quit. Message(0); return 0; } }

Hello. SDK 예제 작성 (8/9) case WM_DESTROY: Post. Quit. Message(0); return 0; } } // 응용 프로그램이 처리하지 않으면 윈도우 운영체제가 처리한다. return Def. Window. Proc(hwnd, message, w. Param, l. Param); 30

Hello. SDK 예제 분석 (1/7) • 헤더 파일 #include <windows. h> • 메인 함수

Hello. SDK 예제 분석 (1/7) • 헤더 파일 #include <windows. h> • 메인 함수 int APIENTRY Win. Main(HINSTANCE h. Instance, HINSTANCE h. Prev. Instance, LPSTR lp. Cmd. Line, int n. Cmd. Show) {. . . 32

Hello. SDK 예제 분석 (2/7) • 윈도우 클래스 초기화와 등록 wndclass. style = CS_HREDRAW

Hello. SDK 예제 분석 (2/7) • 윈도우 클래스 초기화와 등록 wndclass. style = CS_HREDRAW | CS_VREDRAW; wndclass. lpfn. Wnd. Proc = Wnd. Proc; wndclass. cb. Cls. Extra = 0; wndclass. cb. Wnd. Extra = 0; wndclass. h. Instance = h. Instance; wndclass. h. Icon = Load. Icon(NULL, IDI_APPLICATION); wndclass. h. Cursor = Load. Cursor(NULL, IDC_ARROW); wndclass. hbr. Background = (HBRUSH)Get. Stock. Object(WHITE_BRUSH); wndclass. lpsz. Menu. Name = NULL; wndclass. lpsz. Class. Name = "Hello. Class"; if(!Register. Class(&wndclass)) return -1; 33

Hello. SDK 예제 분석 (3/7) • 윈도우 생성 hwnd = Create. Window("Hello. Class", "Hello.

Hello. SDK 예제 분석 (3/7) • 윈도우 생성 hwnd = Create. Window("Hello. Class", "Hello. SDK Application", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, NULL, h. Instance, NULL); Show. Window(hwnd, n. Cmd. Show); Update. Window(hwnd); 34

Hello. SDK 예제 분석 (4/7) • 메시지 루프 while(Get. Message(&msg, NULL, 0, 0) >

Hello. SDK 예제 분석 (4/7) • 메시지 루프 while(Get. Message(&msg, NULL, 0, 0) > 0){ Translate. Message(&msg); Dispatch. Message(&msg); } return msg. w. Param; 35

Hello. SDK 예제 분석 (5/7) • 윈도우 프로시저 LRESULT CALLBACK Wnd. Proc(HWND hwnd, UINT

Hello. SDK 예제 분석 (5/7) • 윈도우 프로시저 LRESULT CALLBACK Wnd. Proc(HWND hwnd, UINT message, WPARAM w. Param, LPARAM l. Param) { HDC hdc; PAINTSTRUCT ps; char *str = "Hello, SDK"; // 메시지 종류에 따라 응용 프로그램이 적절히 처리한다. switch(message) { case WM_CREATE: return 0; case WM_PAINT: hdc = Begin. Paint(hwnd, &ps); 36

Hello. SDK 예제 분석 (6/7) Text. Out(hdc, 100, str, lstrlen(str)); End. Paint(hwnd, &ps); return

Hello. SDK 예제 분석 (6/7) Text. Out(hdc, 100, str, lstrlen(str)); End. Paint(hwnd, &ps); return 0; case WM_LBUTTONDOWN: Message. Box(hwnd, "마우스를 클릭했습니다. ", "마우스 메시지", MB_OK); return 0; case WM_DESTROY: Post. Quit. Message(0); return 0; } 37

Hello. MFC 예제 작성 (4/9) • 코드 입력 #include <afxwin. h> // 클래스 선언부

Hello. MFC 예제 작성 (4/9) • 코드 입력 #include <afxwin. h> // 클래스 선언부 class CHello. App : public CWin. App { public: virtual BOOL Init. Instance(); }; class CMain. Frame : public CFrame. Wnd { public: CMain. Frame(); 42

Hello. MFC 예제 작성 (5/9) protected: afx_msg void On. Paint(); afx_msg void On. LButton.

Hello. MFC 예제 작성 (5/9) protected: afx_msg void On. Paint(); afx_msg void On. LButton. Down(UINT n. Flags, CPoint point); DECLARE_MESSAGE_MAP() }; // 응용 프로그램 객체 CHello. App the. App; // 클래스 정의부 BOOL CHello. App: : Init. Instance() { m_p. Main. Wnd = new CMain. Frame; m_p. Main. Wnd->Show. Window(m_n. Cmd. Show); 43

Hello. MFC 예제 작성 (6/9) } m_p. Main. Wnd->Update. Window(); return TRUE; CMain. Frame:

Hello. MFC 예제 작성 (6/9) } m_p. Main. Wnd->Update. Window(); return TRUE; CMain. Frame: : CMain. Frame() { Create(NULL, "Hello. MFC Application"); } void CMain. Frame: : On. Paint() { char *msg = "Hello, MFC"; CPaint. DC dc(this); 44

Hello. MFC 예제 작성 (7/9) } dc. Text. Out(100, msg, lstrlen(msg)); void CMain. Frame:

Hello. MFC 예제 작성 (7/9) } dc. Text. Out(100, msg, lstrlen(msg)); void CMain. Frame: : On. LButton. Down(UINT n. Flags, CPoint point) { Message. Box("마우스를 클릭했습니다. ", "마우스 메시지"); } // 메시지맵 BEGIN_MESSAGE_MAP(CMain. Frame, CFrame. Wnd) ON_WM_PAINT() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() 45

Hello. MFC 예제 분석 (1/7) • 헤더 파일 #include <afxwin. h> • class 클래스

Hello. MFC 예제 분석 (1/7) • 헤더 파일 #include <afxwin. h> • class 클래스 선언부 CHello. App : public CWin. App { public: virtual BOOL Init. Instance(); }; 48

Hello. MFC 예제 분석 (2/7) • 클래스 선언부 (CMain. Frame) class CMain. Frame :

Hello. MFC 예제 분석 (2/7) • 클래스 선언부 (CMain. Frame) class CMain. Frame : public CFrame. Wnd { public: CMain. Frame(); protected: afx_msg void On. Paint(); afx_msg void On. LButton. Down(UINT n. Flags, CPoint point); DECLARE_MESSAGE_MAP() }; 49

Hello. MFC 예제 분석 (4/7) • 클래스 정의부 BOOL CHello. App: : Init. Instance()

Hello. MFC 예제 분석 (4/7) • 클래스 정의부 BOOL CHello. App: : Init. Instance() { m_p. Main. Wnd = new CMain. Frame; m_p. Main. Wnd->Show. Window(m_n. Cmd. Show); m_p. Main. Wnd->Update. Window(); return TRUE; } CMain. Frame: : CMain. Frame() { Create(NULL, "Hello. MFC Application"); } 51

Hello. MFC 예제 분석 (5/7) • 클래스 정의부 (cont’d) void CMain. Frame: : On.

Hello. MFC 예제 분석 (5/7) • 클래스 정의부 (cont’d) void CMain. Frame: : On. Paint() { char *msg = "Hello, MFC"; CPaint. DC dc(this); } dc. Text. Out(100, msg, lstrlen(msg)); void CMain. Frame: : On. LButton. Down(UINT n. Flags, CPoint point) { Message. Box("마우스를 클릭했습니다. ", "마우스 메시지"); } 52

Hello. MFC 예제 분석 (6/7) • 메시지맵 BEGIN_MESSAGE_MAP(CMain. Frame, CFrame. Wnd) ON_WM_PAINT() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP()

Hello. MFC 예제 분석 (6/7) • 메시지맵 BEGIN_MESSAGE_MAP(CMain. Frame, CFrame. Wnd) ON_WM_PAINT() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() 53

워크스페이스 Class. View File. View Resource. View 58

워크스페이스 Class. View File. View Resource. View 58

App. Wizard 60

App. Wizard 60

Class. Wizard 61

Class. Wizard 61

윈도우에 정의된 데이터 형 Name Description BOOL 논리형 TRUE 또는 FALSE 값만 가질 수

윈도우에 정의된 데이터 형 Name Description BOOL 논리형 TRUE 또는 FALSE 값만 가질 수 있다 BYTE unsigned char (8 bit) DWORDLO NG FLOAT unsigned long (32 bit) unsigned double (64 bit) LONG signed long (32 bit) LONG signed double (64 bit) LPARAM 32 bit 메시지 파라미터 LPCSTR TCHAR 널 문자로 끝나는 윈도우 문자열 상수의 포인터 널 문자로 끝나는 유니코드 또는 윈도우 문자열 상수의 포인터 널 문자로 끝나는 윈도우 문자열의 포인터 널 문자로 끝나는 유니코드 또는 윈도우 문자열의 포인 터 유니코드 또는 윈도우 문자 UINT unsigned int (32 bit) WORD unsigned short (16 bit) LPCTSTR LPTSTR float 63

Name b c by n i l f d s Description BOOL char byte

Name b c by n i l f d s Description BOOL char byte (unsigned char) short int LONG FLOAT double string Null로 종료되는 문자열(string) = ( sz LPSTR : char* ) str CString 형, char 배열 u UNIT (unsigned int)형 변수 WORD (unsigned short)형 변수 (= w USHORT ) dw DWORD (unsigned long)형 변수 a Array 배열 h handle p pointer lp long 포인터 변수 x, y x축이나 y축으로 사용되는 정수 cx, cy x, y 길이를 나타내기 위해 사용되는 변수 없음. 지역변수 g_(글로벌) 전역변수 헝가리언 표기법 소문자 접두어를 붙여 변 수의 자료형을 쉽게 알아 볼 수 있도록 하자는 취지. 64

MFC Debugging Macro & Exception Handling 메시지 출력 ASSERT Macro 오브젝트의 유효성 검사 예외

MFC Debugging Macro & Exception Handling 메시지 출력 ASSERT Macro 오브젝트의 유효성 검사 예외 처리 66

컴파일 옵션 • Debug mode – _DEBUG • Release mode – NODEBUG 67

컴파일 옵션 • Debug mode – _DEBUG • Release mode – NODEBUG 67

Debugging Mode로 수행 68

Debugging Mode로 수행 68

TRACE Macro • 디버그 창으로 메시지 출력 • Debugging mode로 컴파일 할 때만 수행

TRACE Macro • 디버그 창으로 메시지 출력 • Debugging mode로 컴파일 할 때만 수행 TRACE(“Sample TRACE Output : %d == 0 x%xn”, i, i); 70

VERIFY Macro • ASSERT macro와 동일 • 단, Debugging mode가 아닌 Release mode로 컴파일

VERIFY Macro • ASSERT macro와 동일 • 단, Debugging mode가 아닌 Release mode로 컴파일 시에도 수행 VERIFY(Load. Accel. Table(h. Wnd, “Main. Wnd”)); 72

Assert. Valid class CHorz. Line : public CObject { CPoint m_pt. Start, m_pt. End;

Assert. Valid class CHorz. Line : public CObject { CPoint m_pt. Start, m_pt. End; . . #ifdef _DEBUG void Assert. Valid() const; void Dump(CDump. Context& dc) const; #endif }; void CHorz. Line: : Assert. Valid() const { CObject: : Assert. Valid(); // 먼저 선조 클래스의 유효성을 검사한다. ASSERT(m_pt. Start. y == m_pt. End. y); } 74

Dump void CHorz. Line: : Dump(CDump. Context& dc) const { CObject: : Dump(dc); //

Dump void CHorz. Line: : Dump(CDump. Context& dc) const { CObject: : Dump(dc); // 먼저 선조클래스의 데이터멤버를 호출한다. dc << “X : “ << (WORD)m_pt. Start. x << “ Y : “ << (WORD)m_pt. Start. y << “n”; dc << “Y : “ << (WORD)m_pt. End. x << “ Y : “ << (WORD)m_pt. End. y << “n”; } afx. Dump는 void f() CDump. Context 타입의 { 전역 변수. 출력이 윈도 CHorz. Line* p. Line = new CHorz. Line; 우의 Debug 탭으로 출. . 력 #ifdef _DEBUG 75

Exception Handling 체크 되어야 76

Exception Handling 체크 되어야 76

Visual Studio 2005 단축키 • 뷰 /Wizard 관련 – – Alt + F 7

Visual Studio 2005 단축키 • 뷰 /Wizard 관련 – – Alt + F 7 : Project Setting Ctrl + W : 클래스 위자드 (MFC 코딩시에만 사용) Alt + 2 : output 윈도우 Alt + 0 : Workspace 윈도우 – Ctrl + Tab 동 – Ctrl + F 4 닫기 Edit하고 있는 Child Window 간의 이 현재 Edit하고 있는 Child Window를 78