Board logo

标题: [原创]利用LabWindows/CVI提取任意文件中的图标 [打印本页]

作者: wangjianxin2001    时间: 2006-11-29 23:07     标题: [原创]利用LabWindows/CVI提取任意文件中的图标

我们都知道,Windows的应用程序中包含有好多图标文件。作为一名程序员,会经常为制作、设计程序图标费尽心思,当我们看到许多应用软件的图标非常漂亮的时候,是多么的羡慕!我们可不可以借鉴一下他们的图标?完全可以!我们利用 ExtractIcon API函数就能够轻松地从ICO文件或可执行文件以及DLL文件中提取图标。读者从这个实例中可以学到如何提取可执行文件内部的所有图标并应用到自己的程序中。读者从这个实例中可以学到如何提取可执行文件内部的所有图标并应用到自己的所编制的LabWindows/CVI的程序中。
界面如下:
 
 
 
代码如下:
 
//引入windows头文件和shellapi头文件
#include "windows.h"
#include "shellapi.h"
#include
#include
#include
#include "提取图标.h"
static int panelHandle;
int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       LPSTR lpszCmdLine, int nCmdShow)
{
 if (InitCVIRTE (hInstance, 0, 0) == 0)
  return -1; /* out of memory */
 if ((panelHandle = LoadPanel (0, "提取图标.uir", PANEL)) < 0)
  return -1;
 DisplayPanel (panelHandle);
 RunUserInterface ();
 DiscardPanel (panelHandle);
 return 0;
}
//获取按钮
int CVICALLBACK OkCallback (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
 int handle;
 char path[300];
 HDC hdc;
 int nicons;
 HICON Large, Small;
 int i;
 int kind;
 
 switch (event)
 {
  case EVENT_COMMIT:
   
   //为大图标和小图标赋初值
   Large = 0;
   Small = 0;
   
   //打开文件
   if (FileSelectPopup ("", "*.exe", "*.exe;*.dll;*.lib", "打开", VAL_OK_BUTTON, 0, 0, 1, 1, path)>0)
   {
    /* 提取文件中的图标函数
    UINT ExtractIconEx(
      LPCTSTR lpszFile,        // 文件名
      int nIconIndex,          // 图标索引 若为-1,则表示获得总图标数目
     HICON *phiconLarge,      // 大图标索引
     HICON *phiconSmall,      // 小图标索引
     UINT nIcons              // 图标数目
    );
    */
    
    //获得文件图标总数
    nicons = ExtractIconEx((LPCTSTR)path, -1, &Large, &Small, 1);
   }
   
   //将图标分别提取出来,并在面板中显示
   for (i=0; i<(int)nicons; i++)
   {
    ExtractIconEx((LPCTSTR)path, i, &Large, &Small, 1);
    //获得面板句柄
    GetPanelAttribute (panelHandle, ATTR_SYSTEM_WINDOW_HANDLE, &handle);
    
    //获取指定窗口的设备场景
    hdc = GetDC((HWND)handle);
    
    //要显示的图标类型
    GetCtrlVal (panelHandle, PANEL_BINARYSWITCH, &kind);
    
    if (kind == 0)
    {
     //依次在面板中绘制大图标
     DrawIcon(hdc, (i/4)*40+10, (i%4)*40+10, Large); 
    }
    else
    {
     //依次在面板中绘制小图标
     DrawIcon(hdc, (i/4)*40+10, (i%4)*40+10, Small);      
    }
    
    //释放图标句柄
    DestroyIcon(Large);
    DestroyIcon(Small);
   }
   break;
 }
 return 0;
}

//退出按钮
int CVICALLBACK QuitCallback (int panel, int control, int event,
  void *callbackData, int eventData1, int eventData2)
{
 switch (event)
 {
  case EVENT_COMMIT:
   QuitUserInterface (0);
   break;
 }
 return 0;
}
 
 
转自:小信的博客
网址:http://blog.sina.com.cn/u/1265070197
pRPMbRph.rar (5.55 KB)


附件: [[原创]利用LabWindows/CVI提取任意文件中的图标] pRPMbRph.rar (2006-11-29 23:07, 5.55 KB) / 下载次数 408
http://bbs.eccn.com/attachment.php?aid=388&k=5c3621e3fedb1108cbb327d30ed44c97&t=1732321638&sid=1PpMei
作者: andysj1982    时间: 2006-11-30 10:29

呵呵!很好玩的东西,我多会才能像楼主一样,是个高手啊!努力ING~~~
作者: 蜡人    时间: 2006-11-30 23:00

祝贺你,斑竹,呵呵


作者: 蜡人    时间: 2006-11-30 23:06

怎么把你的图表保存下来呢?谢谢
作者: wangjianxin2001    时间: 2006-12-2 18:40

LabWindows/CVI这门语言最大的缺点就是只有面板才有句柄,而控件是没有句柄的,所以,如果想得到句柄,只是面板,不可能将这些API中提取的内容显示的某个控件中!我正在尝试用直接读取内存地址的方式获得更多我们所想得到的东西,但是相关的知识还有些欠缺,而且NI并没有公开相关的技术文档,用起来有些困难!!
作者: deng    时间: 2006-12-5 10:51

等待着版主的的好消息啊!要是真能做出来,就幸福了!哈哈


作者: zzyhnhtth    时间: 2008-5-19 19:40

学习一下






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0