mfc_Drag_Drop_2 - 8BitsCoding/RobotMentor GitHub Wiki
void CMFCApplication1Dlg::OnDropFiles(HDROP hDropInfo)
{
m_drop_list.ResetContent();
int count = DragQueryFile(hDropInfo, 0xFFFFFFFF/*-1*/, NULL, 0);
wchar_t temp_path[MAX_PATH];
for (int i = 0; i < count; i++) {
DragQueryFile(hDropInfo, i, temp_path, MAX_PATH);
m_drop_list.InsertString(i, temp_path);
/*
if (GetFileAttributes(temp_path) & FILE_ATTRIBUTE_DIRECTORY) {
// 디렉토리라면 1
m_drop_list.SetItemData(i, 1);
}
else {
// 파일이라면 0
m_drop_list.SetItemData(i, 0);
}
*/
// 소스간단화
m_drop_list.SetItemData(i, (GetFileAttributes(temp_path) & FILE_ATTRIBUTE_DIRECTORY) >> 4);
}
MakeFileList();
CDialogEx::OnDropFiles(hDropInfo);
}
void CMFCApplication1Dlg::MakeFileList()
{
int is_continue, count, i;
wchar_t temp_path[MAX_PATH];
do {
is_continue = 0;
count = m_drop_list.GetCount();
for (i = 0; i < count; i++) {
if (m_drop_list.GetItemData(i) == 1) {
// 디렉터리 발견
m_drop_list.SetItemData(i, 2);
m_drop_list.GetText(i, temp_path);
GetFileInDirectory(temp_path, i + 1);
is_continue = 1;
break;
}
}
} while (is_continue);
}
void CMFCApplication1Dlg::GetFileInDirectory(wchar_t * ap_path, int a_insert_index)
{
CString path, file_path;
WIN32_FIND_DATA file_data;
path.Format(L"%s\\*.*", ap_path);
HANDLE h_item_list = FindFirstFile(path, &file_data);
if (INVALID_HANDLE_VALUE != h_item_list) {
do {
// ".", ".." 모두 출력됨
// 배제하는 코드 추가
if (memcmp(file_data.cFileName, L".", 4) && memcmp(file_data.cFileName, L"..", 6)) {
// . : 유니코드이고 NULL 문자를 포함하기에 4바이트
file_path.Format(L"%s\\%s", ap_path, file_data.cFileName);
m_drop_list.InsertString(a_insert_index, file_path);
m_drop_list.SetItemData(a_insert_index, (file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) >> 4);
}
} while (FindNextFile(h_item_list, &file_data));
}
}