Game Develop

WINAPI FileDialog 사용하다 곤란했던 일 본문

ComputerGraphics/My Project

WINAPI FileDialog 사용하다 곤란했던 일

MaxLevel 2021. 11. 12. 11:58

사실 아직도 도저히 이해가 안가는 일이긴 하다.

씬에서 직접 fbx파일을 추출해서 Asset창에 보여주고 렌더시키는 툴을 만드는 중인데 fbx파일 선택을 위해 공용대화상자를 여는 winapi를 찾게 되었다. 

먼저 사용한건 commdlg.h에 있는 GetOepnFileName()이라는 함수를 이용해서 파일대화상자(FileDialog)를 여는건데, 비교적 사용법은 쉬웠다. (사용법에 대해선 따로 정리해놨다)

 

근데 이상하게, 저 대화상자를 열고 파일 선택하고 확인을 누른 다음에 ModelExporter을 실행하면 도통 파일을 읽어오질 못한다. 이것저것 시도하다 하루를 날렸는데 멘탈이 조금 깨졌었다. 그냥 한창 구현만 하면 되는 작업이였어서 딱히 막히는일이 없을줄알았는데 생각치도못한곳에서 작업이 멈추니까 짜증도 많이 났었다.

 

대화상자에서 파일선택하고 확인 누른다음 리턴된 파일경로를 String으로 변환하고 ModelExporter에 파라미터로 넘기는부분이였는데 뭐가 문제인지 찾기위해서 ModelExporter에서 파라미터로 넘겨온값으로 fbx파일을 읽어들이는게 아니라 그냥 고정된값으로 읽기를 시도해봤다. 근데 그래도 안된다. 그래서 이것저것 실험을 해봤다.

결론적으로는 FileDialog를 여는데까지는 딱히 별 상관없다. 파일선택하고 확인누른 이후에 Assimp의 Importer가 fbx파일을 read하지 못하고 계속 null을 리턴했다. fbx파일자체에 변경이 발생하는것도 아니고, 확인 버튼 누르기 직전까지 추출을 실행하면 잘 실행된다. 확인버튼 누르면 기다렸다는듯이 null을 리턴한다. 

도저히 문제점을 찾지 못했고, 연관성이 너무 없어서 원인이 정확히 뭔지 규명하려고 하지는 않았다. 

 

그래서 해결방안을 2가지를 생각했다.

 

1. FileDialog대신 다른방법으로 File을 선택해서 경로를 가져오게한다. 

대신 이러면 ImGui로 직접 FileDialog 비스무리하게 만들어야하는데 너무 의미없는짓에 노력을 들이는거같아 별로다.

아마 ImGui를 아시는 분이라면 ImGuiFileDialog를 왜 안쓰냐? 하실수도 있다.

일단 FileDialog를 띄우기 위한 Open...이라는 버튼을 따로 만들었는데 이걸 ImGuiPopup 안에서 렌더시킨다.

이것도 원인은 정확히 모르겠는데, 여기서 ImGuiFileDialog가 렌더가 안됐다. ImGuiPopup말고 다른곳에서 렌더시키면 잘만 되기도하고, 이미 잘 적용하고있는곳도 있었는데... 그래서 그냥 어차피 winapi의 FileDialog를 가져다 쓰고싶기도 해서 몇시간정도 이것저것 시도하다 때려치고 위에 작성한대로의 과정을 거쳤다. 이미 Popup창 안에서 ImGuiFileDialog가 렌더가 안되서 답답했었는데 winapi FileDialog는 이것대로 안되니 짜증났다고 했던거다.

차라리 FileDialog를 ImGui로 직접 그럴듯하게 만드는것도 가능은 하긴하다. 특정 폴더내의 파일목록들 불러오기만 하면 그냥 나머지는 구현하는수준이니까. 근데 나머지 해야할것들도 많은데 굳이 이거 그럴듯하게 이쁘게 구현하려면 이것대로 시간 많이들어서 의미없다고 했다. 물론 지금기준으로 그런거지.. 다른 사람들 다렉포폴에서 이쁘게 구현한거보면 나중에 바꿔보고싶긴하다.

 

2. 다른 winapi로 FileDialog를 연다.

사실 위에서 사용한 winapi는 좀 더 옛날에 쓰던 api이고, MSDN에 보면 저 API보다는 IFileDialog라는 api를 사용하라고 권장하고있다. 

링크 : https://docs.microsoft.com/en-us/windows/win32/api/commdlg/nf-commdlg-getopenfilenamea

 

GetOpenFileNameA function (commdlg.h) - Win32 apps

Creates an Open dialog box that lets the user specify the drive, directory, and the name of a file or set of files to be opened.

docs.microsoft.com

대충 보면 비스타부터는 IFileDialog라는 api를 사용하는걸 더 권장한다..는 그런 내용이다. 그래서 그렇게 했다.

사용법은 따로 글을 작성햇다. 거의 복붙만 하면 되는수준이긴 하다.

어쨋든 다행히 IFileDialog로 오픈한 FileDialog는 확인버튼 눌러도 Importer가 Read를 정상적으로 잘 했다.

이거 안되면 솔직히 1번방법으로 하든가 아니면 직접 마우스이벤트로 선택하는게 아닌 그냥 폴더내의 파일목록 불러와서 assets창에 렌더시켰을것같다. 어쨋든 FileDialog 이용해서 하려는건 그냥 내가 그러고싶어서 그런거니까..

 

각 api 써먹는법은 아래 링크에 작성해놨다. 어려울건 없어보인다.

https://maxlevel-trace.tistory.com/31