Upload
-
View
445
Download
2
Embed Size (px)
Citation preview
MFC 발견두번째 주제
• 윈도우 프로그래밍 필수사항 ( 메시지 , 이벤트 )• MFC 큰 뼈대• CString(with 유니코드 ), 자료구조 이야기
↑ 시바견
v
지난 주 복습• MFC 는 SDK 를 객체로 감싼 것에 불과하다 .( 캡슐화 )
• main 조차도 숨겨져 있다 .( 캡슐화 )CWinApp::InitInstance(MFC 에서의 Main 역할 )
진입점 , WinMain, Create
저번 주는 MFC 를 어렵게 느끼게했던캡슐화에 대해 알아보았다 .
윈도우 플밍 필수지식 : 이벤트 - 드리븐• 이벤트가 뭘까요 ? 사건 !
클릭했을 때마우스 움직이는 거키보드 누르는 거창이 생성되는 거창이 닫히는 거
스크롤바가 움직이는 거입력 창 내용이 변하는 거
...엄청많다 !
교재 29 쪽교재 32 쪽
딸깍 ! ( 클릭 )
윈도우 플밍 필수지식 : 메시지• 메시지가 뭘까요 ? 이벤트가 발생했다는 사실을 알려주는 놈 !
전송버튼 클릭 마우스 움직임 키보드 눌림
이벤트 발생 ! 메시지 큐에 추가됨
AfxMessageBox(_T(“ 클릭하셨네요 !”))
메시지 처리부 ( 핸들러 )
교재 29 쪽교재 32 쪽
1. 마우스를 클릭했다 . ( 이벤트 발생 )
2. 운영체제가 이 사실을 프로그램에게 알려준다 . ( 메시지 )
3. 프로그램이 메시지 창을 띄운다 . ( 핸들러 실행 )
예를 들어봅시다 .
이벤트가 발생하고 프로그램에게 메시지가 전달되고 ,
프로그램은 메시지를 꺼내와 처리하는 방식
이벤트 - 드리븐 (event-driven) 방식
이벤트 - 드리븐은 여기저기 쓰입니다 .• 얻어 맞을 때• MFC 외에도 자바 GUI, 자바스크립트 , Qt, 안드로이드 등등
웹 개발
Qt 라이브러리
안드로이드
HelloSDK 심층분석 : 이벤트 핸들러
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms633577(v=vs.85).aspx
길어지는 함수
Procedure; 절차 , 방법 , 처리
HelloSDK 심층분석 : 이벤트 핸들러
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms633577(v=vs.85).aspx
길어지는 함수Procedure; 절차 , 방법 , 처리
HelloMFC 심층분석 : 이벤트 핸들러
메시지 맵은 이벤트와 핸들러 ( 처리자 ) 를이어주는 ( 맵핑 ) 해주는 역할을 한다 .
기본적인 것들은 이미 맵핑되어 있다 .
함수가 단순해지고
깔끔한 코드
메시지맵이 뭔가요 ?기존 switch 를 이용하던 것을 객체지향적으로 예쁘게 한 녀석
메시지맵을 써봅시다 .
1
2
3
선언하고
정의하고
핸들러 만든다
MFC_3.cpp
https://msdn.microsoft.com/ko-kr/library/sf1ba0hh.aspx
이런 거 다 알아야 하나요 ? No!
당연히 추상화 / 캡슐화 되어있죠 !
기본적인 것들은 이미 맵핑되어있다 .
메시지들은 이미 매핑되어있다 .• 그래서 메시지맵 !
WM_CLICK
WM_PAINT
::On-Paint();
::OnClick();
메시지
맵 (map): 지도
실습을 해 봅시다 .MFC_3.cpp MFC_4.cpp
123
선언하고정의하고핸들러 만든다
이런 거 언제 일일이 하고 있어 !
그 동안삽질하고있었어
( 어려우니까 ) 중간정리• GUI 는 이벤트 기반의 개발이다 . ( 이벤트 - 드리븐 )
• 이벤트가 발생되면 , 창에게 메시지가 보내진다 .
• 그 메시지를 처리하면 된다 . ( 메시지 핸들러 )
• MFC 에서는 메시지에 따라 자동으로 함수를 실행해준다 . ( 메시지맵 )
MFC 의 큰 뼈대• CWinApp: 응용프로그램• CFrameWnd: 창 틀 ( 프레임 )• CChildView: 창의 내용 ( 뷰 )
교재 51,52 쪽교재 131,132쪽
https://msdn.microsoft.com/ko-kr/library/5c2fsa5a.aspx
창을 만들어 봅시다 .
MFC_2.cpp
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 쪽
MBCS (Multi-Byte Character Set)
char 문자형의 진실 !char 는 8bit(1Byte) 를 모두 쓰지 않는다 !
7 6 5 4 3 2 1 0
예약된 비트 !
최상위 비트 (MSB) 가 set 되면 다음 문자까지 확장 .즉 , 멀티바이트 ! CharBit.cpp
코드 페이지• 같은 값이라도 코드페이지가 다르면 다른 문자로 보인다 .
MBCS (Multi-Byte Character Set)• MBCS 만으로는 한계가 있다 .
그래서 나온 놈이 유니코드 !유니코드를 사용하는 함수들은 w 가 붙는다 .
strlen, wcslenprintf, wprintfstring, wstring
유니코드와 MBCS 는 호환이 안 된다 .
유니코드용 , MBCS 용 따로 개발해야하나 ?
개노가다
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
MS 는 참 똑똑하구만
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
중간정리 2• 컴퓨터는 처음에 영어 (ASCII) 전용으로 탄생하였다 . (char)
• 그러다가 문자 표현에 문제가 생겨 MBCS 를 쓴다 .
• 그래도 문제점이 있어서 유니코드를 사용한다 .
• 이것들을 해결해주는 기특한 녀석이 CString 과 _T()
str.LoadString (IDS_STRING);
문자열 리소스를 읽습니다
뭔 개소리야
리소스• Resource: 자원 , 자료
코드의 논리와 무관한 데이터들( 메뉴 , 비트맵 , 엑셀레이터 , 문자열 , 아이콘 , 커서 등… )
왜 리소스를 만드냐 ?- 디자이너와 개발자 작업분담이 쉽다 .(HTML, CSS 관계 )- 리소스만 컴파일 하면 된다 .- 재사용이 쉽다 .- 국제화 (i18n) 하기 편하다 교재 213 쪽
리소스의 개념은 여러 곳에서 쓰입니다 .
리소스를 쉽게 비유하면 “옷 갈아 입는 것”에 비유할 수 있어요 .
- HTML+CSS- 안드로이드 개발에서도 !- 한글판 / 영어판 / 일본어 번역 파일 등등
안드로이드 스튜디오 비주얼 스튜디오
아니 그러니까 리소스 왜 쓰냐고 ?
리소스의 위력에 대해 살펴보겠습니다 .리소스해커 시연
그렇다면
오늘 내용 정리• 이벤트 - 드리븐 , 메시지• 메시지맵 , 이벤트 핸들러 (WM_PAINT …)
• MFC 뼈대 (CWinApp, CFrameWnd, CChildView)
• 유니코드 , MBCS, 코드페이지• CString
• 리소스
오늘 핵심 내용• 메시지맵• CString
• _T이 3 개를 제대로 이해하려고
떠들어댔습니다 .. ㅠㅠ
다음 시간에는 ?지금까지 윈도우플밍 기초를 다졌습니다 .
- 캡슐화 (MFC vs SDK)- WinMain,
CWinApp::InitInstance- 이벤트 - 드리븐- 메시지맵- CWinApp
CFramdWndCChildView
- CString- 유니코드 다음시간
4 장 . 화면출력