欲取得特定副檔名(如 .cpp、.txt)關聯的系統圖示。傳統做法需遞迴解析註冊表:
HKCR\.cpp → 預設值 cppfileHKCR\cppfile\DefaultIcon → 圖示路徑與資源 IDCLSID、IExtractIcon 介面……極其繁瑣一行 API 解決所有關聯、COM、殼擴展複雜度:
SHFILEINFO sfi = { 0 };
SHGetFileInfo(L"foo.bmp", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi),
SHGFI_ICON | SHGFI_USEFILEATTRIBUTES);
SHGFI_USEFILEATTRIBUTES:允許傳入不存在的假檔名,僅依副檔名查詢關聯圖示SHGFI_ICON:回傳圖示句柄於 sfi.hIconSHGFI_LARGEICON / SHGFI_SMALLICON:指定尺寸SHGFI_SYSICONINDEX:取得系統映像清單索引,配合 CImageList 高效顯示大量圖示void CMyDlg::OnEnChangeEditExt() {
CString ext; m_editExt.GetWindowText(ext);
if (ext.IsEmpty()) return;
CString fname = L"dummy." + ext;
SHFILEINFO sfi = { 0 };
SHGetFileInfo(fname, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi),
SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_LARGEICON);
if (sfi.hIcon) {
m_staticIcon.SetIcon(sfi.hIcon); // CStatic 圖示控制項
// 注意:sfi.hIcon 為系統共享,不可 DestroyIcon
}
}