提取QQ游戏图标并显示

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);
}
提取QQ游戏图标并显示_第1张图片

注意:在通过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);
}
提取QQ游戏图标并显示_第2张图片

要解决这个问题,使对于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);
}

提取QQ游戏图标并显示_第3张图片





你可能感兴趣的:(游戏,qq,腾讯,null,application,mfc)