您的位置:首页 > 移动开发

提取QQ游戏图标并显示

2012-09-09 21:38 246 查看
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);
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息