请问如何把大批图片放到资源文件中,如何调用?(100分)

  • 主题发起人 主题发起人 sleepy
  • 开始时间 开始时间
S

sleepy

Unregistered / Unconfirmed
GUEST, unregistred user!
1.想把大批的图片放到res文件中去,不知如何处理?<br>用ImageEditor好象每次只能copy paste一个图片,麻烦死了.<br><br>2.如果用手写rc文件编译成res的方法,可以吗?怎样做?<br><br>3.等编译好res文件以后,如何在程序中调用?假设我把其中某一图片<br>放到TImage控件中,怎样做?请用代码回答俺的问题,谢谢!!!
 
照抄一文, 供参考:<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 源文件在DELPHI中的使用<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;资源是存放在扩展名.RES 的文件里的二进制数<br>据结构,在DELPHI 中资源文件可以使用图象编辑器来<br>制作(IMAGE EDITOR),或者使用其他的工具。如:BORLAND<br>公司提供的RAD PACK FOR DELPHI 中的RESOURCE WORKSHOP 来创<br>建。资源文件中通常存放的是应用程序可以随时存<br>取的一些对象,包括:ICON、CURSOR、BITMAP、FONT 等近十<br>种。大部分的资源在通常的情况下可以保留在磁盘<br>当中,直到程序需要使用它们时才将其调入,可以大<br>大的节省内存资源,同样,资源文件也是可以共享<br>的,即:多个程序可以共享一个资源文件,进而减少<br>了在应用程序之间代码重复的现象,使程序的代码<br>得到很大的优化,因此在应用程序中使用资源文件<br>有独立制作、方便、随时修改而不需要对应用程序代<br>码做任何修改的好处。<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;一般来说,一个应用程序的所有资源都存放<br>在一个RES 文件里,然后在DELPHI 进行编译的阶段将资<br>源文件的内容与最终的EXE 文件合并在一起,因此编<br>译后的RES 文件并没有什么作用,仅仅提供用来查阅<br>使用,在分发应用时不必把RES 文件分发给最终用户。<br>当然,不同的资源可以分别放在不同的资源文件当<br>中,而且资源文件越小调入内存的速度越快。在这里<br>还要说明的一点是:在修改了原来的资源文件之后,<br>在原来编译的EXE 文件中加入的资源不会随之而更<br>新,只有在重新进行编译以后,才能将新的资源加入<br>到新的EXE 文件当中去。<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;下面我们通过两个例子来说明在DELPHI 中如何<br>使用资源文件(在这里我们不讲述资源文件的制作<br>方法)。<br><br>一、如何在DELPHI 中使用定制的光标。<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;在使用DELPHI 进行编程时,有一个很重要的对<br>象──TSCREEN,它是用来管理和操纵运行时期屏幕的<br>不可视构件。它的CURSOR 属性是用来指定各个不同的<br>构件光标形状,声名为:<br><br>&nbsp; &nbsp;PROPERTY CURSORS[INDEX:INTEGER]:HCURSOR;<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;这个只读的特性返回应用程序支持的光标组<br>成的一个HCURSOR 类型的数组,它存储了屏幕上所有的<br>鼠标光标的身份代码(HCURSOR 就是光标的HANDLE 句柄),<br>数组下标从0 开始,在DELPHI 预定义了一些代表不同光<br>标的常量,它的值是从0 到-17,您可以直接指定程序<br>使用的光标。如:<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FORM1.CURSOR:颖硎綟ORM1 采用的光标是CRCROSS(十<br>字)。<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;大家可能都会发现构件的CURSOR 的属性最多提<br>供十八种常用的CURSOR 值,这在很多的情况下是不够<br>的,如:当光标进入一个PANEL 面板时光标的形状为一<br>只手,那么PANEL 的CURSOR 就不能满足这种要求,这时就<br>需要我们自定义一个手的光标并将其赋给PANEL<br>&nbsp;的CURSOR 属性。如何实现则可以按以下步骤进行:<br><br>&nbsp; 1.使用资源文件编辑器(IMAGE EDITOR 或者RESOURCE<br>&nbsp; &nbsp; &nbsp;WORKSHOP)编写资源文件。<br>&nbsp; 2.定义一个光标常量,注意这个常量不能与DELPHI 中<br>&nbsp; &nbsp; &nbsp;提供的光标常量相冲突。<br>&nbsp; 3.在FORMCREATE 事件中使用WINDOWS API 当中的LOADCURSOR 函<br>&nbsp; &nbsp; &nbsp;数来载入自定义的CURSOR。<br>&nbsp; 4.在程序中将自定义的CURSOR 分配给PANEL 的CURSOR 属<br>&nbsp; &nbsp; &nbsp;性。<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;下面说明如何将自定义的一只手的鼠标光标<br>赋给PANEL1 的CURSOR 属性。首先使用IMAGE EDITOR 建立一<br>&nbsp;个HAND.RES 的文件。之后按如下书写程序代码:<br><br>implementation<br><br>{$R *.DFM}<br><br>const<br>Crhand+<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br>screen.cursors[crhand]:坅dcursor(Hinstance,'hand');<br>panel1.cursor:鹔and;<br>end;<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;除了编写上面的代码以外, 我们还需要做的一<br>项工作是将资源文件加入到项目文件当中去, 编译指<br>令中的{$R filename} 伪指令让我们来增加资源文件,让<br>我们来看一看项目文件的代码。<br><br>program PCUR;<br><br>uses<br>&nbsp; Forms,<br>&nbsp; HAND in 'HAND.pas' {Form1};<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{$R *.RES}// 这里的* 意义为在程序编译以后会<br>产生一个与项目文件同名的资源文件,在这里为<br>PCUR.RES 文件, 这部分是自动产生的。<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{$R hand.res}// 这部分是我们自己加入的自定义<br>资源文件,这两个资源文件(HAND.RES 和//PCUR.RES 中的资<br>源都会附加在可执行文件PCUR.EXE 的后面。<br><br>begin<br>&nbsp; Application.Initialize;<br>&nbsp; Application.CreateForm(TForm1, Form1);<br>&nbsp; Application.Run;<br>end.<br><br>二、资源文件在编写动画程序中的应用<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;上面的例子使用的是在资源文件中存储的<br>CURSOR 资源,在下面的例子中我们将使用的是在资源<br>文件中提供的ICON 资源来编写一个小小的动画程序。<br>在这里动画的产生是利用定时器在一定的时间间隔<br>内产生TIMER 事件将存储在资源文件中的ICON 依次的绘<br>制在FORM 的同一处而产生的。这时要用到画布CANVAS<br>&nbsp;的DRAW 方法,其声明如下:<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;procedure Draw(X, Y: Integer; Graphic: TGraphic); <br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;在这个方法当中的参数GRAPHIC 可以为:BITMAPS、<br>ICONS、METAFILES。具体的实现方法为:建立DEMO.RES 文件,<br>其中含有名为ICON1 —ICON6 的ICON。并将DEMO.RES 加到项目<br>原代码中去( 如: 上面例子的方法)。<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;动画程序的具体代码如下:<br><br>unit donghua;<br><br>interface &nbsp; &nbsp; &nbsp; &nbsp; <br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br>&nbsp; ExtCtrls;<br><br>type<br>&nbsp; TForm1 ,lass(TForm)<br>&nbsp; &nbsp; Image1: TImage;<br>&nbsp; &nbsp; Timer1: TTimer;<br>&nbsp; &nbsp; procedure FormCreate(Sender: TObject);<br>&nbsp; &nbsp; procedure Timer1Timer(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br><br>implementation<br>var<br>wicon:array[0..5]of Ticon;<br>&nbsp; &nbsp; &nbsp; &nbsp; // 建立TICON 类型的数组存储ICON 文件<br>idx:integer;<br><br>{$R *.DFM}<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>var<br>iconname:string;<br>piconame:pchar;<br>begin<br>piconame:齬alloc(7);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 建立PCHAR 类型的字符串<br>for idx:餿o 5 do<br>begin<br>wicon[idx]:con.create;// 建立TICON 型对象<br>iconname:?on'+inttostr(idx);<br>strpcopy(piconame,iconname);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 将STRING 类型转换成PCHAR 类型<br>wicon[idx].handle:坅dicon(hinstance,piconame);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 调用WINDOWS API 中的LOADICON 函数<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 载入资源中的ICON<br>end;<br>strdispose(piconame);//PCHAR 类型的删除<br>form1.canvas.draw(3,3,wicon[1]);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 调用DRAW 的方法在FORM 上画出ICON1<br>idx:<br>form1.setbounds(0,0,100,100);<br>&nbsp; &nbsp; &nbsp; &nbsp;// 固定FORM 的大小和位置<br>end;<br><br>procedure TForm1.Timer1Timer(Sender: TObject);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 形成动画的定时器事件<br>begin<br>idx:Mx+1;<br>if idx漢en idx:<br>form1.canvas.draw(3,3,wicon[0]);<br>form1.canvas.draw(3,3,wicon[idx]);<br>end;<br><br>end.<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;以上可以作为一个通用的动画程序,我们只<br>需要修改不同的ICON 以及增加IDX 的大小就可以编出不<br>同的动画应用(同样在资源中可以有其他形式的图<br>形如:BITMAPS 这时需要动态创建的是TBITMAPS 对象而不<br>是TICON 对象)。在两个例子中我们都用到了WINDOWS API<br>函数,这些函数在WINDOWS 单元中均有说明在这里不加<br>赘述。以上的两个例子只是资源文件的一点点应用,<br>要真正的掌握资源文件在程序设计中的强大作用,<br>还要靠自己在实践中不断的总结。<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;以上程序在WINDOWS95 下的DELPHI2.0 中编译通过。<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;作者:李旭东(李晓东)<br>
 
这篇文章我看到过,并没有回答俺的问题呀 :(<br>
 
你现在的D4是不是UPDATE3的, 如是, 则在PROJECT菜单下有一个 RESOURCE 项<br><br>在那里, 你可以把图片加入. 如何调用, 我还没做过.
 
调出:LOADBITMAP<br>把图片输入资源:IMAGE EDIT,VISUAL STUDIO的资源编辑器都可以<br>找跟书看看吧,DELPHI 3从入门到精通中有详细论述
 
写一个资源脚本文件(*.rc)列出位图及相应资源的名称<br>&nbsp; .....<br>A1 BITMAP "A1.BMP"<br>A2 BITMAP "A2.BMP"<br>A3 BITMAP "A3.BMP"<br>&nbsp;.....<br>用BRCC32.EXE将其编译为res文件<br>在单元文件中加入<br>{$R *.dfm}<br>{$R _____.res}<br>使用win api loadbitmap从资源中装入位图
 
CJ大虾,请问可以不安装VStudio而只安装资源编辑器吗?<br>Delphi3从入门到精通有电子书吗?谢谢!!<br><br><br>分太少,充分利用这次提问的机会,不好意思,嘻嘻~
 
如果觉得ImageEdit麻烦的化,就写RC,再用BRC32.exe编译成.res文件。<br><br>下面是程序。<br><br>.....<br><br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; Image1: TImage;<br>&nbsp; &nbsp; procedure FormCreate(Sender: TObject);<br>&nbsp; &nbsp; procedure FormDestroy(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bmp: TBitmap;<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br><br>implementation<br><br>{$R *.DFM}<br><br>{$R yourBmps.res} //必须和单元文件在同一目录下。<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br>&nbsp; &nbsp; &nbsp;bmp := TBitmap.Create;<br>&nbsp; &nbsp; &nbsp;bmp.LoadFromResourceName(HInstance, 'YOURBMP');<br>&nbsp; &nbsp; &nbsp;Image1.Picture.Bitmap := bmp;<br>end;<br><br>procedure TForm1.FormDestroy(Sender: TObject);<br>begin<br>&nbsp; &nbsp; &nbsp;bmp.Free;<br>end;<br><br><br><br><br>
 
你现在的D4是不是UPDATE3的, 如是, 则在PROJECT菜单下有一个 RESOURCE 项<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ~~~~~ <br>我的D4是Update3,但是PROJECT菜单下没有找到RESOURCE项,是不是<br>我的UPDATE3和你的不同。
 
<br>----images.rc----------<br><br>#include "images.pas"<br><br>IDB_NA &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;BITMAP &nbsp;DISCARDABLE &nbsp; &nbsp; "NA.BMP"<br>IDB_SLEEPING &nbsp; &nbsp;BITMAP &nbsp;DISCARDABLE &nbsp; &nbsp; "SLEEPING.BMP"<br>IDB_USING &nbsp; &nbsp; &nbsp; BITMAP &nbsp;DISCARDABLE &nbsp; &nbsp; "USING.BMP"<br>IDB_ALERTING &nbsp; &nbsp;BITMAP &nbsp;DISCARDABLE &nbsp; &nbsp; "ALERTING.BMP"<br>IDB_PAYING &nbsp; &nbsp; &nbsp;BITMAP &nbsp;DISCARDABLE &nbsp; &nbsp; "PAYING.BMP"<br><br><br>----- images.ps ------------------<br>unit images;<br><br>interface<br><br>const<br>&nbsp; IDB_NA = 1;<br>&nbsp; IDB_SLEEPING = 2;<br>&nbsp; IDB_USING = 4;<br>&nbsp; IDB_ALERTING = 8;<br>&nbsp; IDB_PAYING = 16;<br>&nbsp; IDB_TRIGGER = 32;<br>implementation<br><br>end.<br><br><br>使用brcc32 images.rc 编译成images.res<br><br>在Delphi项目中(.dpr), 使用 {$R images.res}<br>
 
手工写一个文件(xxx.rc)如下:<br>bmp_name1 &nbsp;BITMAP &nbsp;c:/../*.bmp<br>bmp_name2 &nbsp;BITMAP &nbsp;c:/../*.bmp<br>&nbsp;.<br>&nbsp;.<br>其中bmp_name可以为任意,但实际的bmp文件名要加上路径。<br>用BRCC32.EXE将其编译为res文件<br><br>调用:<br>在 {$R *.dfm}下一行加上<br>{$R xxx.res}<br><br>Image1.Picture.Bitmap.Handle:=LoadBitMap(HInstance,'bmp_name1');<br><br>如果res文件内容有变化,你的project必须重新编译。<br>
 
多人接受答案了。
 
后退
顶部