BC++Builder3.0中各種資源的利用 (轉)
BC++Builder3.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:能夠利用 直接訪問的資源有:
圖示 LoadIcon()
游標 LoadCursor()
加速表 LoadAccelerators()
點陣圖 Loaitmap()
選單 LoadMenu()
字串 LoadString()
----前五個API函式使用方法都一樣,帶兩個引數。
----第一個引數指明資源的存放地,第二個引數為rc檔案中資源的標識。
----字串LoadString除這兩個引數外,還有兩個引數,指明字串緩衝區的地址和大小。
----下面的一小段程式示範了圖示和游標的使用。
----在Form上放置一個按紐,在其OnClick事件中加入以下程式碼:
void __fastcall TForm1::Button1Click(T *Sender)
{
//將游標形狀改為自己定義的:
Screen- >Cursors[crDefault] = LoadCursor( HInstance, "C1");
//將圖示改為自己定義的:
Icon = new TIcon() ;
Icon- >Handle = LoadIcon(HInstance,"I1");
Application- >Icon = Icon ;
}
----其中的HInstance指示資源所在地為執行檔案。編譯執行後,點選該按紐,游標和圖示都會換成新的。
---- 3:能夠透過windows API使用的資源
----對於聲音、動畫等檔案,可以使用windows API函式播放。但是不象上面幾種資源,需要遵循一定的步驟。如下所示,依次FindRe, 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檔案中分離出來,放在臨時目錄下,用Execute()執行它。
----在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("") ).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_H ) ;
Application- >MessageBox("解完成", "OK", IDOK ) ;
}
----此種方法實際上是用時間和空間來換取便利性,有一定的參考價值。例如,DynaDoc的免費分發版本,就是將真正的執行程式壓縮後放在一個有解壓縮功能的“殼”中。執行時,首先是“殼”執行起來,將真正的執行程式解壓縮到臨時目錄,然後去執行它。如果你的程式含有大量的BMP,WAV檔案,不妨一試,能讓你的程式減肥不少。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988911/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- React Router各種資源集React
- .NET中各種資料庫連線大全 (轉)資料庫
- 揭露Windows中各種不Ň(轉)Windows
- Oracle中Date的各種格式轉換Oracle
- 3種在雲中利用開源的方法
- [npm資源] naming-style,快速轉換各種命名風格NPM
- MySQL中各種欄位的取值範圍(轉)MySql
- 跨域資源共享的各種方式(持續更新)跨域
- iOS 中的各種鎖iOS
- 前端你需要的各種開源庫前端
- C#中的各種各樣的索引器C#索引
- 【轉載】JDBC連線各種資料庫的字串JDBC資料庫字串
- Java連線各種資料庫的例項 (轉)Java資料庫
- Java中各種Log的使用Java
- js中的各種寬高JS
- javascript中的各種問題JavaScript
- C++中的各種鎖C++
- Unity中的各種合批Unity
- Oracle中開啟10046 Trace的各種方法[轉]Oracle
- 各種語言的介紹(轉)
- .NET中各種資料庫連線大全資料庫
- 取當前日期各種資料庫的寫法 (轉)資料庫
- [Python] 各種轉換Python
- 各種MySQL程式概述(轉)MySql
- 欄位連線的各種資料庫的寫法 (轉)資料庫
- 小黑需知 各種系統中密碼檔案的位置(轉)密碼
- Java中的各種關鍵字Java
- C++ 中各種map的使用C++
- Html中的各種高度寬度HTML
- MySQL 當中的各種鎖(中級篇)MySql
- 自己找不到資源?不妨來試試這4個資源網站,各種資源一鍵到手!網站
- 給Excel表格中的資料批次新增各種符號Excel符號
- postman中各種變數Postman變數
- 和GUI有關的各種物件 (轉)GUI物件
- 實戰:併發轉賬業務中避免死鎖的各種方法
- 遊戲開發學院:小談遊戲中的各種平衡(轉)遊戲開發
- iOS中獲取各種檔案的目錄路徑的方法(轉)iOS
- 玩轉陣列各種方法陣列