zoukankan      html  css  js  c++  java
  • Delphi中资源文件使用详解

    一.编写 RC 脚本文本
    用记事本或其它文本编辑器编写一个扩展名为“.rc”的文件。格式如下:
    AVI 无声动画
    BITMAP 位图文件
    CURSOR 光标文件
    ICON 图标文件
    WAVE 声音文件
    以上所列均为标准资源类型,也可以给资源自定义一个类型,如:“mytype”。不过两者在调用方式上有些不同(在后面示例“存取资源文件中的位图”中有详细描述)。
    二.根据 RC 脚本文件编译成 RES 资源文件
    在命令提示符中输入以下内容:
    brcc32 FileName.rc //注:brcc32.exe在DelphiX\Bin目录中
    三.在Delphi单元中加入资源文件
    将生成的 RES 资源文件复制到相应程序所在的目录中,在单元文件中的“{$R *DFM}”后面加上“{$R FileName.res}”,编译后资源文件就被包含在可执行文件中了。
    说明:如果嫌2、3两步麻烦,可以采用更简便的做法,即:将 RC 文件直接添加到项目中,在编译Delphi项目时,会自动编译该资源文件。

    四.资源文件调用示例
    (1)存取资源文件中的位图

    //RC: testBmp bitmap res\test.bmp
    Image1.Picture.Bitmap.LoadFromResourceName(HInstance, 'res\test.bmp');
    //RC: testBmp bmptype res\test.bmp
    var
    resStream: TResourceStream;
    begin
    resStream := TResourceStream.Create(HInstance, 'testBmp', 'bmptype');
    Image1.Picture.Bitmap.LoadFromStream(resStream);
    resStream.Free;
    end;

    请注意上面两种调用方式的不同之处。

    (2)存取资源文件中的图标
    将图标放在资源文件中,可以实现动态改变应用程序的图标。

    //RC: testIcon icon res\test.ico
    Application.Icon.Handle := LoadIcon(HInstance, 'testIcon');

    (3)存取资源文件中的AVI动画

    //RC: testAvi avi res\test.avi
    Animate1.ResName := 'testAvi';
    Animate1.Active := True;

    (4)存取资源文件中的JPEG图像
    为了能够处理JPEG图像,必须在Interface处引用JPEG单元。

    var
    jpg: TJPEGImage;
    resStream: TResourceStream;
    begin
    jpg := TJPEGImage.Create;
    resStream := TResourceStream.Create(HInstance, 'testJpg', 'jpgtype');
    jpg.LoadFromStream(resStream);
    Image1.Picture.Assign(jpg);
    jpg.Free;
    resStream.Free;
    end;

    附:Delphi编程中资源文件的应用:初级应用篇
    资源文件一般为扩展名为res的文件.在VC中资源文件用得非常普遍,但Delphi在其联机帮助中对资源文件没作什么介绍,其实利用其自带的资源编译工具BRCC32.EXE(一般位于\Delphi\BIN目录下),我们完全可以做出跟VC一样效果的文件来。
    资源文件最大的好处是能将一些在必要时才调用的文件跟可执行文件一起编译,生成一个文件.这样做最大的好处就是使外部文件免遭破坏.例如在一条程序中你要临时调用一幅图片,一般作法是把图片放在某一路径下(通常是主程序所在路径),但如果用户路径误删你的图片文件,则可能使程序找不到相应文件而出错崩溃.另外,如果你想自己的程序界面美观,想用一些自定义光标,也要用到资源文件。
    资源文件的使用步骤为:
    一.编写rc脚本文本
    用记事本或其它文本编辑器编写一个扩展名为rc的文件。例如:
    mycur cursor move.cur //加入光标
    mypic Bitmap Water.BMP //加入位图
    mywav WAVE happy.wav //加入声音
    myAVI AVI EPOEN.AVI //加入视频
    myIco ICON CJT.ICO //加入图标
    格式分别为在资源文件中的名称->类型->实际文件名称,例如上面第一行定义一个名为mycur的光标,实际名称为加入光标move.cur.
    二.将rc文件编译成res资源文件
    将脚本文件和实际文件拷到Brcc32.EXE所在目录,执行DOS命令。格式为:Brcc32 脚本文件(回车),例如有一名为myfirst.rc的脚本文件,则执行 Brcc32 myfirst.rc(回车)即可。如果你是懒人,也可新建一批处理文件,内容只有一行:Brcc32 mufist.rc.(因为Delphi安装后一般会在自动批处理文件中指明搜索路径的。)如果编译成功,则会生成一个结尾为res的文件,这个文件就是我们需要的资源文件。
    三.在Delphi单元中加入资源文件
    将生成的res资源文件拷贝到你所编程序的路径下,在单元文件{$R *DFM}后加上一句{$R mufirst.res},则将res文件加入去,编译后资 源文件即已包含在可执行文件中了。若你有多个资源文件,也按上法依次加入。

    四.在Delphi程序中调用资源文件
    资源文件在Delphi中的关键字为hinstance.下面给出具体用法.
    1.光标的调用
    首先在程序中定义一个值大于0的常量,因为Delphi本身用0-负16来索引默认的光标,所以我们制定的光标应从表面上1开始索引。然后在窗口的Oncreat事件中添加以下代码:

    screen.cursor[35]:=Loadcursor (hinstance,'mycur');

    其中35为大于1的常量,mycur为光标在资源文件中的名字。如果希望在其他控件上使用定制光标,例如Panel控件,只需在程序的适当处加入以下代码:

    Panel1.cursor:=35;

    2.位图的调用
    新建一项工程,添加一Timage控件,在需要显示的地方写以下代码:

    Var mymap:Hbitmap;
    begin
    mymap:=LoadBitmap(hinstance,'mypic');
    Image1.picture.Bitmap.Handle:=mymap;
    end;

    其中"mypic"为位图资源文件中的名称。
    3.AVI文件的调用
    新建一工程,添加一Animate控件,在需要的地方加入:

    animater1.resname:='myAVI';
    animater1.Active:=true;

    其中myAVI为视频文件在资源文件中的名称。
    4.调用WAV文件
    在uses中加入mmsystm单元,以便在程序中播放WAV文件。播放时Playsound(pchar('mywav'),hinstance,sndsync or snd_resource);其中mywav为声音文件在资源中的名称。
    5.加入光标
    加入光标比较容易,只要将res文件加入单元文件中即可。但需注意,名称最好取"W"."WW"等,使第一个字母尽量靠后,以免与主程序的图标顺序颠倒。这样一来,别人在使用你的程序时如果想选择其它图标就有很多选择了。
    补充
    1.资源类型除上述类型外,还可以字体文件,字符串文件等。
    2.资源文件不但可以在标准图形界面下使用还可在控制台下使用。
    下面我们来试验一下:
    新建一工程,将唯一的一个Form删除,然后修改工程文件。增加一句{$Apptype console},在uses子句中加入mmsystem,并将其它引用单元删掉。将Begin和end之间语句删掉。至此,我们就可和Turbo PASCAL下编程序一样,且还可以调用Windows的API和资源。将资源文件----{$R myfist.res}加入。在Begin和end之间写下:

    writeln('演示程序,按任意键开始!');
    readln;
    playsound(pchar('mywav'),hinstance,snd_sync or snd_resource);
    writeln('演示结束!');

    运行程序,将弹出一个标准DOS窗口,按任意键播放声音文件。是不是很COOL呢!我曾下载过一个播放器,在其安装目录下我发现有一"DOS程序",用鼠标双击它便弹出一个DOS窗口,显示DOS时代特有的画图,并有背景音乐!可能就是用这个方法做的。
    3.Delphi本身自带了一个叫Image Editor的工具,同样可以编辑资源文本,但和本文的方法比较,可得出下表:

    Image
    Editor
    Brcc32

    BMP
    只支持16位色
    任意色

    光标
    黑白两色
    任意色

    ICO
    只支持16位色
    任意色

    AVI
    不支持
    支持

    WAV
    不支持
    支持

    字符串
    不支持
    支持

    上面说的是直接在程序本身的调用。其实资源文件还有其它用法。比如说在你的程序携带其它文件,要用的时候释放出来。
    例如: myexe exefile 'ha1.exe'//脚本文件
    下面是自定义释放函数ExtractRes,本例中使用如下:

    ExtractRes('exefile','myexe','c:\new.exe');

    就把ha1.exe以new.exe为名字保存到C盘根目录下了.

    function TForm1.ExtractRes(ResType, ResName, ResNewName: string): boolean;
    var
    Res: TResourceStream;
    begin
    try
    Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
    try
    Res.SavetoFile(ResNewName);
    Result := true;
    finally
    Res.Free;
    end;
    except
    Result := false;
    end;
    end;

  • 相关阅读:
    二分图 洛谷P2055 [ZJOI2009]假期的宿舍
    并查集 洛谷P1640 [SCOI2010]连续攻击游戏
    贪心 洛谷P2870 Best Cow Line, Gold
    贪心 NOIP2013 积木大赛
    快速幂 NOIP2013 转圈游戏
    倍增LCA NOIP2013 货车运输
    树形DP 洛谷P2014 选课
    KMP UVA1328 Period
    动态规划入门 BZOJ 1270 雷涛的小猫
    KMP POJ 2752Seek the Name, Seek the Fame
  • 原文地址:https://www.cnblogs.com/xiaobao/p/1946155.html
Copyright © 2011-2022 走看看