準備工作
- 添加 OpenCV 頭文件、
CvvImage.h/.cpp(OpenCV 1.x 遺留類,用於 Picture 控件繪圖)、dirent.h(目錄遍歷)。
- 在對話框類中添加成員變量:
CString m_Path(選中路徑),
char* m_ImageDir、DIR* m_pDir、struct dirent* m_pEnt(目錄遍歷上下文)。
「圖像文件夾」按鈕響應代碼
void CGenderRecognitionMFCDlg::OnBnClickedButtonImagefile() {
// 1. 彈出文件夾選擇對話框
BROWSEINFO bi = {0};
TCHAR path[MAX_PATH];
bi.hwndOwner = GetSafeHwnd();
bi.pszDisplayName = path;
bi.lpszTitle = _T("Select folder");
bi.ulFlags = 0x80; // 新風格
LPITEMIDLIST idl = SHBrowseForFolder(&bi);
if (!idl) return;
SHGetPathFromIDList(idl, m_Path.GetBuffer(MAX_PATH));
m_Path.ReleaseBuffer();
if (m_Path.Right(1) != "\\") m_Path += "\\";
UpdateData(FALSE);
// 2. 釋放 IDL 內存
IMalloc* imalloc = nullptr;
if (SUCCEEDED(SHGetMalloc(&imalloc))) {
imalloc->Free(idl);
imalloc->Release();
}
// 3. 打開目錄並跳過 "." 和 ".."
m_ImageDir = (LPSTR)(LPCTSTR)m_Path;
m_pDir = opendir(m_ImageDir);
for (int i=0; i<2; ++i) m_pEnt = readdir(m_pDir); // 跳過 . 和 ..
}
關鍵點說明
SHBrowseForFolder 返回項目 ID 列表,需用 SHGetPathFromIDList 轉為路徑字符串。
opendir/readdir 來自 dirent.h,是 POSIX 接口的 Windows 移植版,方便跨平台。
- 成員變量
m_pDir、m_pEnt 保存遍歷狀態,供下一步「下一張」使用。