출력위치를 좌상단
본인의 위치도 좌상단
2의 제곱 단위픽셀을 타일로 사용하는것이 좋다
32bit 8*6의 타일 이미즈를 사용 한다고 하면
첫번째부터 오른쪽으로 차례로 인덱스가 매겨지고
행과 열 계산 가능
인덱스/ (열의 최대 개수인 8) = 몇번째 행
인덱스 % (열 최대갯수8) =몇번째 열
타일 이미즈 전체를 픽셀 단위로 나위어 인덱스화 화였다.
값을 입력받는 ui
값을 입력받은 후 tile 생성
모달
모든 주목을 하나의 윈도우로,다이얼 로그 또한 모달방식
메인 처리기에서 메세지를 받고 크레에이트 윈도우를 통해 하나 만듦
해당 윈도우 처리기 실행, 엔드 메시지 받으면 그 윈도우의 커널 오브젝트
제거하면서 그 윈도우 제거
즉 이 윈도우가 return을 하지않으면 다른 윈도우들은 실행이 안됨
모달리스-실시간 윈도우 메세지 받아들이고 처리
크레에이트 윈도우 여러개 한 후,
메인 cpp의 메세지 처리 루프에 각 윈도우 메세지가 큐에 쌓일 것이고
하나씩 꺼내서 해당 하는 윈도우 주소에 메세지 전달
메세지 들어오면 해당 윈도우의 procedure함수에서 처리
리소스뷰에서 다이얼로그를 하나 만든다면
리소스 헤더파일에 만든거나 변경된 아이디가 #define코드가 추가 됨
main cpp이 리소스 헤더파일을 참조 하고 있기때문에 메세지 처리 루프에서 인식 할수 있음
리소스 헤더 파일과 리소스뷰를 동시에 열수 없음
헤더파일을 본다는 것은 헤더파일의 문자열을 메모리에 올리는건데 리소스뷰를 연다는 것은
원본은 변경 시킬 수 있다는 것이기 때문에 괴리가 생겨서 막아 놓았음
박스의 버튼에도 아이디가 있다
버튼도 엄밀히 따지면 윈도우이다. 자식 윈도우와 같은 개념.
윈도우 등록하는 곳에 윈도우 메뉴바 등록 한것 처럼
윈도우이며 모달 방식
메인 처리기에서 메시지를 받은 후
해당 윈도우 이동 한후 마지막 인자의 함수 실행
리턴값으로 마지막인자의 엔드 다이얼로그 메세지를받을수 있음
위의 캡처는 해당 메세지가 호출된 윈도우의 처리기 함수(메인 윈도우)
여기서 okay or cancel을 리턴
MAKEINTRESOURCE의 매개변수 문자들이 내가 만든 다이얼로그의 아이디이다
메인 처리기에서 리턴된 반환값을 받고 처리 할수도 있다 라는 것만 알아두기
다이얼로그 리소스뷰에서의 속성에 숫자를 true로 하면 숫자만 받게 한다
GetDigItemInt
실제 입력된것은 문자열이지만 이것을 숫자로 바꿔주는 것
INT_PTR CALLBACK TileCountProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
if (LOWORD(wParam) == IDOK)//타일 x,y갯수들의 숫자를 입력하고 ok눌렀을때
{
UINT iXCount =GetDlgItemInt(hDlg, IDC_EDIT1, nullptr, false);//적은 숫자 받기
UINT iYCount =GetDlgItemInt(hDlg, IDC_EDIT2, nullptr, false);
CScene*pCurScene= CSceneMgr::GetInst()->Get_pCurScene();//현재씬 받기
CScene_Tool* pSceneTool = dynamic_cast<CScene_Tool*>(pCurScene);//씬툴로 다운 캐스팅
assert(pSceneTool);//sceen tool로 다운캐스팅 실패면 assert
pSceneTool->DeleteGroup(GROUP_TYPE::Tile);//원래 있던 타일 초기화
pSceneTool->CreateTile(iXCount, iYCount);//입력받은 수 만큼 타일 만들기
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
}
이 CALLBACK형 함수를 메인 cpp의 윈도우 proc함수에서
다이얼로그 3번째 인자로 넣어주면 메뉴 타이틀에서 실행 가능하다