QQ登录

只需一步,快速开始

138上位机VC MFC指定程序图标的提取与保存

[ 复制链接 ]

138上位机VC MFC指定程序图标的提取与保存

138上位机VC MFC指定程序图标的提取与保存

138上位机VC MFC指定程序图标的提取与保存


功能展示

有时候看中别人的程序图标,想占为自用,我们就得提取出图标,我们当前例程实现指定程序图标的提取,进取的结果会显示出来,点击保存,可保存已经提取的图标,效果如图;
要点提示
程序图标的提取我们可以用微软提供的函数ExtractIcon()函数原型可以查阅MSDN,我们当前例程使用的形式为HICON hicon =::ExtractIcon(AfxGetInstanceHandle(),sPath,0); sPath为要提取的程序的带路径的程序名称
图标的保存 需要依次保存图标的头文件,资源索引及图标数据三个部份





实现功能
1.新建基于对话框的应用程序
2.拖拽些控件,用于提取图标的操作:1.提取图标按钮ID改为IDC_BUTTON1;2.保存图标的按钮,ID改为IDC_BUTTON2,3.显示已提取图标的图片控件,ID改为IDC_ICONSHOW。4.显示要提取程序的绝对路径,ID改为IDC_PATH;

3.自定义些结构体,用于保存图标的各个组成部分信息
  1. #pragma pack( push )
  2. #pragma pack( 2 )
  3. typedef struct
  4. {
  5.         BYTE        bWidth;               
  6.         BYTE        bHeight;      
  7.         BYTE        bColorCount;  
  8.         BYTE        bReserved;   
  9.         WORD        wPlanes;      
  10.         WORD        wBitCount;   
  11.         DWORD        dwBytesInRes;
  12.         WORD        nID;         
  13. } MEMICONDIRENTRY, *LPMEMICONDIRENTRY;

  14. typedef struct
  15. {
  16.         WORD                        idReserved;   
  17.         WORD                        idType;      
  18.         WORD                        idCount;      
  19.         MEMICONDIRENTRY        idEntries[1];
  20. } MEMICONDIR, *LPMEMICONDIR;
复制代码
  1. #pragma pack( pop)
  2. typedef struct//定义图像数据
  3. {
  4.         LPBITMAPINFO   icheader;  // 位图信息头
  5.         RGBQUAD         iccolors; //色彩表,同位图的色彩表。
  6.         LPBYTE                        lpXOR;   
  7.         LPBYTE                        lpAND;   // AND掩码
  8. } iconimage, *lpiconimage;

  9. typedef struct//定义图标资源索引目录
  10. {
  11.         byte        bwidth;          // 图像宽度,以像素为单位
  12.         byte        bheight;         // 图像高度,以像素为单位
  13.         byte        bcolorcount;     //图像中的颜色数,如果是大于8的位图,此值为零
  14.         byte        breserved;       //保留,必须为零
  15.         WORD        wplanes;         //位面数,一般为1
  16.         WORD        wbitcount;       //每像素所占位数
  17.         DWORD       dwbytesinres;    // 资源的字节数
  18.         DWORD       dwimageoffset;   //图像数据距离资源开始处偏移位置
  19. } icondirentry, *lpicondirentry;

  20. typedef struct//定义图标文件头
  21. {
  22. WORD           idreserved;   // 保留,必须为零
  23. WORD           idtype;       // 资源类型,1是图标,2是光标
  24. WORD          idcount;       // 图像个数
  25. icondirentry   identries[1]; // 每个图像的入口定义
  26. } icondir, *lpicondir;
复制代码
4.添加自定义函数GetImageOffset (),用于获取图标的数据

我们来演示下功能实现的整个过程
  1. #pragma pack( pop)
  2. typedef struct//定义图像数据
  3. {
  4.         LPBITMAPINFO   icheader;  // 位图信息头
  5.         RGBQUAD         iccolors; //色彩表,同位图的色彩表。
  6.         LPBYTE                        lpXOR;   
  7.         LPBYTE                        lpAND;   // AND掩码
  8. } iconimage, *lpiconimage;

  9. typedef struct//定义图标资源索引目录
  10. {
  11.         byte        bwidth;          // 图像宽度,以像素为单位
  12.         byte        bheight;         // 图像高度,以像素为单位
  13.         byte        bcolorcount;     //图像中的颜色数,如果是大于8的位图,此值为零
  14.         byte        breserved;       //保留,必须为零
  15.         WORD        wplanes;         //位面数,一般为1
  16.         WORD        wbitcount;       //每像素所占位数
  17.         DWORD       dwbytesinres;    // 资源的字节数
  18.         DWORD       dwimageoffset;   //图像数据距离资源开始处偏移位置
  19. } icondirentry, *lpicondirentry;

  20. typedef struct//定义图标文件头
  21. {
  22. WORD           idreserved;   // 保留,必须为零
  23. WORD           idtype;       // 资源类型,1是图标,2是光标
  24. WORD          idcount;       // 图像个数
  25. icondirentry   identries[1]; // 每个图像的入口定义
  26. } icondir, *lpicondir;
复制代码

4.添加自定义函数GetImageOffset (),用于获取图标的数据
  1. DWORD CGkbc8Dlg::GetImageOffset(HMODULE hmodule ,UINT index,DWORD& cursize ,LPBYTE pbitinfo )
  2. {
  3.         DWORD imagesize=0;
  4.         HRSRC himage;
  5.         HGLOBAL gimage;
  6.         imagesize = sizeof(WORD)*3+sizeof(icondirentry)*m_lpMemDir->idCount;
  7.         //计算图像数据的偏移量
  8.         
复制代码
  1. for (int j=0; j<index;j++)
  2.         {
  3.                 himage= FindResource(hmodule,MAKEINTRESOURCE(m_lpMemDir->idEntries[j].nID),RT_ICON);
  4.                 if (himage ==NULL)
  5.                         return 0;
  6.                 gimage= LockResource(himage);
  7.                 imagesize+= SizeofResource(hmodule,himage);
  8.                 UnlockResource(gimage);
  9.         }        
  10.         himage= FindResource(hmodule,MAKEINTRESOURCE(m_lpMemDir->idEntries[index].nID),RT_ICON);
  11.         gimage= LoadResource(hmodule,himage);
  12.         DWORD  size= SizeofResource(hmodule,himage);

  13.         m_lpData =  (LPBYTE)malloc(size);

  14.         if (cursize != NULL)
  15.                 cursize = size;
  16.         memcpy(m_lpData ,LockResource(gimage),size);        
  17.         UnlockResource(gimage);

  18.         return imagesize;
  19. }
复制代码
  1. 5.添加一回调函数EnumResNameProc(),实现整个图标的获取
  2. LPSTR m_iconname;
  3. BOOL CALLBACK EnumResNameProc( HANDLE hModule,  LPCTSTR lpszType,  LPTSTR lpszName, LONG lParam )
  4. {        
  5.         
  6.         if (HIWORD(lpszName)==0)//如果高字节为零,低字节表示图标ID
  7.         {
  8.                 m_iconname = MAKEINTRESOURCE(LOWORD(lpszName));
  9.         }
  10.         else //如果高字节不为零,整个lpszName为图标name
  11.         {
  12.                 m_iconname = strdup(lpszName);
  13.         }
  14.         return true;
  15. }
复制代码
  1. 5.实现图标提取与保存按钮功能
  2. void CGkbc8Dlg::OnButton1()
  3. {
  4.         CFileDialog dlg(TRUE,"exe",NULL,NULL,"可执行文件(.exe)|*.exe",this);
  5.         if (dlg.DoModal()==IDOK)
  6.         {
  7.                 CString sPath = dlg.GetPathName();
  8.                 SetDlgItemText(IDC_PATH,sPath);

  9.                 HICON hicon = ::ExtractIcon(AfxGetInstanceHandle(),sPath,0);
  10.                 if (hicon != NULL)
  11.                 {
  12.                         ((CStatic *)GetDlgItem(IDC_ICONSHOW))->SetIcon(hicon);
  13.                 }
  14.         }        
  15. }

复制代码
我们来演示整个功能实现过程


请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:138.上位机VC MFC指定程序图标的提取与保存.rar 
文件大小:141.04 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!





回复

使用道具 举报

点击查看
快速回复 返回列表 客服中心 搜索