예전에 자주 사용했었던 CFileDialog 클래스를 오랫만에 사용해보려고 하다보니깐, 기억이 안나더라.

 

그래서 이리 저리 찾아보다가 친절히 설명 해놓으신 블로거님의 블로깅 자료를 발견하고 공유하고자 살짝 가져왔다.

 

당연히 참조 경로는 하단부에 첨부했다.

 

 

****************** CFileDialog 정의
CFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWITEPROMPT, OPCTSTR lpszFilter = NULL, CWnd *pParentWnd = NULL)

bOpenFileDialog        TRUE--> 열기        FALSE--> 다른 이름으로 저장
lpszDefExt                기본 확장자. 만약 cpp라고 적으면 파일명이 자동으로 test.cpp가 됨
lpszFileName            대화상자가 처음 출력되었을 때 "파일 이름" Edit 컨트롤에 출력될 파일명 지정
dwFlags                   속성
     - OFN_EXPLOPER     윈도우 탐색기 스타일로 출력
     - OFN_ARROWMULTISELECT       파일을 한번에 여러개 선택 가능
     - OFN_CREATEPROMPT         존재하지 않는 파일명을 입력했을 경우 새로 생성하겠냐는 메시지 박스 출력
     - OFN_FILEMUSTEXIST     존재하지 않는 파일명을 입력할 수 없도록 함
     - OFN_HIDEREADONLY      읽기 전용 파일은 출력하지 않음
     - OFN_LONGNAMES          긴 파일 이름 포맷 지원
     - OFN_OVERWRITEPROMPT  존재하는 파일명을 입력했을 경우 덮어쓰겠냐는 메시지 박스 출력
     - OFN_PATHMUSTEXIST      이미 존재하는 디렉터리명만을 입력
lpszFilter                   대화상자에 출력될 파일들을 확장자에 의해서 걸러지도록 하기 위한 필터 지정
pParentWnd               대화상자의 부모 윈도우 지정



****************** CFileDialog 클래스의 멤버 함수
CString GetPathName       선택된 파일의 절대 경로
CString GetFileName        선택된 파일의 이름과 확장자
CString GetFileExt            선택된 파일의 확장자
CString GetFileTitle           선택된 파일의 파일명
BOOL GetReadOnlyPref     읽기 전용 여부

POSITION GetStartPosition           다중 선택의 경우
CString GetNextPathName



******************CFileDialog 클래스의 인스턴스를 선언하고 DoModal 함수 호출

** 한개의 파일만 선택할 경우
char szFilter[] = "Image (*.BMP, *.GIF, *.JPG) | *.BMP;*.GIF;*.JPG | All Files(*.*)|*.*||";
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter);
if(IDOK == dlg.DoModal())
{
        CString strPathName = dlg.GetPathName();
}


** 여러개의 파일을 복수 선택할 경우

char szFilter[] = "All Files(*.*) | *.* ||";
CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, szFiilter);

if(IDOK == dlg.DoModal())
      for(POSITION pos=dlg.GetStartPosition(); pos != NULL;)
               m_ctrlListBox.AddString(dlg.GetNextPathName(pos));

 

 

 

 

참조 : http://egloos.zum.com/gomu0/v/2865574

 

2015/06/10 - [[ Topics ]/Visual Studio] - 파일 입출력에서 폴더창 열기

 

2014/05/01 - [[ Topics ]/Visual Studio] - CString 에서 경로, 파일명, 확장자를 구분하여 출력하는법

 

2015/06/10 - [[ Topics ]/Visual Studio] - Cstring 에서 char* 형으로 변환

 

2014/10/31 - [[ Topics ]/Visual Studio] - CString to int, int to CString 변환법

 

 

Posted by Tommy™
,

이번에는 CString 형에서 char*형으로 변환하는 방법을 알아보자. 고 생각했는데,

 

다른 블로거께서 딱히 설명 할 필요 없을정도로 아주 자세히 설명해놓으셔서 따로 부가적인 코멘트가 없어도 될듯하다.

 

 

1. 일반 문자열의 형변환 

CString strImagePath = "Normal Method";

char *szLoadImagePath = new char[strImagePath.GetLength() + 1];


sprintf(szLoadImagePath, "%s", strImagePath.GetBuffer());

...

delete []szLoadImagePath;

 

 

2. 경로를 입력해주는 경우의 형변환

CString strImagePath = "C:\\ProgramFiles\\Image\\image.bmp";

char *szLoadImagePath = new char[strImagePath.GetLength() + 1];


sprintf(szLoadImagePath, "%s", strImagePath.GetBuffer());

...

delete []szLoadImagePath;

 

 

3.  함수로부터 경로를 넘겨받는 경우의 형변환

CString strImagePath = m_img.GetImagePath();

strImagePath += "image.bmp";

char szLoadImagePath[256];

wcstombs(szLoadImagePath, (LPCTSTR)strImagePath, 256);

 

일반적인 CString 문자열을 char* 형으로 형변환하고자 한다면 1번 방법을 사용하시면 됩니다. 개발자 코드에서

경로를 직접 입력해줄 경우에는 2번 방법을 사용하시면 됩니다. 하지만, 별도의 함수로부터 경로를 넘겨받을 경우에는

\를 Escape Sequence로 인식하기 때문에 경로를 올바르게 인식하지 않습니다. 그렇다고 일일이 \을 \\으로 변경할 수도

없으므로 3번 방법을 사용하시면 됩니다. wcstombs 함수는 UNICODE 문자열(WCS, Wide Character Set)을 ASCII 문자열(MBCS,

Multy Byte Character Set)로 변환시켜주는 함수 입니다. 이렇게 하면 \을 Escape Sequence로 인식하는 문제를 피할 수 있습니다.

 하지만 3번 방법도 경로에 한글이 포함되어 있을 경우 올바르게 인식하지 않습니다. 비로소 4번 방법을 사용하였을 경우 1,2,3번 

방법에서 나타났던 문제를 모두 해결할 수 있습니다. 



4. 경로에 한글이 포함되어 있을 경우의 형변환

CString strImagePAth = m_img.GetImagePath();

strImagePath += "image.bmp";

char szLoadImagePath[256];


WideCharToMultiByte(CP_ACP, 0, strImagePath.GetBuffer(), -1, szLoadImagePath, 256, NULL, NULL);

 

 

참고로 저같은 경우에는 한글 Windows 8.1 OS를 사용 중인데, 경로중에 한글이 들어가게 되어있다. 그래서 4번을 활용하여 경로찾는 문제를 해결 할 수 있었다.

 

 

 

참고 : http://jsgreatnom.tistory.com/65

 

2014/10/31 - [[ Topics ]/Visual Studio] - CString to int, int to CString 변환법

 

2014/05/01 - [[ Topics ]/Visual Studio] - CString 에서 경로, 파일명, 확장자를 구분하여 출력하는법

 

2014/04/08 - [[ Topics ]/C/C++] - 문자타입간의 데이터 복사방법(wchar_t, char*, LPCTSTR)

 

 

Posted by Tommy™
,

파일 입출력에 있어서 해당 이벤트가 끝나고 파일이 존재하는 폴더창을 여는 방법이 궁금해졌다.

 

그래서 찾아 본 결과,

 

어떤 블로거분께서 아주 친절히 설명해놓으셨다.

 

바로 ShellExecute 함수를 사용해서 하는 방법이었는데, 매우 유용할듯하다.

 

아래는 블로거분이 작성해놓은걸 살짝 긁어 온 글이다.

 

 

 

 

ShellExecute 는 윈도우의 '실행' 창에서 내리는 명령과 비슷한 작업을 한다.

 

 

 ShellExecute(NULL, _T("open"), sPath, NULL, NULL, SW_SHOW);

 

폴더가 열림

sPath 에는 폴더 경로가 들어감

 

 

 ShellExecute(NULL, _T("open"), _T("explorer"), _T("/select,") + sFilePath, NULL, SW_SHOW);

 

폴더가 열리고, 파일이 선택됨

sFilePath 에는 파일 경로가 들어감

 

 

 

 

참고 : http://purelab.net/zbxe/?mid=guruin&listStyle=gallery&document_srl=86579

 

Posted by Tommy™
,

때에 따라서는 Dialog 창을 갑자기 종료시켜야하는 경우가 발생한다.

 

이러한 경우 여러 해결방법이 있겠지만, 그중에서 직접 찾아보고 시도해봤던, 그리고 추천하는 방법을 작성해본다.

 

OnClose()

-> 정말 프로세스 도중에 창을 닫아버린다. 따라서 메모리릭 발생

 

Exit(0)

-> 피차일반, 비정상적인 종료라면서 마찬가지로 오류 또는 메모리릭 발생

 

::PostQuitMessage(WM_QUIT)

-> 아래와 같은 경고창이 발생한다. 이말인 즉슨, 안전한 종료방법은 아니라는듯하다.

"경고: 대화 상자를 만들지 못했으므로 응용 프로그램이 예기치 않게 종료됩니다.
경고: 대화 상자에서 MFC 컨트롤을 사용하는 경우 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS를 수행할 수 없습니다."

 

::SendMessage(this->m_hWnd, WM_CLOSE, NULL, NULL) 혹은 ::SendMessage(GetSafeHwnd(), WM_CLOSE, NULL, NULL)

-> 메모리릭이 발생하지 않는다. 그리고 아무런 경고 엾이 정상적으로 종료가 된다.

 

참고 : http://egloos.zum.com/CharlesM/v/1279955

 

Posted by Tommy™
,

PreTranslateMessage() 함수 생성

 

     if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
          return TRUE;

 

추가하면 완료.

 

말그대로, 이벤트를 먼저 처리하는 구문이 바로 PreTranslateMessage() 함수인데, 여기서 키 입력 파라미터인 wParam 에서 VK_RETURN (엔터키) 와 VK_ESCAPE (Esc키)가 눌러졌을때, 걍 True로 리턴하라는 뜻. 

 

참고사이트: http://lafirr.tistory.com/20

Posted by Tommy™
,