본문 바로가기

Library/Windows Programming

WTL::CString 문제 : WTL::CFileDialog Filter

WTL의 CFileDialog의 필터(filter) 관련 기능은 한 가지 문제가 있다. 필터란 다들 알다시피 파일 관련 대화상자를 열었을 때, 화면에 표시할 파일의 확장자를 선택하여 그것만 보여주는 기능이다. 보통 MFC에서는 CString 형식으로, 구분자로 '|' 표시를 사용하여 정의하고 이 CString을 필터로 그냥 넘겨주면 잘 동작한다. 그러나, WTL의 CFileDialog는 WTL::CString을 사용하여 같은 방법으로 코드를 작성하면, 원하는 결과를 얻지 못한다.

이것은 WTL의 CFileDialog가 MFC와 달리 API를 래핑하는 정도로 작성되어 있기 때문이고, 또 템플릿을 사용한 코드다보니 기능 구현에 어느 정도 제약이 있기 때문이다. 즉, WTL에서는 MFC의 CString '|' 구분자 대신, API와 마찬가지로 '\0'을 사용하여 각 항목을 구분해줘야 하지만, 그렇게 작성했다고 하더라도 필터는 제대로 동작하지 않는다. 즉, WTL::CFileDialog에서 필터를 제대로 사용하려면, 단일 항목이 아닌 이상 WTL::CString을 사용하여 필터를 작성해서는 안된다. 그냥, 전통적인 문자열 배열로, 그리고 널 문자를 구분자로 사용하여 필터를 작성하고 CFileDilaog에 넘겨주어야 제대로 작동할 것이다.

WTL의 컨트롤들은 대개 크기와 성능면에서 만족할만하지만, WTL::CString은 약간 기능이 부족함을 느낀다. 대표적으로, Format 메서드의 경우 C++ 템플릿 지원의 표준 미비로 부동소수점을 사용할 수 없으며, 따라서 Format 메서드를 사용한 문자열 작성에 부동소수점 형식인 %f를 사용할 수 없다. ATL::CString은 자체적으로 이런 문제를 해결하고 있기 때문에 아무래도 아쉬움이 느껴지는 부분이다. WTL 클래스들이 가벼운 WTL::CString을 사용하고 있긴하지만, 문자열 클래스만의 기능을 본다면 아무래도 ATL::CString이 훨씬 낫다. (Tokenize와 같은 기능은 대단히 유용하다) 일반적인 경우에는 WTL::CString을 사용하다가, 이와 같은 기능이 필요하다면 ATL::CString을 사용하는 것도 괜찮은 방법이다. ATL::CString을 사용하기 위해서는 atlstr.h를 포함시키고, 모호성을 제거하기 위해 각 CString의 이름공간을 명시적으로 작성해주어야 한다.