分享
 
 
 

BC++ Builder中 各 种 资 源 的 利用

王朝c/c++·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

BC++ Builder 3.0 中 各 种 资 源 的 利用

在 编 写 程 序 的 过 程 中,经 常 要 用 到 各 种 资 源。 比 如 说, 想 给 自己 的 程 序 换 个 自 己 的 图 标, 使 用 一 些活 泼 的 光 标 来 增 加 趣 味 性, 播 放 一 些声 音 和 动 画 文 件, 或 者 使 用 别 人 写 好的 程 序 来 实 现 某 个 功 能。 我 们 往 往 希望 将 这 些 资 源 直 接 放 到EXE 文 件 中 以 形成

一 个 单 独 的 可 执 行 文 件, 这 就 存 在 一个 如 何 在 运 行 时 访 问 和 使 用 这 些 资 源的 问 题。

在 编 译 期 间, 这 就 要 用 到 一 种 文 件, 以 .rc 结 尾 的 资 源 定 义 文 件。

一: RC 文 件

rc 文 件 是 个 文 本 文 件, 它 的 格 式 很 简单, 按 如 下 格 式 定 义:

资 源 标 识 符 资 源 类 型 资 源 的 路 径

以 下 的 rc 文 件 定 义 了 一 个 声 音 资 源, 两个 光 标 资 源, 三 个 图 标 资 源 和 一 个exe 文件 资 源。

src1.rc:

S1 WAV wav1.Wav

C1 CURSOR cursor1.cur

C2 CURSOR cursor2.cur

I1 ICON icone1.ico

I2 ICON icone2.ico

I3 ICON icone3.ico

unzip EXEFILE pkunzip.exe

你 可 以 将 写 好 的 rc 文 件 加 到 你 的 project( 项 目) 中。 你 也 可 以 手 工 将 其 编 译 为 供程 序 直 接 使 用 的 二 进 制 资 源 文 件(.res 文 件)。 在BCB3.0 中, 可 以 使 用 命 令 行: brcc32 src1.rc src1.res 。

二: 资 源 的 使 用

下 面, 按 照 使 用 的 简 繁 程 度, 依 次 说 明各 类 资 源 的 使 用 方 法。

需 要 说 明 的 是, 下 面 讲 述 的 使 用 方 法,在 别 的 编 译 环 境 下(BC, VC 等) 也 是 一 样的。

1: 建 立 一 个 新 的 项 目

启 动 BCB3.0, 选 FILE- >new- >Application 建 立 一个 新 的 项 目。

在 project- >Add to Project 中, 加 入 写 好 的 src1.rc 文 件。 当 然, 那 些 声 音、 光 标、 图 标 文件 都 应 该 存 在。

这 时, 我 们 有 了 一 个 空 的 窗 体(Form)。

2: 能 够 利 用 windows API 函 数 直 接 访 问 的 资源 有:

图 标 LoadIcon()

光 标 LoadCursor()

加 速 表 LoadAccelerators()

位 图 LoadBitmap()

菜 单 LoadMenu()

字 符 串 LoadString()

前 五 个 API 函 数 使 用 方 法 都 一 样, 带 两个 参 数。

第 一 个 参 数 指 明 资 源 的 存 放 地 , 第 二个 参 数 为 rc 文 件 中 资 源 的 标 识。

字 符 串 LoadString 除 这 两 个 参 数 外, 还 有 两个 参 数, 指 明 字 符 串 缓 冲 区 的 地 址 和大 小。

下 面 的 一 小 段 程 序 示 范 了 图 标 和 光 标的 使 用。

在 Form 上 放 置 一 个 按 纽, 在 其 OnClick 事 件中 加 入 以 下 代 码:

void __fastcall TForm1::Button1Click(TObject *Sender) {

// 将光标形状改为自己定义的:

Screen- >Cursors[crDefault] = LoadCursor( HInstance, "C1");

// 将图标改为自己定义的:

Icon = new TIcon() ;

Icon- >Handle = LoadIcon(HInstance,"I1");

Application- >Icon = Icon ;

}

其 中 的 HInstance 指 示 资 源 所 在 地 为 执 行 文件。 编 译 执 行 后, 点 击 该 按 纽, 光 标 和图 标 都 会 换 成 新 的。

3: 能 够 通 过 windows API 使 用 的 资 源

对 于 声 音、 动 画 等 文 件, 可 以 使 用 windows API 函 数 播 放。 但 是 不 象 上 面 几 种 资 源,需 要 遵 循 一 定 的 步 骤。 如 下 所 示, 依 次调 用 FindResource, LoadResource, LockResource 函 数, 来播 放 一 个Wav 声 音 文 件。

( 当 然, 独 立 的 声 音 文 件 可 以 在 运 行时 直 接 播 放。 我 们 这 里 讨 论 的 是 将 wav 文 件 编 译 进 EXE 文 件 的 情 况)

在 Form 上 放 置 第 二 个 按 纽, 在 其 OnClick 事件 中 加 入 以 下 代 码:

void __fastcall TForm1::Button2Click(TObject *Sender)

//定义资源块

char *wav_handle ;

//装入 Wav文件

HRSRC h = FindResource(HInstance,"S1","WAV");

HGLOBAL h1 = LoadResource(HInstance, h);

wav_handle = (char *)LockResource(h1);

//播放 Wav文件。由于Wav文件装载在内存中,

sndPlaySound函数要用 SND_MEMORY参数

sndPlaySound(wav_handle, SND_MEMORY | SND_SYNC);

}

编 译 执 行 后, 点 击 该 按 纽, 会 播 放 一 次声 音。

对 于 动 画 等 文 件, 使 用 方 式 类 似Wav 文件。( BCB 提 供 了 一 个TAnimate 控 件, 可 以 播放 无 声 的Avi 文 件)

4: 不 能 直 接 通 过 windows API 使 用 的 资 源

此 种 资 源 不 能 够 由 windows API 直 接 访 问 和执 行。 但 是, 我 们 可 以 用 一 种 变 通 的 方法 来 使 用 它。

下 面 示 范 如 何 使 用 pkunzip.exe, 思 路 如 下:程 序 运 行 时, 将pkunzip.exe 从EXE 文 件 中 分 离出 来, 放 在 临 时 目 录 下, 用 ShellExecute() 执行 它。

在FORM 上 放 置 第 三 个 按 纽, 在 放 置 两 个 Edit , 用 来 输 入 pkunzip.exe 的 参 数。

<pre>

void __fastcall TForm1::Button3Click(TObject *Sender)

{

char exefile[100], tmppath[100] ;

unsigned long ret ;

//检查 pkunzip.exe是否已经存在

GetTempPath( 100, tmppath ) ;

strcpy( exefile ,(AnsiString(tmppath)+

AnsiString("\\pkunzip.exe") ).c_str() ) ;

ret = GetFileAttributes( exefile ) ;

if( ret == 0xffffffff ) { //不存在,则分离出 pkunzip.exe

TResourceStream &rs = *new TResourceStream(

(int)HInstance, AnsiString("unzip"),"EXEFILE" ) ;

rs.SaveToFile( AnsiString(exefile) ) ;

delete &rs ;

}

//执行 pkunzip.exe

// Edit1- >Text和 Edit2- >Text分别为运行时

输入的zip文件名和目标文件目录。

ShellExecute(HInstance, "open", exefile, (AnsiString("-d ") + Edit1- >Text +

" " + Edit2- >Text).c_str(), tmppath, SW_HIDE ) ;

Application- >MessageBox("解压缩完成", "OK", IDOK ) ;

}

此 种 方 法 实 际 上 是 用 时 间 和 空 间 来 换取 便 利 性, 有 一 定 的 参 考 价 值。 例 如,DynaDoc 的 免 费 分 发 版 本, 就 是 将 真 正 的 执 行程 序 压 缩 后 放 在 一 个 有 解 压 缩 功 能 的“ 壳” 中。 运 行 时, 首 先 是“ 壳” 运 行 起来, 将 真 正 的 执 行 程 序 解 压 缩 到 临 时目 录, 然 后 去 运 行 它。 如 果 你 的 程 序 含有 大 量 的BMP,WAV 文 件, 不 妨 一 试, 能 让 你的 程 序 减 肥 不 少。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有