提取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);
}

注意:在通过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);
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值