SHGetFileInfo可用于提取应用程序的图标。
以下的按钮响应函数用于提取QQ游戏的应用程序图标并在MFC对话框的客户区显示:
- void CExtractAppIconDlg::OnBnClickedButton1()
- {
- // TODO: Add your control notification handler code here
- SHFILEINFO shfi;
- memset(&shfi, 0, sizeof(shfi));
- SHGetFileInfo(TEXT("D:\\Application\\腾讯游戏\\QQGame\\QQGame.exe"),
- 0, &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_LARGEICON);
- DrawIcon(::GetDC(this->GetSafeHwnd()), 0, 0, shfi.hIcon);
- DestroyIcon(shfi.hIcon);
- }
注意:在通过SHGetFileInfo提取完ICON后,在不需要该ICON的时候要调用DestroyIcon释放资源。
以上通过指定SHGetFileInfo函数的最后一个参数为SHGFI_ICON | SHGFI_LARGEICON,加载的是32x32的大图标,若要加载小图标,则指定最后一个参数为SHGFI_ICON | SHGFI_SMALLICON即可。
但是,若加载的是16x16的小图标,直接用DrawIcon函数会有问题,因为该函数绘制ICON时默认为32x32,对于ICON为16x16的小图标状况,该函数会将其拉伸到32x32绘制。
贴图如下,很显然,拉伸之后的效果很模糊。
- void CExtractAppIconDlg::OnBnClickedButton1()
- {
- // TODO: Add your control notification handler code here
- SHFILEINFO shfi;
- memset(&shfi, 0, sizeof(shfi));
- SHGetFileInfo(TEXT("D:\\Application\\腾讯游戏\\QQGame\\QQGame.exe"),
- 0, &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_SMALLICON);
- DrawIcon(::GetDC(this->GetSafeHwnd()), 0, 0, shfi.hIcon);
- DestroyIcon(shfi.hIcon);
- }
要解决这个问题,使对于16x16的小图标按照其实际大小绘制,只需如下调用DrawIconEx即可:
- void CExtractAppIconDlg::OnBnClickedButton1()
- {
- // TODO: Add your control notification handler code here
- SHFILEINFO shfi;
- memset(&shfi, 0, sizeof(shfi));
- SHGetFileInfo(TEXT("D:\\Application\\腾讯游戏\\QQGame\\QQGame.exe"),
- 0, &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_SMALLICON);
- //DrawIcon(::GetDC(this->GetSafeHwnd()), 0, 0, shfi.hIcon);
- DrawIconEx(::GetDC(this->GetSafeHwnd()),
- 0, 0, shfi.hIcon, 0, 0, 0, NULL, DI_NORMAL | DI_COMPAT);
- DestroyIcon(shfi.hIcon);
- }