쑤쑤_CS 기록장
[TIPS 20기]13-15. MFC 강좌 정리 본문
[ 13강 ]
MFC
* 시스템 클래스
공부할 때 많이 씀
초보자를 위한 인터페이스
그러나 실제 업무를 할 때는 속도, 메모리 관리로 인해 사용하지 않음
COB
//
* CWinApp : 모든 MFC structure가 시작, 진행되는 클래스 {= 영혼}
C(: MFC) Win(: windows) App(: application) : windows 응용 프로그램에 대한 기능들
WinMain(클래스 등록, 윈도우 만드는, 메세지 도는) 작업이 들어가있음
CWinApp에서 내 클래스를 상속받는다
InitApplication : 윈도우 클래스 동록 내용의 함수
InitInstance : create, update, show window 윈도우 만드는 내용의 함수
사용자가 상속받아 오버라이딩 하도록 코드가 실제로는 비워있다. 가이드만 한다.
반.드.시 내가 오버라이딩 하고, main window를 만드는 작업을 해야된다.
마법사 2개 class wizard 가 자동으로 다 해준다.
Run : 메세지 도는 함수
시작 순서 InitApplication -> InitInstance -> Run
끝 순서 -> ExitInstance -> ExitApplication
(다섯 가지 대표 함수)
CWinThread <- CWinApp <- WinMain
* CWnd : CWindow. 윈도우를 다루는 클래스. 눈으로 보이는 대표적인. 실제 작업하는. {= 육체}
//
//{{ //}} wizard 가 쓰는 주석(특수기호와 함께 함)
함부로 지우면 안된다
wmcreate : window
* MFC : CWinApp + CWnd 두 클래스로 모두 만들 수 있다. {= 영혼 + 육체}
MENU : 많은 기능을
Tool Bar
Status Bar
CView
CDocument
SID : MFC 사용한 표준적인 개발 방법
* CDialog 클래스
사용자에게 대화하듯이 서로 interative 하게 창이 뜬다
~할까요? ~ : 창 dialog
사용자가 하고 단일 기능을 쉽게 쓸 수 있도록 만들어놓은 창
변태. 자기가 Run을 따로 갖고있음
SDI 빼기
리소스를 저장할 때는 반드시 리소스가 보이는 상태에서 저장해야된다.
save all로 저장하면 종종 리소스가 중국어로 바뀌는 오류가 난다
https://blog.naver.com/tipsware/221466113511
[ 14강 ]
1. 사각형 다섯개 만들기
2. 마우스 클릭 시 사각형 색깔 채움 바꾸기
if(i*50 < x && x < (i+1)*50 ) //y는 0~50 으로 고정됨
사각형 영역을 다루는 클래스 CRect
PtInRect //사각형 안 인지 확인해주는 함수
효율은 떨어지지만 외적으로 간단
어떤 점을 가지고 그 점이 어떤 영역에 들어있는지 확인 가능
index = (x/50)
index는 0, 1, ,,, 4 몇번째 사각형의 좌표인지 알게 됨
ctrl+ko : 헤더파일
int index = point.x / 50;
if (point.y < 50 && index < 5) {
if(m_select_index != -1)
dc.Rectangle(m_select_index * 50, 0, 51 + m_select_index * 50, 50);
dc.FillSolidRect(index * 50 + 1, 1, 49, 48, RGB(0, 0, 255));
m_select_index = index;
}
//이전 클릭된 것 -> 다시 그림
이전에 클릭한게 있으면 -1이 아님
10. 헤더파일에 mstep 0 으로 초기화
현재 문제 : window 밖으로 나가면 판 엎기 가능, 현재 같은 위치에 겹쳐서 올릴 수 있음
돌 그리기가 없고 판 그리기만 있기 때문
19 19 이차원 배열로 기록 하면 된다() 0: 돌이 없는 상태 1: 흑돌 2: 백돌
if (x < 19 && y<19 && m_dol[y][x] == 0) { //돌 들어와있지 않음
CClientDC dc(this);
dc.SelectStockObject(DC_BRUSH);
dc.SetDCBrushColor(0x00FFFFFF * m_step);
dc.Ellipse(x*30, y*30, 30+x*30, 30+y*30);
m_dol[y][x] = m_step + 1; //흑돌이면 1, 백돌이면 2 (mstep + 1인 값) 저장
m_step = !m_step; //0이면 흑돌, 1이면 백돌
}
// 중복을 막음
//배열에 저장해 놓은 값을 다시 그려줌
dc.SelectStockObject(DC_BRUSH);
for (int y = 0; y < 18; y++) {
for (int x = 0; x < 18; x++) {
if (m_dol[y][x]) {
dc.SetDCBrushColor(0x00FFFFFF * (m_dol[y][x] - 1)); //흑돌 백돌 저장 값(2, 1)으로 색깔 다시 지정(1, 0)
dc.Ellipse(x * 30, y * 30, 31 + x * 30, 31 + y * 30);
}
}
}
Direct 2D(라이브러리) + 그라데이션 옵션 -> 오목 그래픽 변화 과정
포토샵 (그림으로 싹 한것) : 제일 깔끔하다
----------------------
C 이미지 클래스의 버그
그림 출력, 크기에 맞추기
13 색깔이 깨지게 줄여짐
m image에 그림이 로드 되어있는지 확인
https://blog.naver.com/tipsware/221469455041
[ 15강 ]
이미지 폴더 넣기
헤더 파일에 private 변수 선언
카드 가로로 출력 해보기
666666 출력해보기
헤더 파일에 일차원배열 선언
배열에 카드 넣기
srand() rand()
난수 발생
지금은 시간을 기준으로 난수 발생시킴 time()
<난수 발생 함수> https://blog.naver.com/tipsware/220844986850?viewType=pc
srand((unsigned int)time(NULL));//난수의 시드 값으로 time 사용
a, b 카드의 위치 랜덤으로 바꿈
set timer : ms 단위로. (timer ID, 몇초 뒤 호출될 지, 몇초 간격 NULL : 3초마다 WM_TIMER 메세지 발생시킴)
프로젝트 - 클래스 마법사
WM_TIMER 추가
OnTimer 란 : 타이머 이름
타이머는 ID쓰는 습관을 가지는게 좋다!
1번 타이머 인지 비교 - 조건문
너무 짧은 타이머는 안쓰는게 좋다(어차피 쓰이지 못함)
3초마다 메세지를 발생시키는데, 타이머 안 if 문에서 3초 이상의 코드를 실행하면 코드가 엉망된다
KillTimer
카드 클릭시 위치 뒤집음
아직 첫번째 카드가 선택되지 않았다는 의미의 -1
같으면 아무 처리도 안되게 return문 걸기
카드가 같은 경우 0으로 처리한다
Draw 그리는 순서를 먼저해서 return문 어디에 하지 하는 고민 해결
continue : 밑을 수행하지 않고 다음걸 수행
https://blog.naver.com/tipsware/221472244838
'IT 지식 기록 > TIPS - C 언어 수업 정리' 카테고리의 다른 글
[TIPS 20기] 김성엽 선생님의 수업을 마치며 (0) | 2019.05.30 |
---|---|
[TIPS 20기]12. Windows 프로그래밍 두번째 강좌 정리 (0) | 2019.05.30 |
[TIPS 20기]11. Windows 프로그래밍 첫번째 강좌 정리 (0) | 2019.05.30 |
[TIPS 20기]10. C++언어 세번째 강좌 정리 (0) | 2019.05.30 |
[TIPS 20기]9. C++언어 두번째 강좌 정리 (0) | 2019.02.14 |