Win32API 강의 54화. Win32API 파일 입출력 (1)
https://www.youtube.com/watch?v=j1jpsY4wdSY&list=PL4SIC1d_ab-ZLg4TvAO5R4nqlJTyJXsPK&index=54
< 배우게 된 내용 >
실행중인 모든 데이터들이 ram에 저장되어 있음
프로그램이 종료되면 실행중인 데이터들은 모두 사라짐
-> 데이터들을 잃어버리고 싶지 않으면 저장공간에 저장해야함
( Ram과 저장장치 (연결 = File, 바이트 단위로 메모리 전송 ) = 파일 입출력 ) -> _wfopen_s 함수 사용
1. ToolScene에서 Tile 정보 저장
2. Scene에서 Tile 정보를 읽어오는 기능 ( CScene에서 구현 )
타일이 저장 될 곳 위치
( 우리 프로그램에서만 사용하는 확장자파일 -> .tile)
b를 안쓰면 문자로 저장함
-> 27이 아스키코드로 ESC여서 종료되기 때문에 추후 문제가 생겨서 b를 꼭 써주기
타일 저장하기 ( Scene_Tool 에서 )
void CScene_Tool::SaveTile(const wstring& _strRelativePath)
{
wstring strFilePath = CPathMgr::GetInst()->GetContentPath();
strFilePath += _strRelativePath;
// 커널 오브젝트
FILE* pFile = nullptr;
// 이중포인터 wb ( 바이너리로 쓰기, b를 안쓰면 문자로 저장함 )
_wfopen_s(&pFile, strFilePath.c_str(), L"wb");
assert(pFile);
// 데이터 저장
UINT xCount = GetTileX();
UINT yCount = GetTileY();
fwrite(&xCount, sizeof(UINT), 1, pFile);
fwrite(&yCount, sizeof(UINT), 1, pFile);
// 모든 타일들을 개별적으로 저장할 데이터를 저장하게 함
const vector<CObject*>& vecTile = GetGroupObject(GROUP_TYPE::TILE);
for (size_t i = 0; i < vecTile.size(); ++i)
{
((CTile*)vecTile[i])->Save(pFile);
}
fclose(pFile);
}
타일 불러오기 ( CScene 에서 )
void CScene::LoadTile(const wstring& _strRelativePath)
{
wstring strFilePath = CPathMgr::GetInst()->GetContentPath();
strFilePath += _strRelativePath;
// 커널 오브젝트
FILE* pFile = nullptr;
// 파일 읽기
_wfopen_s(&pFile, strFilePath.c_str(), L"rb");
assert(pFile);
// 데이터 저장
// 타일 가로 세로 갯수 불러오기
UINT xCount = 0;
UINT yCount = 0;
fread(&xCount, sizeof(UINT), 1, pFile);
fread(&yCount, sizeof(UINT), 1, pFile);
// 불러온 개수에 맞게 EmptyTile 들 만들어 두기
CreateTile(xCount, yCount);
// 만들어진 타일 개별로 필요한 정보를 불러오게 함
const vector<CObject*>& vecTile = GetGroupObject(GROUP_TYPE::TILE);
for (size_t i = 0; i < vecTile.size(); ++i)
{
((CTile*)vecTile[i])->Load(pFile);
}
fclose(pFile);
}
< 타일이 저장해야할 정보 >
텍스쳐는 하나만 참조하고 있기 때문에 따로 저장할 필요는 없음
-> 해당 이미지에서 몇번째 인덱스를 저장하고 있는지만을 저장하면 됨
void CTile::Save(FILE* _pFile)
{
fwrite(&m_iImgIdx, sizeof(int), 1, _pFile);
}
void CTile::Load(FILE* _pFile)
{
fread(&m_iImgIdx, sizeof(int), 1, _pFile);
}
Win32API 강의 55화. Win32API 파일 입출력 (2)
https://www.youtube.com/watch?v=X9KROx_5LzY&list=PL4SIC1d_ab-ZLg4TvAO5R4nqlJTyJXsPK&index=55
< 배우게 된 내용 >
윈도우에서 파일을 저장과 열기 UI를 표시해주는 dialog을 제공
아래창은 OPENFILENAME 구조체를 만들어서 GetSaveFileName 함수에 인자로 넣어주면 됨
아래의 저장 버튼을 눌렀을때 true값을 반환하므로, if문에서 타일을 저장하는 함수를 부르면 됨
저장했을때 들어가는 경로값이 lpstrFile에 들어감
즉 저장을 누르면 최종적으로 들어간 경로명이 lpstrFile이 들어가지기 때문에 경로를 알아줬으니
이 경로로 저장되는 함수를 불러오면 됨
창은 UI일 뿐이고 저장하거나 그런 기능은 없고, 경로만 줄 뿐! ( 따로 구현해야함 )
파일을 열때도 똑같음!, 다만 열때는 GetOpenFileName 함수를 사용한다
저장할때는 절대경로로, 불러올때는 절대경로를 상대경로로 바꿔서 함수 안에서 절대경로를 붙여서 여는 방식으로 구현
load는 다른 씬에서도 사용하기 때문
CScene_Tool 에서 LSHIFT(저장), CTRL(불러오기) 지정
void CScene_Tool::update()
{
CScene::update(); // 부모의 기능 호출
SetTileIdx();
if (KEY_TAP(KEY::LSHIFT))
{
//CUIMgr::GetIns\t()->SetFocusedUI(m_pUI);
SaveTileData();
}
if (KEY_TAP(KEY::CTRL))
{
//CUIMgr::GetIns\t()->SetFocusedUI(m_pUI);
LoadTileData();
}
}
윈도우의 dialog을 통해 파일을 저장
void CScene_Tool::SaveTileData()
{
wchar_t szName[256] = {};
OPENFILENAME ofn = {};
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = CCore::GetInst()->GetMainHwnd();
// 완성된 경로가 채워질 곳
ofn.lpstrFile = szName;
ofn.nMaxFile = sizeof(szName);
// 아무 이름이나 아무 확장자 여도 됨 ( 이 필터들만 적용되서 골라짐 )
ofn.lpstrFilter = L"ALL\0*.*\0Tile\0*.tile\0";
ofn.nFilterIndex = 0;
ofn.lpstrFileTitle = nullptr;
ofn.nMaxFileTitle = 0;
wstring strTileFolder = CPathMgr::GetInst()->GetContentPath(); // 절대경로
strTileFolder += L"tile";
ofn.lpstrInitialDir = strTileFolder.c_str();
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// 창 열어주는 함수, Modal 방식
if (GetSaveFileName(&ofn)) // 저장하기를 눌렀을때, true값 반환
{
SaveTile(szName);
}
}
윈도우의 dialog를 통해서 파일을 열기
void CScene_Tool::LoadTileData()
{
wchar_t szName[256] = {};
OPENFILENAME ofn = {};
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = CCore::GetInst()->GetMainHwnd();
// 완성된 경로가 채워질 곳
ofn.lpstrFile = szName;
ofn.nMaxFile = sizeof(szName);
// 아무 이름이나 아무 확장자 여도 됨 ( 이 필터들만 적용되서 골라짐 )
ofn.lpstrFilter = L"ALL\0*.*\0Tile\0*.tile\0";
ofn.nFilterIndex = 0;
ofn.lpstrFileTitle = nullptr;
ofn.nMaxFileTitle = 0;
wstring strTileFolder = CPathMgr::GetInst()->GetContentPath(); // 절대경로
strTileFolder += L"tile";
ofn.lpstrInitialDir = strTileFolder.c_str();
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// 창 열어주는 함수, Modal 방식
if (GetOpenFileName(&ofn)) // 저장하기를 눌렀을때, true값 반환
{
wstring strRelativePath = CPathMgr::GetInst()->GetRelativePath(szName);
LoadTile(strRelativePath);
}
}
'Win32API' 카테고리의 다른 글
Win32API 렌더링 최적화 (0) | 2025.01.27 |
---|---|
Win32API Alpha Blend (0) | 2025.01.27 |
Win32API UI (0) | 2025.01.25 |
Win32API Tool (0) | 2025.01.21 |
Win32API Unity Build (0) | 2025.01.20 |