如何把一个bmp文件当成资源加入到程序中,并使用 一个bmp文件,里面竖排着32*32大小的 n 张图片,我如何把这个文件当成资源加到我的程序中,并如何随意得到其中的任何一个图片? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Dephi5中资源文件的创建和使用崔同杰 张卫华 几乎每个Windows应用程序都使用图标、图片、光标等资源。资源是程序的一部分,但是它是不可执行代码。下面我们就详细介绍资源文件在Delphi5中建立和使用方法。 1.把资源放到Exe文件的优点 由于定位资源比在磁盘中定位文件花费时间少,所以应用程序执行会更快。多种资源可以放在一个文件中,减少了图标、图片、光标等文件数量。保存资源文件时不要和工程名相同,因为Delphi创建工程时会自动创建一个和工程名相同的资源文件。并且最好将资源文件保存到和工程文件同一个文件夹中。 2.创建资源文件 首先创建一个.Rc的纯文本文件。格式如下: 资源标识符 + 关键字 + 资源文件名 ① 资源标识符:程序中调用资源时的特殊标号; ② 关键字:标识资源文件类型; Wave: 资源文件是声音文件; RCDATA: JPEG文件; AVI: AVI动画; ICON: 图标文件; BITMAP: 位图文件; CURSOR: 光标文件; 资源文件名:资源文件名; ③ 资源文件名:编译的资源文件,比如动画、位图、光标等; ④ 如:MyWav WAVE "FileName.Wav" 使用Borland资源编译器(BRCC32.EXE)转化.Rc文件成.Res文件。在DOS命令行下输入下列命令: Brcc32 FileName.Rc // Brcc32.Exe在Delphi5\Bin文件下。 3.在工程中引用资源文件 为了存取我们的资源文件,必须告诉Delphi链接我们的资源文件到应用程序中。因此我们可以在源代码中加入一条编译指令完成上述功能。这条指令必须紧跟在窗口指令后,如下形式: {$R *.DFM} //Delphi自带编译指令 {$R FileName.Res} //新加入的编译资源文件的指令。 不要删除{$R *.DFM}指令,因为这行代码告诉Delphi链接下面的资源到窗口的资源中。 4.调用资源文件 (1)存取资源文件中的位图(Bitmap) 程序中如果想存取资源,你必须调用一些Windows API函数。保存在资源文件中的位图、光标和图标可以通过调用LoadBitmap、LoadCursor和LoadIcon函数存取。 本例举例说明如何存取资源文件中位图并显示在Timage控件中。 procedure TfrMain.btnCanvasPic(Sender: TObject); Image1.Picture.Bitmap.Handle :=LoadBitmap(hInstance, '资源标识符'); end; 注:如果位图没有装载成功,程序仍旧执行,但是Image将不再显示图片。你可以根据LoadBitmap函数的返回值判断是否装载成功,如果装载成功返回值是非0,如果装载失败返回值是0。 另外一个存取显示位图的方法如下 procedure TfrMain.btnLoadPicClick(Sender: TObject); begin Image1.Picture.Bitmap.LoadFromResourceName(hInstance, '资源标识符'); end; (2)存取资源文件中的光标 Screen.Cursors[]是一个光标数组,使用光标文件我们可以将定制的光标加入到这个属性中。因为默认的光标在数组中索引值是0,所以除非想取代默认光标,最好将定制的光标索引值设为1。 procedure TfrMain.btnUseCursorClick(Sender: TObject); begin Screen.Cursors[1] :=LoadCursor(hInstance,'资源标识符'); Image1.Cursor :=1; end; (3)存取资源文件中的图标 将图标放在资源文件中,可以实现动态改变应用程序图标。 procedure TfrMain.LoadIconClick(Sender: TObject); begin Application.Icon.Handle := LoadIcon(hInstance, '资源标识符'); End; (4)存取资源文件中的AVI procedure TfrMain.LoadIconClick(Sender: TObject); begin Animate1.ResName :='MyAvi' ; //资源标识 Animate1.Active :=True ; End ; (5)存取资源文件中的JPEG 把jpeg单元加入到Interface的uses单元中。 procedure TForm1.LoadJPGClick(Sender: TObject); var Fjpg : TJpegImage ; FStream :TResourceStream ; begin Fjpg :=TJpegImage.Create ; FStream := TResourceStream.Create (Hinstance,'资源标识符',RT_RCDATA) ; FJpg.LoadFromStream (FStream) ; Image1.Picture.Bitmap.Assign (FJpg); end; (6)存取资源文件中的Wave 把MMSystem加入到Interface的uses单元中 procedure TForm1.LoadWaveClick(Sender: TObject); begin PlaySound('MyWav', HInstance, Snd_ASync or Snd_Memory or snd_Resource) ; end; (7)本人补充提供组件图标如果自定义组件没有图标,那么该组件是不完整的。要创建这样的图标,可以使用Delphi的ImageEditor(或者是其他的位图编辑器)来创建24×24的位图,并且这样的位图必须保存到DCR文件。DCR文件与RES文件一样,都是资源文件。所以,如果图标保存在RES文件,那么只要将其扩展名改为DCR即可。提示即使你的显示设备是256色或者更多颜色的,但是如果你要把该组件发布出去,最好不要超过16色,因为一个256色的位图在16色的机器上显示效果非常糟糕。创建了一个位图后,必须给这个位图命名。位图的名称要跟组件的类名相同,而且要大写。DCR文件的名称与组件的单元名称相同。因此,如果组件名称为TXYZComponent,那么位图的名称为TXYZCOMPONENT,如果组件单元的名称为XYZCOMP.PAS,那么DCR文件的名称就是XYZCOMP.DCR。该位图文件必须与组件的单元文件位于同一个目录,编译这个单元时,位图资源会自动加到组件库中。5.结束语 位图、光标和图标、AVI动画、JPEG和Wave文件等可以放到资源文件中,上面我们介绍了如何将资源加入到资源文件中,并介绍了在Delphi中动态存取资源文件的方法。Delphi编译工程会自动创建一个和工程名相同的资源文件(如果没有其他的资源,主窗口的图标会放在这个资源文件中)。但是建议最好不要改变这个资源文件。 谢谢楼上的还问一下,怎样从TBitmap 中切取一部分到另一TBitmap中 你的要求,其实有一个更好的办法,就是用ImageList,先将BMP分成多张小图片,然后在程序中用ImageList把这些图片装起来,要用时,用它的GetBitmap 方法即可。 为什么这个线程停不下来??? ADO升级后出现问题 fastreport 用A4纸张,打印标签,分成两栏,打6张,如何? 向高手求助 關於 ComboBox 控件高度的問題。 @操作符意义 能不能将这段D的代码翻译成VC的,谢谢了,在线等 写入数据库的问题 朋友们进来帮我解析一下dll窗体的问题! 这个打印应该如何做?数据库中数据如下......欲知详情,请进,UP有分,多提好建议,...., 为什么我的D6中的XMLDOCUMENT组件显示的XML文件中不能有中文 把ACCESS 数据库更新到SQL 数据库~~ TIDUDPServer控件的使用
1.把资源放到Exe文件的优点
由于定位资源比在磁盘中定位文件花费时间少,所以应用程序执行会更快。多种资源可以放在一个文件中,减少了图标、图片、光标等文件数量。保存资源文件时不要和工程名相同,因为Delphi创建工程时会自动创建一个和工程名相同的资源文件。并且最好将资源文件保存到和工程文件同一个文件夹中。
2.创建资源文件
首先创建一个.Rc的纯文本文件。格式如下:
资源标识符 + 关键字 + 资源文件名
① 资源标识符:程序中调用资源时的特殊标号;
② 关键字:标识资源文件类型;
Wave: 资源文件是声音文件;
RCDATA: JPEG文件;
AVI: AVI动画;
ICON: 图标文件;
BITMAP: 位图文件;
CURSOR: 光标文件;
资源文件名:资源文件名;
③ 资源文件名:编译的资源文件,比如动画、位图、光标等;
④ 如:MyWav WAVE "FileName.Wav"
使用Borland资源编译器(BRCC32.EXE)转化.Rc文件成.Res文件。在DOS命令行下输入下列命令:
Brcc32 FileName.Rc // Brcc32.Exe在Delphi5\Bin文件下。
3.在工程中引用资源文件
为了存取我们的资源文件,必须告诉Delphi链接我们的资源文件到应用程序中。因此我们可以在源代码中加入一条编译指令完成上述功能。这条指令必须紧跟在窗口指令后,如下形式:
{$R *.DFM} //Delphi自带编译指令
{$R FileName.Res} //新加入的编译资源文件的指令。
不要删除{$R *.DFM}指令,因为这行代码告诉Delphi链接下面的资源到窗口的资源中。
4.调用资源文件
(1)存取资源文件中的位图(Bitmap)
程序中如果想存取资源,你必须调用一些Windows API函数。保存在资源文件中的位图、光标和图标可以通过调用LoadBitmap、LoadCursor和LoadIcon函数存取。
本例举例说明如何存取资源文件中位图并显示在Timage控件中。
procedure TfrMain.btnCanvasPic(Sender: TObject);
Image1.Picture.Bitmap.Handle :=LoadBitmap(hInstance, '资源标识符');
end;
注:如果位图没有装载成功,程序仍旧执行,但是Image将不再显示图片。你可以根据LoadBitmap函数的返回值判断是否装载成功,如果装载成功返回值是非0,如果装载失败返回值是0。
另外一个存取显示位图的方法如下
procedure TfrMain.btnLoadPicClick(Sender: TObject);
begin
Image1.Picture.Bitmap.LoadFromResourceName(hInstance, '资源标识符');
end;
(2)存取资源文件中的光标
Screen.Cursors[]是一个光标数组,使用光标文件我们可以将定制的光标加入到这个属性中。因为默认的光标在数组中索引值是0,所以除非想取代默认光标,最好将定制的光标索引值设为1。
procedure TfrMain.btnUseCursorClick(Sender: TObject);
begin
Screen.Cursors[1] :=LoadCursor(hInstance,'资源标识符');
Image1.Cursor :=1;
end;
(3)存取资源文件中的图标
将图标放在资源文件中,可以实现动态改变应用程序图标。
procedure TfrMain.LoadIconClick(Sender: TObject);
begin
Application.Icon.Handle := LoadIcon(hInstance, '资源标识符');
End;
(4)存取资源文件中的AVI
procedure TfrMain.LoadIconClick(Sender: TObject);
begin
Animate1.ResName :='MyAvi' ; //资源标识
Animate1.Active :=True ;
End ;
(5)存取资源文件中的JPEG
把jpeg单元加入到Interface的uses单元中。
procedure TForm1.LoadJPGClick(Sender: TObject);
var
Fjpg : TJpegImage ;
FStream :TResourceStream ;
begin
Fjpg :=TJpegImage.Create ;
FStream := TResourceStream.Create (Hinstance,'资源标识符',RT_RCDATA) ;
FJpg.LoadFromStream (FStream) ;
Image1.Picture.Bitmap.Assign (FJpg);
end;
(6)存取资源文件中的Wave
把MMSystem加入到Interface的uses单元中
procedure TForm1.LoadWaveClick(Sender: TObject);
begin
PlaySound('MyWav', HInstance, Snd_ASync or Snd_Memory or snd_Resource) ;
end;
(7)本人补充
提供组件图标
如果自定义组件没有图标,那么该组件是不完整的。要创建这样的图标,可以使用Delphi的ImageEditor(或者是其他的位图编辑器)来创建24×24的位图,并且这样的位图必须保存到DCR文件。DCR文件与RES文件一样,都是资源文件。所以,如果图标保存在RES文件,那么只要将其扩展名改为DCR即可。提示即使你的显示设备是256色或者更多颜色的,但是如果你要把该组件发布出去,最好不要超过16色,因为一个256色的位图在16色的机器上显示效果非常糟糕。创建了一个位图后,必须给这个位图命名。位图的名称要跟组件的类名相同,而且要大写。DCR文件的名称与组件的单元名称相同。因此,如果组件名称为TXYZComponent,那么位图的名称为TXYZCOMPONENT,如果组件单元的名称为XYZCOMP.PAS,那么DCR文件的名称就是XYZCOMP.DCR。该位图文件必须与组件的单元文件位于同一个目录,编译这个单元时,位图资源会自动加到组件库中。
5.结束语
位图、光标和图标、AVI动画、JPEG和Wave文件等可以放到资源文件中,上面我们介绍了如何将资源加入到资源文件中,并介绍了在Delphi中动态存取资源文件的方法。Delphi编译工程会自动创建一个和工程名相同的资源文件(如果没有其他的资源,主窗口的图标会放在这个资源文件中)。但是建议最好不要改变这个资源文件。
先将BMP分成多张小图片,然后在程序中用ImageList把这些图片装起来,要用时,用它的GetBitmap 方法即可。