C++ Builder中各类资源的操作
当前位置:以往代写 > C/C++ 教程 >C++ Builder中各类资源的操作
2019-06-13

C++ Builder中各类资源的操作

C++ Builder中各类资源的操作

副标题#e#

在编写措施的进程中,常常要用到各类资源。好比说,想给本身的措施换个本身的图标,利用一些生动的光标来增加趣味性,播放一些声音和动画文件,可能利用别人写好的措施来实现某个成果。我们往往但愿将这些资源直接放到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文件。虽然,那些声音、光标、图标文件都应该存在。


#p#副标题#e#

—-这时,我们有了一个空的窗体(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文件的环境)

#p#副标题#e#

—-在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的参数。

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 ) ;
}

#p#分页标题#e#

—-此种要领实际上是用时间和空间来调换便利性,有必然的参考代价。譬喻,DynaDoc的免费分发版本,就是将真正的执行措施压缩后放在一个有解压缩成果的“壳”中。运行时,首先是“壳”运行起来,将真正的执行措施解压缩到姑且目次,然后去运行它。假如你的措施含有大量的BMP,WAV文件,不妨一试,能让你的措施减肥不少。

    关键字:

在线提交作业