WinAPI 55 파일 입출력 (2)

CJB_ny·2022년 10월 3일
0

WinAPI

목록 보기
57/79
post-thumbnail

오늘 배운거 👍👍👍

  • 타일 데이터 저장 : 윈도우 에서 제공하는 함수 사용

  • 타일 데이터 불러오기 : 저장할 때와 거의 똑같다.

  • 타일 불러올 때 경로 수정

    전체 경로 -> 절대 경로 자른다 -> 상대경로 만 추출

    상대경로 추출 하는 과정에서 wstring 에서 제공하는 함수 사용

    함수 :
    find() : 말 그대로 특정 구문 찾아서 반환

    substr() : 지정한 끝부분에서 부터 잘라서 반환

  • 사용한 함수들

    wcslen

    c_str()


.tile 파일을 저장하기 위한 경로를 구현해보도록 하자.

이런식으로 창이떠서 저장이 가능하면 좋을 거 같다.

만들기가 쉬워보이지가 않는데 윈도우가 파일 불러오고 저장하는것에 대해서는 이런식으로 제공을 해주고 있다.

자주사용하는 윈도우 형태는 제공을 해주고 있다.

쉬프트키 눌렀을 때 경로가 확정이 되면은

이녀석을 호출 할 것이다.

OPENFILENAME

이런 구조체인데 채워야할게 많다. => 외우는 것은 아님

=> 예시 코드를 제공을 한다. => 구글링 ㄱㄱ.

이까지는 사이즈주고, 현재 파일 저장 윈도우가 뜰 상위 윈도우를 지정하는게

hwndOwner를 현재 우리 프로젝트의 핸들 ID를 주면은된다.

그리고 중요한 부분이

IpstrFile 부분인데 => 완성된 경로가 채워 질 곳이다.

경로의 위치를 배열의 시작 주소로 할당을 해 놓는다.

그리고 이렇게.

그리고 나서 필터를 설정할 수 있는데 : 특정 확장자 명만 설정을 할 수 있는..

근데 이 필터를 설정하는 방법이 좀 까다롭다.

모든 확장자에 대해서 다 보여주고싶을 경우 이렇게 한다.

여기서 새로운 필터를 추가하고싶다면은

.tile을 추가하고싶으면은

이렇게 설정 해 줄 수 있다.

FilterIndx : 골라놓은 필터 중에 초기 필터를 무엇을 셋팅을 할지이다.

이부분은 초기 경로랑 Flag설정 부분이다.

이렇게 해서 우리가 셋팅한 정보를 토대로 창 하나를 열 것이다.

그때, 사용하는 함수가

이런창이 하나 뜬다. 근데 이창은 '모달 방식'이다.

모달 방식 특징이 뭐냐?

우리 타일 갯수 지정하는 윈도우가 모달 방식인데,

특징은 해당창이 모든 포커싱을 다 가져가고 다른 부분들이 동작하지 않는다.

그 말인 즉슨 GetSaveFileName 함수가 호출하고 돌아 온다? 안돌아 온다?

윈도우가 닫히기 전까지는 해당함수가 return 되어서 돌아오지 않는다.

반환 값으로는

저장은 true가 반환되고 취소는 false가 반환이 된다.

실행 테스트

정말 신기하게도 이런 창이 뜬다.

우리가 지정해준 필터들도 볼 수 있다.

이상태로 파일 이름과 확장자명을 짓고 저장을 누르면 true가 반환되면서

요 딱 걸린다.

그러면 내가 방금 적은 이름으로 저장이 되어야한다.

그래서 그 마지막으로 파일이름을 타이핑 처서 저장할 때 적었던 문자들이 어디에 들어와있냐하면은

요 들어와있다.

그래서 아까 최종 경로와 파일이름이 szName에 채워질 것이니까

이런 절대 경로가 아니라

이렇게 채워주도록 하자.

SaveTile에는 절대경로가 들어 올 것이니까

LoadTileData의 경우에도 구조가 똑같고 절대 경로 szName을 전달해 줄것이다.

그러면 LoadTile의 경우에도 SaveTile처럼 조금 수정해야하지 않나?

지금 Loadtile에서 알아서 절대경로를 찾아서 경로를 찾는데

우리는

이런식으로 전체 경로를 전달해주고 있기 때문에 절대경로를 잘라서 전달해주든가 해야한다.

전체 경로 -> 상대경로 ❗❗❗

tile을 Load하는 부분에서 전체 경로에서 절대경로를 잘라내고 상대경로만 추출하는 작업을 할 것이다.

GetRelativePath 함수에서 contentsPath 배열과 relativePath 배열을 for문으로 하나하나 비교하는거 좀 노가다성이 짖다 (가능은함)

wstring에서 제공하는 함수를 사용하도록 하자.

내가 지정한 구문을 찾아 낼 수 있다.

또한 substr 이라는 함수도 있다. : 특정 구문에서 원하는 부분 자를 수 잇다.

find는 좀 까다로운게 찾기는 찾는데 찾은 시작 idx를 반환한다.

Tile\tile.tile전까지 찾았는데 찾은 시작점 인덱스를 반환한다.

wcslen : 문자열 길이를 반환

잘 짤리는거 확인 가능하다.

LoadTileData

잠깐 정리를 하자면은 LoadTile함수에 들어갈 경로가 절대 전체경로이면 안되기 때문에

우리가 전체경로에서 상대경로만을 뽑아서 전달하기 위해서 PathManager에서 상대 경로만 뽑는 함수를 만들어서 반환을 relativePath에 해준다음에

이제 비로소 LoadTile에다가 추출한 상대경로만을 넣어 줄 수 있게 되었다.

LoadTile에서는 다시 절대 경로를 붙여줄 것이라서

테스트

컨트롤키 누르면 해당 윈도우가 뜬다.

그리고 저 파일 누르고 열면은

잘 열린다.

다른 파일도 저장후에 잘 불러와진다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글