mfc 발견 (2)

43
MFC 발발 발발발 발발 윈윈윈 윈윈윈윈윈 윈윈윈윈 ( 윈윈윈 , 윈윈윈 ) MFC 윈 윈윈 CString(with 윈윈윈윈 ), 윈윈윈윈 윈윈윈 ↑ 발발발 v

Upload: -

Post on 13-Feb-2017

445 views

Category:

Software


2 download

TRANSCRIPT

Page 1: MFC 발견 (2)

MFC 발견두번째 주제

• 윈도우 프로그래밍 필수사항 ( 메시지 , 이벤트 )• MFC 큰 뼈대• CString(with 유니코드 ), 자료구조 이야기

↑ 시바견

v

Page 2: MFC 발견 (2)

지난 주 복습• MFC 는 SDK 를 객체로 감싼 것에 불과하다 .( 캡슐화 )

• main 조차도 숨겨져 있다 .( 캡슐화 )CWinApp::InitInstance(MFC 에서의 Main 역할 )

진입점 , WinMain, Create

저번 주는 MFC 를 어렵게 느끼게했던캡슐화에 대해 알아보았다 .

Page 3: MFC 발견 (2)

윈도우 플밍 필수지식 : 이벤트 - 드리븐• 이벤트가 뭘까요 ? 사건 !

클릭했을 때마우스 움직이는 거키보드 누르는 거창이 생성되는 거창이 닫히는 거

스크롤바가 움직이는 거입력 창 내용이 변하는 거

...엄청많다 !

교재 29 쪽교재 32 쪽

Page 4: MFC 발견 (2)

딸깍 ! ( 클릭 )

윈도우 플밍 필수지식 : 메시지• 메시지가 뭘까요 ? 이벤트가 발생했다는 사실을 알려주는 놈 !

전송버튼 클릭 마우스 움직임 키보드 눌림

이벤트 발생 ! 메시지 큐에 추가됨

AfxMessageBox(_T(“ 클릭하셨네요 !”))

메시지 처리부 ( 핸들러 )

교재 29 쪽교재 32 쪽

Page 5: MFC 발견 (2)

1. 마우스를 클릭했다 . ( 이벤트 발생 )

2. 운영체제가 이 사실을 프로그램에게 알려준다 . ( 메시지 )

3. 프로그램이 메시지 창을 띄운다 . ( 핸들러 실행 )

예를 들어봅시다 .

Page 6: MFC 발견 (2)

이벤트가 발생하고 프로그램에게 메시지가 전달되고 ,

프로그램은 메시지를 꺼내와 처리하는 방식

이벤트 - 드리븐 (event-driven) 방식

Page 7: MFC 발견 (2)

이벤트 - 드리븐은 여기저기 쓰입니다 .• 얻어 맞을 때• MFC 외에도 자바 GUI, 자바스크립트 , Qt, 안드로이드 등등

웹 개발

Qt 라이브러리

안드로이드

Page 8: MFC 발견 (2)

HelloSDK 심층분석 : 이벤트 핸들러

https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms633577(v=vs.85).aspx

길어지는 함수

Procedure; 절차 , 방법 , 처리

Page 9: MFC 발견 (2)

HelloSDK 심층분석 : 이벤트 핸들러

https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms633577(v=vs.85).aspx

길어지는 함수Procedure; 절차 , 방법 , 처리

Page 10: MFC 발견 (2)
Page 11: MFC 발견 (2)
Page 12: MFC 발견 (2)

HelloMFC 심층분석 : 이벤트 핸들러

메시지 맵은 이벤트와 핸들러 ( 처리자 ) 를이어주는 ( 맵핑 ) 해주는 역할을 한다 .

기본적인 것들은 이미 맵핑되어 있다 .

함수가 단순해지고

깔끔한 코드

Page 13: MFC 발견 (2)

메시지맵이 뭔가요 ?기존 switch 를 이용하던 것을 객체지향적으로 예쁘게 한 녀석

Page 14: MFC 발견 (2)

메시지맵을 써봅시다 .

1

2

3

선언하고

정의하고

핸들러 만든다

MFC_3.cpp

Page 15: MFC 발견 (2)

https://msdn.microsoft.com/ko-kr/library/sf1ba0hh.aspx

이런 거 다 알아야 하나요 ? No!

당연히 추상화 / 캡슐화 되어있죠 !

기본적인 것들은 이미 맵핑되어있다 .

Page 16: MFC 발견 (2)

메시지들은 이미 매핑되어있다 .• 그래서 메시지맵 !

WM_CLICK

WM_PAINT

::On-Paint();

::OnClick();

메시지

맵 (map): 지도

Page 17: MFC 발견 (2)

실습을 해 봅시다 .MFC_3.cpp MFC_4.cpp

123

선언하고정의하고핸들러 만든다

Page 18: MFC 발견 (2)

이런 거 언제 일일이 하고 있어 !

Page 19: MFC 발견 (2)
Page 20: MFC 발견 (2)

그 동안삽질하고있었어

Page 21: MFC 발견 (2)

( 어려우니까 ) 중간정리• GUI 는 이벤트 기반의 개발이다 . ( 이벤트 - 드리븐 )

• 이벤트가 발생되면 , 창에게 메시지가 보내진다 .

• 그 메시지를 처리하면 된다 . ( 메시지 핸들러 )

• MFC 에서는 메시지에 따라 자동으로 함수를 실행해준다 . ( 메시지맵 )

Page 22: MFC 발견 (2)

MFC 의 큰 뼈대• CWinApp: 응용프로그램• CFrameWnd: 창 틀 ( 프레임 )• CChildView: 창의 내용 ( 뷰 )

교재 51,52 쪽교재 131,132쪽

https://msdn.microsoft.com/ko-kr/library/5c2fsa5a.aspx

Page 23: MFC 발견 (2)

창을 만들어 봅시다 .

MFC_2.cpp

Page 24: MFC 발견 (2)

CString 을 들어가기 전에• 문자와 문자’열’char chA = ‘A’;char chKor = ‘ 가’ ; (X)char *str1 = “MF 씨발 1”;char str2[ ] = “MF 씨발 2”;

char 는 영어권 (ASCII) 을 기준으로 만들어졌음 .

char 는 1 바이트이기 때문에 , 전세계 모든 문자들을 표현할 수 없는 한계점이 있다 .

A가 /2

가 /2 두 개가 모여서 비로소 ‘가‘

MBCS

M F 씨 /2

씨 /2

발 /2

발 /2 1

교재 81 쪽교재 111 쪽

Page 25: MFC 발견 (2)

MBCS (Multi-Byte Character Set)

char 문자형의 진실 !char 는 8bit(1Byte) 를 모두 쓰지 않는다 !

7 6 5 4 3 2 1 0

예약된 비트 !

최상위 비트 (MSB) 가 set 되면 다음 문자까지 확장 .즉 , 멀티바이트 ! CharBit.cpp

Page 26: MFC 발견 (2)

코드 페이지• 같은 값이라도 코드페이지가 다르면 다른 문자로 보인다 .

Page 27: MFC 발견 (2)
Page 28: MFC 발견 (2)

MBCS (Multi-Byte Character Set)• MBCS 만으로는 한계가 있다 .

그래서 나온 놈이 유니코드 !유니코드를 사용하는 함수들은 w 가 붙는다 .

strlen, wcslenprintf, wprintfstring, wstring

Page 29: MFC 발견 (2)

유니코드와 MBCS 는 호환이 안 된다 .

유니코드용 , MBCS 용 따로 개발해야하나 ?

개노가다

Page 30: MFC 발견 (2)

MFC 는 이러한 문제점을 해결해준다 .• CString• _T()• TCHAR• LPTSTR

위 녀석들을 쓰면 컴파일러가 알아서 처리해준다 !그래서 _T(“”) 를 쓰는 이유 !

형식 ANSI UNICODE

TCHAR char wchar_t

LPTSTR char* / LPSTR wchar_t* / LPWSTR

LPCTSTR const char* / LPCSTRconst wchar_t* /

LPCWSTR

Page 31: MFC 발견 (2)

MS 는 참 똑똑하구만

Page 32: MFC 발견 (2)

CString 예제들CString str;str = _T(“ 안녕” );str += _T(“ 하세요” ); // “ 안녕하세요”str.Format(_T(“%d, %s, %.2f”), 50, “MFC 발견” , 50.7); // 50, MFC 발견 , 50.70

str.LoadString(IDS_STRING);

MFC_5.cpp

Page 33: MFC 발견 (2)

중간정리 2• 컴퓨터는 처음에 영어 (ASCII) 전용으로 탄생하였다 . (char)

• 그러다가 문자 표현에 문제가 생겨 MBCS 를 쓴다 .

• 그래도 문제점이 있어서 유니코드를 사용한다 .

• 이것들을 해결해주는 기특한 녀석이 CString 과 _T()

Page 34: MFC 발견 (2)

str.LoadString (IDS_STRING);

  문자열 리소스를 읽습니다

Page 35: MFC 발견 (2)

뭔 개소리야

Page 36: MFC 발견 (2)

리소스• Resource: 자원 , 자료

코드의 논리와 무관한 데이터들( 메뉴 , 비트맵 , 엑셀레이터 , 문자열 , 아이콘 , 커서 등… )

왜 리소스를 만드냐 ?- 디자이너와 개발자 작업분담이 쉽다 .(HTML, CSS 관계 )- 리소스만 컴파일 하면 된다 .- 재사용이 쉽다 .- 국제화 (i18n) 하기 편하다 교재 213 쪽

Page 37: MFC 발견 (2)

리소스의 개념은 여러 곳에서 쓰입니다 .

리소스를 쉽게 비유하면 “옷 갈아 입는 것”에 비유할 수 있어요 .

- HTML+CSS- 안드로이드 개발에서도 !- 한글판 / 영어판 / 일본어 번역 파일 등등

Page 38: MFC 발견 (2)

안드로이드 스튜디오 비주얼 스튜디오

Page 39: MFC 발견 (2)

아니 그러니까 리소스 왜 쓰냐고 ?

Page 40: MFC 발견 (2)

리소스의 위력에 대해 살펴보겠습니다 .리소스해커 시연

그렇다면

Page 41: MFC 발견 (2)

오늘 내용 정리• 이벤트 - 드리븐 , 메시지• 메시지맵 , 이벤트 핸들러 (WM_PAINT …)

• MFC 뼈대 (CWinApp, CFrameWnd, CChildView)

• 유니코드 , MBCS, 코드페이지• CString

• 리소스

Page 42: MFC 발견 (2)

오늘 핵심 내용• 메시지맵• CString

• _T이 3 개를 제대로 이해하려고

떠들어댔습니다 .. ㅠㅠ

Page 43: MFC 발견 (2)

다음 시간에는 ?지금까지 윈도우플밍 기초를 다졌습니다 .

- 캡슐화 (MFC vs SDK)- WinMain,

CWinApp::InitInstance- 이벤트 - 드리븐- 메시지맵- CWinApp

CFramdWndCChildView

- CString- 유니코드 다음시간

4 장 . 화면출력