이번 글에서는 대화상자에 파일을 Drag & Drop 하는 방법을 알아보겠습니다.
대화상자 생성 후, 아래와 같이 대화상자 속성->동작->Accept Files를 TRUE로 변경합니다.
그리고 아래와 같이 OnDropFiles를 추가해줍니다.
OnDropFiles에 아래와 같이 코딩합니다.
void CMFCApplication1Dlg::OnDropFiles( HDROP hDropInfo )
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
CString sFileList(_T("")); // 파일 리스트 표시
TCHAR szFileName[MAX_PATH] = {0, }; // 파일 명 반환할 변수
int iCount = ::DragQueryFile( hDropInfo, 0xFFFFFFFF, szFileName, sizeof(szFileName) );
// ::DragQueryFile( 핸들, 0xFFFFFFFF로 하면 드롭된 갯수 가져옴 , 파일명 반환, 버퍼 크기 );
for ( int iIndex = 0 ; iIndex < iCount ; iIndex++ )
{
memset( szFileName, 0, sizeof(szFileName) );
::DragQueryFile( hDropInfo, iIndex, szFileName, sizeof(szFileName) );
CString sFileName;
sFileName.Format( _T("%s"), szFileName );
sFileList += sFileName + _T("\n");
}
AfxMessageBox( sFileList );
::DragFinish( hDropInfo );
CDialogEx::OnDropFiles( hDropInfo );
}
실행 시켜서 Drag & Drop을 확인해 봅니다.
——————————————————————————
Windows 10에서 MFC의 Drag & Drop이 안되는 경우가 있습니다.(관련 링크)
그럴 경우 OnInitDialog에 아래와 같이 추가하시면 됩니다.
ChangeWindowMessageFilterEx( m_hWnd, WM_DROPFILES, MSGFLT_ALLOW, NULL );
ChangeWindowMessageFilterEx( m_hWnd, 0x0049/*WM_COPYGLOBALDATA*/, MSGFLT_ALLOW, NULL );
p.s 그래도 안되면 아래와 같이 권한 상승 후 코딩해줍니다.
DragAcceptFiles(true);
ChangeWindowMessageFilterEx( m_hWnd, WM_DROPFILES, MSGFLT_ALLOW, NULL );
ChangeWindowMessageFilterEx( m_hWnd, WM_COPYDATA, MSGFLT_ALLOW, NULL );
ChangeWindowMessageFilterEx( m_hWnd, 0x0049/*WM_COPYGLOBALDATA*/, MSGFLT_ALLOW, NULL );