ImageList控件怎么保存成文件
有一个ImageList控件,然后在程序运行时会动态添加一些图标进来,那么如何保存成一个文件呢,这样在程序下次打开时就直接读文件,将图标加载进ImageList控件
最好不是把每个图标单独保存成一个文件
谢谢了
[解决办法]
图标文件存成RES文件即可
[解决办法]
可以使用资源文件的方式
【转】BCB中使用资源文件!
建立一个文本文件,名字叫mybmp.rc,加入工程里
其内容如下:
BMP1 BITMAP "F:\123.bmp "
注意这里的 "F:\123.bmp "必须存在
2 在程序里这样使用:
void __fastcall TForm1::FormPaint(TObject *Sender)
{
Graphics::TBitmap *aaa = new Graphics::TBitmap();
//aaa-> LoadFromResourceName((unsigned int)(HInstance), "BMP1 ");//这样也可以的哦!
aaa-> Handle = LoadBitmap(HInstance, "BMP1 ");//这是你需要用的函数
Form1-> Canvas-> Draw(0,0,aaa);
delete aaa;
}
.rc 是资源说明文件,它是文本格式,所以可以新建一个 txt 文件,然后将文件后缀改为.rc 即可。对它的编辑也可以用记事本编辑,当然在 C++Builder 中也可以编辑。 .rc 文件的格式很简单,每一行说明一个资源,一行中有三列,第一列为资源的标志名, 第二列为资源的类型,第三列为资源的文件名。如下列代码:
srcfile.rc: WAV_RING WAV wav1.Wav CURSOR_HAND CURSOR cursor1.cur ICON_CLOUD ICON icon1.ico EXE_FILE EXEFILE faint.exe 其中第一行定义的是声音文件,第二行是一个光标文件,第三行是图标文件,第四行是一个 exe 可执行文件。
.rc 文件写好之后,有两种方法加入工程,简单方便的方法就是打开菜单“Project”-> “Add to Project”(Shift + F11),选择编写好的.rc 文件,添加到工程即可。C++Builder 会自动将.rc 文件编译为供程序使用的二进制数据.res 文件。编译完成以后,只有当在 C++Builder 中更改 了.rc 文件的内容后,.rc 文件才会重新编译。所以如果自己更改了文件资源(如重新编辑了 图片),只需要在 C++Builder 中使得.rc 文件处于被修改状态(如按下一个字符再删除之), 重新编译程序的时候就会自动重新编译资源文件。 另外一种编译资源文件的方法是自己手动编译。使用的编译工具是 C++Builder 程序目录 bin 中的 brcc32.exe 程序。在命令行模式下,输入 brcc32 可以查看其使用帮助。一般使用 默认选项,也就是在命令行中输入 brcc32 YourRcFileName.rc 即可生成同名的.res 文件。编 译好的.res 文件要在程序中使用,还需要在源文件中添加代码如下: #pragma resource "myres.res " 其中 myres.res 为编辑生成的资源文件的文件名。 资源文件添加之后,就是怎么使用它们的问题了。对于不同类型的文件,使用方法也不 同,下面分别介绍各种类型文件的具体用法。
可以直接通过 API 函数访问的资源类型以及对应的 API 函数如下:
加速表 LoadAccelerators(HINSTANCE hInstance,LPCTSTR lpTableName)
位图 LoadBitmap(HINSTANCE hInstance,LPCTSTR lpTableName)
光标 LoadCursor(HINSTANCE hInstance,LPCTSTR lpTableName)
图标 LoadIcon(HINSTANCE hInstance, LPCTSTR lpTableName)
菜单 LoadMenu(HINSTANCE hInstance,LPCTSTR lpTableName)
字符串 LoadString(HINSTANCE hInstance,UINT uID,LPTSTR lpBuffer,int nBufferMax)
对于声音,动画资源,使用 API 函数也可以访问,但是它与位图、光标等资源不同的是, 对它们的访问需要比较严格的格式。需要依次使用 FindResource 、LoadResource 和 LockResource,如下面代码,播放资源中的一个声音文件:
void __fastcall TForm1::Button2Click(TObject *Sender)
{ //定义资源块 char *wav_handle ;
//装入 Wav 文件 ,第二个参数为文件名,第三个参数为文件类型
HRSRC h = FindResource(HInstance, " WAV_RING ", "WAV "); HGLOBAL h1 = LoadResource(HInstance, h);
wav_handle = (char *)LockResource(h1); //播放 Wav 文件。由于 Wav 文件装载在内存中,PlaySound 函数要用 SND_MEMORY 参 数
sndPlaySound(wav_handle, SND_MEMORY | SND_SYNC);
}
不能通过 API 直接使用的资源 对于外部可执行文件,在程序中可以通过 shell 函数 ShellExecute 来执行它,但是对于资 源文件中的 exe 可执行文件,却不能这么做。虽然资源文件中的 exe 文件不能被程序直接调 用,但是,我们可以先从资源文件中把 exe 文件分离出来,保存在硬盘中,然后通过 ShellExecute 来执行它。 假设资源文件中有一个名字叫 MYEXE 的文件,我们需要将它从当前运行的程序中分离 出来放在系统临时目录中,首先,需要判断临时目录路径+”Myexe.exe”(欲生成的文件名) 是否已经存在,如果不存在,则用该文件名将 exe 文件保存在临时目录。判断文件是否存在 的代码如下:
char exefile[100], tmppath[100] ;
GetTempPath( 100, tmppath ) ; //获得临时目录路径 //分离之后的 exe 文件名
strcpy( exefile ,(AnsiString(tmppath)+AnsiString( "\\Myexe.exe ") ).c_str() ) ;
if(GetFileAttributes( exefile )== 0xffffffff) //文件不存在
{//从资源中分离可执行文件
TResourceStream &rs = *new TResourceStream( (int)HInstance, AnsiString( "MYEXE "), "EXEFILE " ) ; rs.SaveToFile( AnsiString(exefile) ) ;
delete &rs ;
} 分离出可执行文件之后就可以通过 ShellExecute 执行它了。显然,对文件的分离需要浪费一 些时间,可是却为我们带来很大的方便。
[解决办法]
看看我的代码
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TFileStream *FileStream ;
FileStream=new TFileStream( "C:\\1.dat ",fmCreate);
FileStream-> WriteComponent(ImageList1);
FileStream-> Free();
}
//---------------------------------------
//#include "systobj.h "
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TFileStream *FileStream ;
//RegisterClass(TImageList);
FileStream=new TFileStream( "C:\\1.dat ",fmOpenRead);
(TComponent *)(ImageList1) =FileStream-> ReadComponent(ImageList1);
FileStream-> Free();
}