티스토리 뷰

◈ 실행 화면
 
 
 
 

개발 환경

 

1. OS 환경   : WindowXP

2. 사용 언어 : VC++ 6.0

3. 개발에 필요한 환경

   1) Dialog Properties -> Extended Styles 탭에서 Accept files 항목을 선택합니다.

 
 
2) MFC ClassWizard -> Class Info 탭에 Advanced options 항목에서 Message filter: Window

     선택합니다.

  

 

   3) MFC ClassWizard -> Message Maps 탭에 Messages : 에서 WM_DROPFILES를 선택합니다.

 
 

◈ 프로그램 설명 

 

 1. 기존의 기능 설명

   1) AcceptFile 을 이용하여 드래그 앤 드랍을 통하여 파일 또는 폴더의 경로명을 얻어 리스트에

     추가하는 기능입니다.

 

  2. Step2에서 추가된 기능설명

     1) 드래그 앤 드랍만 한 파일 및 폴더의 경로뿐만 아니라, 폴더안에 있는 존재하는 하위폴더의

        파일들까지 경로명을 얻어 리스트에 추가하는 기능을 구현했습니다.

     2) 다른 프로그램을 선택해도 UseAcceptFile의 실행화면이 사라지지 않게 최상위 윈도우로

        설정하였습니다.

 
 

◈ 중요 소스 설명

 

CDialog에서 계승받은 UseAcceptFileDlg클래스에 GetFilesFromDirectory()함수에서 파일 및 폴더의

경로뿐만 아니라, 폴더안에 있는 존재하는 하위폴더의 파일들까지 경로명을 얻기 위한 코드입니다.

 
    void CUseAcceptFileDlg::GetFilesFromDirectory(const char *parm_path)
    {
        CString path, file_path;
        WIN32_FIND_DATA file_data;
           
        path.Format("%s\\*.*", parm_path);
           
        // 지정된 경로에 존재하는 모든 파일에 대한 목록을 구성하고 해당 정보의 핸들값을 얻는다.
        // 만약 해당 경로에 파일이나 자식 폴더가 존재하지 않는다면 INVALID_HANDLE_VALUE 값을
        // 반환한다. 그리고 이 함수가 성공적으로 목록을 구성한 경우에는 file_data 변수에
        // 구성된 목록중에서 첫번째 존재하는 파일의 정보를 넣어준다.
        HANDLE search_handle = FindFirstFile(path, &file_data);
        if(INVALID_HANDLE_VALUE != search_handle){
            // 파일 목록을 성공적으로 구성한 경우..
            do {
                if(FILE_ATTRIBUTE_DIRECTORY & file_data.dwFileAttributes){
                    // "." 이나 ".."은 무시한다.
                    if(file_data.cFileName[0] != '.'){
                        // 현재 정보가 폴더인 경우, file_data.cFileName에 폴더이름이 들어있다.
                        file_path.Format("%s\\%s", parm_path, file_data.cFileName);
                        GetFilesFromDirectory(file_path);
                    }
                } else {
                    // 현재 정보가 파일인 경우, file_data.cFileName에 파일이름이 들어있다.
                    file_path.Format("%s\\%s", parm_path, file_data.cFileName);
                    m_drop_path_list.AddString(file_path);
                }
               
                // 구성된 목록에서 다음 파일의 정보를 file_data에 복사하여 가져온다.
                // 더이상의 정보가 없다면 FindNextFile 함수는 0을 반환한다.
            } while(FindNextFile(search_handle, &file_data));
           
            // 구성된 파일 목록을 삭제한다.
            FindClose(search_handle);
        }
    }
 
 

Continue...(추가적으로 코드가 필요하신 경우에는 소스를 다운받아 참조하세요.)

 

 

◈ 참고 사항

 

 MFC ClassWizard Message Maps 탭에서 Messages에는WM_DROPFILES가 등록되어 있으나,

 다이얼로그의 Dialog Properties Extended Styles 탭에서 Accept files 항목을 선택하지 않으면

 메시지가 발생하지 않습니다.

 

최상위 윈도우로 만들려면, Dialog PropertiesMore Styles탭에서 System modal를 선택하시면

됩니다.


'Study > Language >' 카테고리의 다른 글

Export Gridview to Excel in C#  (0) 2009.10.19
Dev C++ 인스톨파일  (0) 2009.10.18
OnDropFiles()  (0) 2009.09.16
MFC 다이얼로그기반 종료방지코드  (0) 2009.09.14
Acceptfile을 이용한 드래그& 드랍 예제 Step-1  (0) 2009.09.10
댓글