提取QQ游戏图标并显示

时间:2024-02-21 12:34:25

SHGetFileInfo可用于提取应用程序的图标。

以下的按钮响应函数用于提取QQ游戏的应用程序图标并在MFC对话框的客户区显示:

 

  1. void CExtractAppIconDlg::OnBnClickedButton1()  
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     SHFILEINFO shfi;  
  5.     memset(&shfi, 0, sizeof(shfi));  
  6.     SHGetFileInfo(TEXT("D:\\Application\\腾讯游戏\\QQGame\\QQGame.exe"),   
  7.         0, &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_LARGEICON);  
  8.     DrawIcon(::GetDC(this->GetSafeHwnd()), 0, 0, shfi.hIcon);  
  9.     DestroyIcon(shfi.hIcon);  
  10. }  

注意:在通过SHGetFileInfo提取完ICON后,在不需要该ICON的时候要调用DestroyIcon释放资源。

以上通过指定SHGetFileInfo函数的最后一个参数为SHGFI_ICON | SHGFI_LARGEICON,加载的是32x32的大图标,若要加载小图标,则指定最后一个参数为SHGFI_ICON | SHGFI_SMALLICON即可。

但是,若加载的是16x16的小图标,直接用DrawIcon函数会有问题,因为该函数绘制ICON时默认为32x32,对于ICON为16x16的小图标状况,该函数会将其拉伸到32x32绘制。

贴图如下,很显然,拉伸之后的效果很模糊。

 

  1. void CExtractAppIconDlg::OnBnClickedButton1()  
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     SHFILEINFO shfi;  
  5.     memset(&shfi, 0, sizeof(shfi));  
  6.     SHGetFileInfo(TEXT("D:\\Application\\腾讯游戏\\QQGame\\QQGame.exe"),   
  7.         0, &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_SMALLICON);  
  8.     DrawIcon(::GetDC(this->GetSafeHwnd()), 0, 0, shfi.hIcon);  
  9.     DestroyIcon(shfi.hIcon);  
  10. }  

要解决这个问题,使对于16x16的小图标按照其实际大小绘制,只需如下调用DrawIconEx即可:

  1. void CExtractAppIconDlg::OnBnClickedButton1()  
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     SHFILEINFO shfi;  
  5.     memset(&shfi, 0, sizeof(shfi));  
  6.     SHGetFileInfo(TEXT("D:\\Application\\腾讯游戏\\QQGame\\QQGame.exe"),   
  7.         0, &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_SMALLICON);  
  8.     //DrawIcon(::GetDC(this->GetSafeHwnd()), 0, 0, shfi.hIcon);  
  9.     DrawIconEx(::GetDC(this->GetSafeHwnd()),   
  10.         0, 0, shfi.hIcon, 0, 0, 0, NULL, DI_NORMAL | DI_COMPAT);   
  11.     DestroyIcon(shfi.hIcon);  
  12. }