版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、CBuilder 資料庫 1.怎樣在CBuilder中創(chuàng)建使用DLL 2.用C+Bulider在WIN.INI中保存信息 3.如何在CBuilder中檢測硬件 4.C+Builder如何響應(yīng)消息及自定義消息 5.利用C+ Builder開發(fā)動(dòng)畫DLL 6.用C+ Builder 3制作屏幕保護(hù)程序 7.TCP/IP頭格式 8.UDP 9.判斷windows的Desktop及其它目錄 10用C+Builder創(chuàng)建數(shù)字簽名 11用Enter 鍵控制焦點(diǎn)切換的方法 12.攔 截 Windows 消 息 13.使用CommaText 14.程序開始時(shí)先顯示信息框 15.怎樣獲取程序的命令行參數(shù)? 16
2、.如何監(jiān)視剪貼板 17.如何使用OnIdle事件 18.用C+Builder編寫串行異步通信程序 19.CBUILDER非可視組件的消息處理技巧 20.用CBuilder 建立數(shù)據(jù)庫VCL使用經(jīng)驗(yàn) 21.用C+ Builder創(chuàng)建基于Internet的點(diǎn)對(duì)點(diǎn)Chat 22.用C+Builder獲取應(yīng)用程序圖標(biāo) 23.BIG5到GB的轉(zhuǎn)換技術(shù) 24.C+BUILDER讓你的任務(wù)欄圖標(biāo)動(dòng)起來 25.TFORM 26.用BCB在windows桌面創(chuàng)建快捷方式 27.讀磁片磁區(qū) 28.I/O 端口讀寫的實(shí)現(xiàn) 29.檢測鼠標(biāo)位置 30.令Win32 應(yīng)用程序跳入系統(tǒng)零層 31.如何取得Memo的行和列
3、32.使用Sockets 33.Windows95/98下怎樣隱藏應(yīng)用程序不讓它出現(xiàn)在CTRL-ALT-DEL對(duì)話框中? 34.怎樣隱藏應(yīng)用程序的任務(wù)條圖標(biāo) 35.編寫自己的Ping.exe程序 36.用C+Builder在WINNT下編制一個(gè)Service 37.如何在C+ BUILDER中自動(dòng)關(guān)閉WINDOWS屏保 38.顯示/隱藏任務(wù)欄圖標(biāo) 39.信箱監(jiān)視程序 40.C+Building制作鬧鐘 41.撥號(hào)上網(wǎng)IP地址的檢知 42.用C+ Builder編寫Tray程序 43.怎樣用代碼來最小化或恢復(fù)程序 44.制作主窗口顯示前的版權(quán)窗口 45.判斷是否已經(jīng)聯(lián)到 internet 46.
4、獲取登陸用戶名 47.隱藏桌面圖標(biāo) 48.程序啟動(dòng)時(shí)運(yùn)行 49.控制面板的調(diào)用 50.模擬鍵盤按鍵 51.讓標(biāo)題欄閃爍 52.啟動(dòng)屏幕保護(hù) 53.年月日星期的取法 54.鍵盤事件 55.隱藏任務(wù)欄 56.禁止關(guān)機(jī) 57.怎樣以最小化方式啟動(dòng)程序 58.在Memo中增加一行后,如何使最后一行能顯示 59.設(shè)置壁紙方法 怎樣在CBuilder中創(chuàng)建使用DLL 自從CBuilder從去年浪漫情人節(jié)上市以來,吸引了大量的Delphi、VC、Vb的程序員到它的懷抱,大量的C、C程序員感嘆道:總算有了C的可視化開發(fā)工具,對(duì)我也是一樣,從BC、Delphi到CBuilder。 動(dòng)態(tài)鏈接庫(DLL)是Wind
5、ows編程常遇到的編程方法,下面我就介紹一下在BCB (CBuilder下簡稱BCB) 中如何創(chuàng)建使用DLL和一些技巧。 一、創(chuàng)建: 使用BCB File|NEW建立一個(gè)新的DLL工程,并保存好文件BCB,生成一個(gè)DLL的程序框架。 1DllEntryPoint函數(shù)為一個(gè)入口方法,如果使用者在DLL被系統(tǒng)初始化或者注銷時(shí)被調(diào)用,用來寫入對(duì)DLL的初始化程序和卸載程序;參數(shù):hinst用來指示DLL的基地址;reason用來指示DLL的調(diào)用方式,用于區(qū)別多線程單線程對(duì)DLL的調(diào)用、創(chuàng)建、卸載DLL; 2在程序中加入自己所要?jiǎng)?chuàng)建的DLL過程、函數(shù); 3用dllimport描述出口; 例程序如下:
6、include pragma hdrstop extern 揅?_declspec(dllexport) int test(); int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void) return 1; int test() return 3; 注意:動(dòng)態(tài)鏈接庫中調(diào)用過程、函數(shù)時(shí)有不同的CALL方式 _cdecl、 _pascal, _fastcall、_stdcall,BCB中默認(rèn)的方式為_cdecl(可不寫),如果考慮兼容性可用時(shí)_stdcall聲明方法為: extern 揅?_declspec(dlle
7、xport) int _stdcall test(); 對(duì)于其中過程、函數(shù)也改為: int _stdcall test() 二、使用DLL 在BCB中使用DLL有兩種方法: 1用靜態(tài)調(diào)用法 首先需要在BCB的項(xiàng)目中加入輸入接口庫(import library),打開工程項(xiàng)目,使用BCB View|Project Manager打開項(xiàng)目列表,向項(xiàng)目中加入接口庫(.lib)。 其次在頭文件中加入接口聲明。 例程序如下: /define in include file extern 揅?_declspec(dllimport) int _cdecl test(); /use function in
8、main program int I; I=test(); 注意: (1)動(dòng)態(tài)鏈接庫調(diào)用過程、函數(shù)時(shí)CALL方式 與創(chuàng)建時(shí)方式一樣不寫為_cdecl,其它需要聲明。 (2)BCB創(chuàng)建的DLL有對(duì)應(yīng)的輸入接口庫(import library),如只有DLL而無庫時(shí),可用BCB的implib工具產(chǎn)生:implib xxx.lib xxx.dll;另外可用:tlib xxx.lib,xxx.lst 產(chǎn)生DLL的內(nèi)部函數(shù)列表,許多Windows的未公開技術(shù)就是用這種方法發(fā)現(xiàn)的。 2動(dòng)態(tài)調(diào)用法 動(dòng)態(tài)調(diào)用法要用Windows API 中的LoadLibrary()和GetProcAddress()來調(diào)入D
9、LL庫,指出庫中函數(shù)位置,這種方法較常見。 例程序如下: HINSTANCE dd; int _stdcall (ddd)(void); dd=LoadLibrary(搙xx.dll?; ddd=GetProcAddress(dd,搕est?; Caption=IntToStr(ddd(); FreeLibrary(dd); 三、注意: 創(chuàng)建DLL時(shí)編譯鏈接時(shí)注意設(shè)置Project Options。 Packages標(biāo)簽:去除Builder with runtime packages檢查框。 Linker標(biāo)簽:去除Use dynamic RTL檢查框。 否則創(chuàng)建的DLL需要Runtime pa
10、ckages or Runtime library。用C+Bulider在WIN.INI中保存信息現(xiàn)在許多軟件把程序中需要的數(shù)據(jù)保存在注冊(cè)表中,這樣當(dāng)用戶裝的軟件越來越多時(shí),致使注冊(cè)表越來越龐大,容易使系統(tǒng)出錯(cuò)。當(dāng)然,微軟也建議在注冊(cè)表中保存數(shù)據(jù),但當(dāng)我們需要保存的數(shù)據(jù)不多時(shí)完全可以把數(shù)據(jù)保存在WIN.INI中,這樣可以很方便地維護(hù),實(shí)現(xiàn)方法相對(duì)來說比較簡單。下面我以Borland C Builder為例來說說如何實(shí)現(xiàn)。 原理其實(shí)很簡單,只需調(diào)用API的 WriteProfileString和GetProfileInt函數(shù)就可以了。這兩個(gè)函數(shù)的原型是:BOOL WriteProfileStri
11、ng(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString ); UINT GetProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault); 其中l(wèi)pAppName指在WIN.INI中段的名字,即用括起來的字符串,lpKeyName指在這個(gè)段中每一個(gè)項(xiàng)目的名字,lpString指這個(gè)項(xiàng)目的值,即“=”后的數(shù), nDefault為當(dāng)GetProfileInt沒有找到lpAppName和lpKeyName時(shí)返回的值,即缺省值,前者返回為布爾值(true 或 false),后者返回為無
12、符號(hào)整形值。當(dāng)在WriteProfileString函數(shù)中 lpKeyName 為空(NULL)時(shí),則清除這個(gè)段的全部內(nèi)容,lpString 為空時(shí),則清除這一項(xiàng)目的內(nèi)容,即這一行將清除掉。 下面舉一例子來說明這兩個(gè)函數(shù)的用法。新建一個(gè)應(yīng)用程序,在Form1上放兩個(gè)Edit和三個(gè)Button,其中Edit的Text為空,三個(gè)Button的Caption分別為“添加”、“查看”、“清除”。雙擊“添加”按鈕加入下面代碼: WriteProfileString(“例子程序”,“項(xiàng)目”,Edit1Text.c_str(); 雙擊“查看”按鈕加入如下代碼: unsigned int Temp; Temp
13、=GetProfileInt(“例子程序”,“項(xiàng)目”,100); Edit2Text=IntToStr(Temp); 雙擊“清除”按鈕加入如下代碼: WriteProfileString(“例子程序”,NULL,NULL); 然后按F9鍵運(yùn)行程序。 下來可以檢驗(yàn)一下程序的正確性。在Edit1中輸入數(shù)字,如“3265”,按“添加”按鈕,這時(shí)運(yùn)行“sysedit”來查看“WIN.INI”文件的最后面,可以看到加入了如下內(nèi)容: 例子程序 項(xiàng)目=3265 其中“”和“=”是函數(shù)自動(dòng)加上的。按下“查看”按鈕,在Edit2中出現(xiàn)“3265”,當(dāng)按下“清除”按鈕可清除添加的部分。經(jīng)過查看可知程序已達(dá)到預(yù)期的
14、目的。 喜愛編程的朋友可以把上述方法應(yīng)用到自己的程序中去,來達(dá)到保存數(shù)據(jù)信息的作用。當(dāng)確實(shí)要把信息保存到注冊(cè)表中,可以在C Builder中定義一個(gè)TRegistry類的對(duì)象來進(jìn)行相關(guān)的操作,或者直接調(diào)用Windows的API函數(shù),具體如何編程大家可以參閱相關(guān)資料或者同我聯(lián)系。如何在CBuilder中檢測硬件在我們編寫的程序中常常要和硬件打交道,那么如何在程序中確定系統(tǒng)中是否有該設(shè)備,它的運(yùn)行狀態(tài)又是怎樣的呢?對(duì)于初學(xué)者來說,這個(gè)問題常常不好解決,其實(shí)只需簡單地利用幾個(gè)API函數(shù),硬件的問題并不神秘。下面就讓我們一起看看在C Builder中是如何檢測硬件的。 1. 檢測CPU的型號(hào) 先讓我們
15、從最簡單的做起,看一看自己的CPU型號(hào)。首先,在C Builder中畫出圖1所示的窗體,在下面的幾個(gè)例子中我們將一直使用這個(gè)窗體作示范,它包括一個(gè)用來激活測試的Button和一個(gè)用來顯示結(jié)果的Memo。我們可以用GetSystemInfo這個(gè)API獲得CPU的型號(hào)。將下列代碼添加到Button的Click事件里就可以了: void _fastcall TForm1:Button1Click(TObject Sender) /獲得CPU型號(hào) SYSTEM_INFO systeminfo; GetSystemInfo (systeminfo); Memo1LinesAdd(撃腃PU類型是:敚玈tr
16、ing( systeminfo.dwProcessorType ); 運(yùn)行它,點(diǎn)擊Test試試,CPU型號(hào)出來了吧! 2.檢測內(nèi)存狀態(tài) 獲得內(nèi)存狀態(tài)的方法和CPU型號(hào)差不多,只是他用到的是另外一個(gè)API:GlobalMemoryStatus。 其中,成員dwTotalPhys用來獲得物理內(nèi)存總量,而dwAvailPhys顧名思義是有效物理內(nèi)存的意思。我們只要把下面幾行代碼加到上面程序的后面就可以了(不用重做,下同): /獲得內(nèi)存狀態(tài) MEMORYSTATUS memory; memory.dwLength =sizeof(memory); /初始化 GlobalMemoryStatus(mem
17、ory); Memo1LinesAdd(撃奈錮砟詿媸?Mb):敚玈tring(int(memory.dwTotalPhys /1024/1024); Memo1LinesAdd(撈渲鋅捎媚詿媸?Kb):敚玈tring(int( memory. /1024); 怎么樣,看出點(diǎn)門道了么?兩段程序的格式幾乎一模一樣,其實(shí),GetSystemInfoGlobalMemoryStatus還可以獲得許多其他有關(guān)CPU和內(nèi)存的信息,就按照上面的格式去套就行了,更詳細(xì)的資料可以去看C Builder4的Help。 3. 檢測可用硬盤空間 好了,經(jīng)過前面兩個(gè)簡單問題的熱身,我們來處理一個(gè)稍微復(fù)雜的問題:我們知道
18、安裝程序大都有一個(gè)檢測硬盤空間的過程,那么這是怎么實(shí)現(xiàn)的呢?他用到的是API函數(shù)GetDiskFreeSpace,這個(gè)函數(shù)輸入一個(gè)參數(shù):目標(biāo)盤的路徑;返回四個(gè)參數(shù),依次是每簇的扇區(qū)數(shù)、每扇區(qū)的字節(jié)數(shù)、空閑的簇?cái)?shù)、總簇?cái)?shù)。假如我們需要檢測C盤的總?cè)萘亢涂捎萌萘?,那么可以把以下代碼加到上面的程序中: /獲得C盤可用空間 DWORD sector,byte,cluster,free; long int freespace,totalspace; GetDiskFreeSpace(揅:?sector,byte,free,cluster); /獲得返回參數(shù) totalspace=int(cluster)
19、int(byte)int(sector)/1024/1024; /計(jì)算總?cè)萘?freespace=int(free)int(byte)int(sector)/1024/1024; /計(jì)算可用空間 Memo1LinesAdd(揅盤總空間(Mb):敚玈tring(totalspace); Memo1LinesAdd(揅盤可用空間(Mb):敚玈tring(freespace); 怎么樣?現(xiàn)在可以自己做安裝程序了吧!C+Builder如何響應(yīng)消息及自定義消息Inprise(Borland) C+Builder中,可以象在Delphi中一樣響應(yīng)消息,只是看起來要稍復(fù)雜一點(diǎn)。 對(duì)于系統(tǒng)已定義的消息,可以直
20、接響應(yīng): #define WM_MY_OPEN_CMDLINE_FILE (WM_USER+1) /進(jìn)程間通訊的自定義消息 #define WM_MY_SEARCH_NODE (WM_USER+2) /查找命令的自定義消息 class TSomeForm : public TForm /.類中的其它代碼 protected: /消息的響應(yīng)過程 void _fastcall OpenCmdLineFile(TMessage Message); void _fastcall SearchDocumentNode(TMessage Message); void _fastcall GetWindow
21、MinMaxInfo(TWMGetMinMaxInfo Message); /以下通過宏定義實(shí)現(xiàn)消息的正確響應(yīng) BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_MY_OPEN_CMDLINE_FILE, TMessage, OpenCmdLineFile) MESSAGE_HANDLER(WM_MY_SEARCH_NODE, TMessage, SearchDocumentNode) MESSAGE_HANDLER(WM_GETMINMAXINFO , TWMGetMinMaxInfo, GetWindowMinMaxIn fo) END_MESSAGE_MAP(TF
22、orm) ;/end class /以下為實(shí)現(xiàn)代碼 void _fastcall TSomeForm:OpenCmdLineFile(TMessage Message) /直接通過消息結(jié)構(gòu)傳遞參數(shù) LPSTR lpCmdLine=(LPSTR)Message.LParam;/從Message中取得參數(shù) this->HandleCmdLineFile(lpCmdLine);/處理命令行的參數(shù) return; void _fastcall TSomeForm:SearchDocumentNode(TMessage Message) /響應(yīng)查找消息 /Message中的參數(shù)在此處不需要。 th
23、is->SearchNode(); return; void _fastcall TSomeForm:GetWindowMinMaxInfo(TWMGetMinMaxInfo Messag e) /設(shè)置主窗口的最小尺寸 MINMAXINFO *MinMaxInfo=Message.MinMaxInfo; MinMaxInfo->ptMinTrackSize.x=400; MinMaxInfo->ptMinTrackSize.y=300; return; 其中:TMessage和TWMGetMinMaxInfo類型的定義可參見: C:Program FilesBorlandCB
24、uilderinlucdevclMessages.hpp;其它的消息 響應(yīng)方法與此相同。 另外,可以為自定義的消息也定義一個(gè)對(duì)應(yīng)的消息結(jié)構(gòu)(如:TSearchNode_Mes sage),至于如何定義消息結(jié)構(gòu), 可以參考: C:Program FilesBorlandCBuilderinlucdevclMessages.hpp利用C+ Builder開發(fā)動(dòng)畫DLL我們?cè)赪indows98環(huán)境下執(zhí)行拷貝文件、查找文件或計(jì)算機(jī)等耗時(shí)比較長的操作時(shí),Windows會(huì)顯示一個(gè)小小的動(dòng)畫,指示正在進(jìn)行的操作,與死板的靜止圖像相比增色不少。那么我們自己開發(fā)軟件時(shí),能否也顯示一個(gè)這樣的動(dòng)畫提示呢?我在開發(fā)一
25、個(gè)外貿(mào)應(yīng)用軟件系統(tǒng)時(shí),遇到的數(shù)據(jù)量很大,當(dāng)通過復(fù)合條件查找時(shí),因?yàn)椴皇菙?shù)據(jù)庫表的每個(gè)項(xiàng)目都有索引,所以很費(fèi)時(shí),系統(tǒng)也會(huì)表現(xiàn)出長時(shí)間停頓,用戶感覺極為不爽。我經(jīng)過一段時(shí)間的探索,開發(fā)了一個(gè)能夠在采用的開發(fā)環(huán)境PowerBuilder下調(diào)用的動(dòng)畫DLL,由于采用多線程編程,PB調(diào)用的DLL函數(shù)能夠及時(shí)將控制權(quán)交還為PB,不影響應(yīng)用系統(tǒng)的運(yùn)轉(zhuǎn)。用戶能夠看到一個(gè)東西在動(dòng),也就不會(huì)想到系統(tǒng)是不是停止響應(yīng)了,感覺時(shí)間也似乎沒那么久了。 代碼與編譯選項(xiàng) (1) 在C+Builder的File菜單下選擇New,在New Item對(duì)話框的New屬性中選擇DLL,C+Builder就會(huì)創(chuàng)建一個(gè)空白的DLL項(xiàng)目。
26、(2) 在File菜單下選擇New Form,C+Builder創(chuàng)建一個(gè)空白的Form,修改它的屬性為 BorderStyle=bsDialog BorderIcons的子屬性均為False FormStyle=fsStayOnTop Position= poScreenCenter Name=StatusForm (3) 在Form上添加一個(gè)Win32下的Animate控件Animate1,修改它的屬性為 Align=alTop (4) 在Form上添加一個(gè)Standard下的Button控件Button_Cancel,再添加System下的Timer控件Timer1,設(shè)置定時(shí)Interva
27、l時(shí)間位250,以較快的響應(yīng)用戶的取消請(qǐng)求。 因?yàn)镻B應(yīng)用系統(tǒng)與動(dòng)畫窗體代碼分別屬于兩個(gè)線程,不能采用PB線程直接關(guān)閉動(dòng)畫窗體線程的窗口,否則會(huì)引起系統(tǒng)運(yùn)行不正常,因此采用PB線程設(shè)置關(guān)閉標(biāo)志,而動(dòng)畫線程采用Timer控件定時(shí)檢查標(biāo)志,一旦檢測到關(guān)閉標(biāo)志,就關(guān)閉窗口,清除線程標(biāo)志,結(jié)束動(dòng)畫線程。 下面給出編碼及編碼原理: 1DLL DLL主體代碼:/* * DLL主體代碼 * 定義DLL公用變量 * g_CommonAVI 對(duì)Animate控件動(dòng)畫類型索引 * gi_Canceled Button_Cancel按鈕是否被選擇過 * gi_AVIType 要顯示的動(dòng)畫類型,由DLL輸出函數(shù)做為參
28、數(shù)輸入 * gi_RequestClose 請(qǐng)求動(dòng)畫線程關(guān)閉標(biāo)志 * gi_WindowActive 動(dòng)畫窗口所處的狀態(tài) * lpsWinTitle 動(dòng)畫窗體的標(biāo)題,由DLL輸出函數(shù)做為參數(shù)輸入 */ TCommonAVI g_CommonAVI= aviNone, aviFindFolder, aviFindFile, aviFindComputer, aviCopyFiles, aviCopyFile, aviRecycleFile, aviEmptyRecycle, aviDeleteFile ; int gi_Canceled=0,gi_AVIType=0; int gi_Reques
29、tClose=0,gi_WindowActive=0; char lpsWinTitle256; HWND hWndParent=NULL; /* 定義DLL 輸出函數(shù) */ extern "C" _declspec(dllexport) int pascal DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*); extern "C" _declspec(dllexport) int pascal ShowStatusWindow(int AVIType, LPSTR WinTitle,
30、long hWnd); extern "C" _declspec(dllexport) int pascal GetStatus(int ai_CloseWin); extern "C" _declspec(dllexport) int pascal CloseStatusWindow(); /*定義線程TformThread:*/ class TFormThread : public TThread public:/ User declarations _fastcall TFormThread(bool CreateSuspended); void
31、_fastcall Execute(void); ; _fastcall TFormThread: TFormThread(bool CreateSuspended): TThread(CreateSuspended) /* 動(dòng)畫線程執(zhí)行代碼, 動(dòng)畫窗體的定時(shí)器控件會(huì)關(guān)閉它, 清除窗體存在標(biāo)志后結(jié)束線程的運(yùn)行 */ void _fastcall TFormThread:Execute(void) gi_WindowActive=1; StatusForm=new TStatusForm(NULL); StatusForm- >Caption=lpsWinTitle; StatusForm
32、- >ShowModal(); gi_WindowActive=0; delete StatusForm; gi_RequestClose=0; /* 定義一個(gè)線程實(shí)例指針 */ TFormThread *FormThread; /* * 輸出函數(shù)代碼實(shí)現(xiàn)部分 * DllEntryPoint 32位DLL入口 * ShowStatusWindow 顯示動(dòng)畫窗口, 它通過創(chuàng)建一個(gè)線程來創(chuàng)建窗口,避免由于窗口 的MODAL屬性而使控制權(quán)不能及時(shí)的返還給調(diào)用者 * GetStatus 取得撊麛狀態(tài),即用戶有沒有選擇撊麛按鈕 * CloseStatusWindow 關(guān)閉動(dòng)畫窗口, */ _dec
33、lspec(dllexport) int WINAPI DllEntryPoint (HINSTANCE hinst, unsigned long reason, void*) return 1; _declspec(dllexport) int pascal ShowStatusWindow(int AVIType,LPSTR WinTitle,long hWnd) hWndParent=(HWND)hWnd; memset(lpsWinTitle,0,sizeof(lpsWinTitle); strncpy(lpsWinTitle,WinTitle,sizeof(lpsWinTitle)-
34、1); if (AVIType >0 && AVIType< =8) gi_AVIType=AVIType; FormThread=new TFormThread(true); FormThread- >Priority = tpNormal; FormThread- >Resume(); _declspec(dllexport) int pascal GetStatus(int ai_CloseWin) if (gi_Canceled) if (gi_WindowActive) gi_RequestClose=1; while(gi_RequestCl
35、ose); return gi_Canceled; _declspec(dllexport) int pascal CloseStatusWindow() if (gi_WindowActive) gi_RequestClose=1; while(gi_RequestClose); return gi_Canceled; 2.窗體StatusForm的代碼: TStatusForm *StatusForm; /- extern int gi_Canceled; extern int gi_AVIType; extern TCommonAVI g_CommonAVI; _fastcall TSt
36、atusForm: TStatusForm(HWND ParentWindow) : TForm(ParentWindow) gi_Canceled=0; /- /取消按鈕并不直接關(guān)閉窗體, 而指示設(shè)置取消標(biāo)志,供調(diào)用者查看 void _fastcall TStatusForm: Button_CancelClick(TObject *Sender) gi_Canceled=1; / ModalResult=mrCancel; /- / 激活動(dòng)畫,在FORMCREATE事件中 void _fastcall TStatusForm: FormCreate(TObject *Sender) Ani
37、mate1- >CommonAVI=g_CommonAVIgi_AVIType; Animate1- >Active = true; /- extern int gi_RequestClose; / 定時(shí)器事件檢測到結(jié)束標(biāo)志關(guān)閉窗體 void _fastcall TStatusForm: Timer1Timer(TObject *Sender) if (gi_RequestClose) ModalResult=mrOk; /- (5) 設(shè)置編譯選項(xiàng):Project->Options打開Project Options對(duì)話框,清除Linker屬性頁中的Use Dynamic RT
38、L標(biāo)志,清除Packages屬性頁中的Build with runtime packages。這樣只要單個(gè)DLL就可以運(yùn)行了,而不必安裝一些動(dòng)態(tài)連接運(yùn)行時(shí)間庫。使用動(dòng)畫DLL 上面編譯出DLL可以由其它任何開發(fā)語言調(diào)用,下面給出在PB中的使用方法。 (1) 定義: /Declare - > Global External Functions FUNCTION Long ShowStatusWindow(Long AVIType,String WinTitle,long hWnd) & LIBRARY "STATWIN.DLL" ALIAS FOR "
39、ShowStatusWindow" FUNCTION Long GetCancelStatus(Long CloseWindow) & LIBRARY "STATWIN.DLL" ALIAS FOR "GetStatus" FUNCTION Long CloseStatusWindow() & LIBRARY "STATWIN.DLL" ALIAS FOR "CloseStatusWindow" (2) 調(diào)用: long ll_EndTime /顯示查找文件夾動(dòng)畫 ShowStatusWi
40、ndow(2) setpointer(HourGlass!) ll_EndTime = Cpu() + 10 * 1000 DO if GetCancelStatus(0)=1 then exit end if / 做想做的事情 LOOP UNTIL cpu() > ll_EndTime CloseStatusWindow()用C+ Builder 3制作屏幕保護(hù)程序屏幕保護(hù)程序是以scr為擴(kuò)展名的標(biāo)準(zhǔn)Windows可執(zhí)行程序,在激活控制面板的顯示器屬性的"屏幕保護(hù)程序"頁時(shí),該模塊會(huì)自動(dòng)在Windows啟動(dòng)目錄(Windows目錄和系統(tǒng)目錄)下查找擴(kuò)展名是scr的基
41、于Windows的可執(zhí)行文件。使用屏幕保護(hù)程序,不僅可以延長顯示器的使用壽命,還可以保護(hù)私人信息。 編制屏幕保護(hù)程序不僅要涉及消息的處理,還要涉及命令行參數(shù)的處理。在WIN32SDK文檔中描述了編制基于WIN32的標(biāo)準(zhǔn)的屏幕保護(hù)程序所必須遵守的嚴(yán)格標(biāo)準(zhǔn)。按照這些標(biāo)準(zhǔn),屏幕保護(hù)程序必須要輸出兩個(gè)函數(shù):ScreenSaverProc和ScreenSaverConfigureDialog,但是,在Windows系統(tǒng)中的很多屏幕保護(hù)程序并沒有遵循這些標(biāo)準(zhǔn)(使用impdef或者tdump實(shí)用工具查看即可)。并且使用該文檔中介紹的方法編寫屏幕保護(hù)程序,不僅要使用資源編輯器,并且在鏈接時(shí)還要利用Scrsav
42、er.lib文件(在C+Builder3環(huán)境下,不能成功連接)。不僅要涉及消息的處理,還要涉及命令行參數(shù)的處理。 C+Builder3是一種快速的應(yīng)用程序開發(fā)工具,提供了許多類型的應(yīng)用程序開發(fā)模板,但沒有提供開發(fā)屏幕保護(hù)程序的模板,并且在其在線幫助中也沒有提及如何開發(fā)這類應(yīng)用程序。經(jīng)過本人的研究,找到了用C+Builder3編制屏幕保護(hù)程序的方法。 在控制面板的"顯示器屬性"項(xiàng)的"屏幕保護(hù)程序"頁中進(jìn)行設(shè)置時(shí),要遇到三種類型的命令行參數(shù),并且,各種情況下的屏幕保護(hù)程序的顯示結(jié)果也各不相同,一般來講,就需要三種類型的窗體(或兩種,在隨后的內(nèi)容中討論)。下面
43、將分四步來具體地說明如何編制屏幕保護(hù)程序。 一、屏幕保護(hù)程序的選擇 如果在標(biāo)題為"屏幕保護(hù)程序"的下拉列表框中選中了某個(gè)保護(hù)程序時(shí),系統(tǒng)會(huì)自動(dòng)啟動(dòng)該程序,這個(gè)程序的顯示范圍是在這個(gè)頁面上的顯示器圖形的屏幕范圍,同時(shí),會(huì)將兩個(gè)命令行參數(shù):一個(gè)是"/p";另一個(gè)是顯示窗口的句柄,傳遞給這個(gè)被選中的程序。因此,這類程序首先應(yīng)該能夠處理命令行參數(shù)。在C+Builder3中,與命令行參數(shù)處理有關(guān)的函數(shù)是:ParamCount()和ParamStr(),具體的申明方式如下: 1externPACKAGEint_fastcallParamCount(void); 該函
44、數(shù)返回命令行參數(shù)的個(gè)數(shù),但不包含應(yīng)用程序本身。 2externPACKAGEAnsiString_fastcallParamStr(intIndex); 該函數(shù)返回指定索引值的命令行參數(shù)。ParamStr(0)返回的是應(yīng)用程序本身。 所以,在這以步驟中的參數(shù)判斷的語句如下: if(UpperCase(ParamStr(1)= "-p"|UpperCase(ParamStr(i)="/p") /addthecodeinhere 在完成了參數(shù)判斷后,就應(yīng)該對(duì)顯示窗口的處理,為能夠使程序在顯示器圖形的屏幕區(qū)域內(nèi)顯示,就要重新設(shè)置程序的父窗口和顯示區(qū)域。這要涉及
45、到父窗口句柄的獲得及父窗口的設(shè)置,以及API函數(shù)的調(diào)用。這種環(huán)境下的父窗口句柄就是傳遞過來的第二個(gè)命令行參數(shù);要設(shè)置父窗口,只需設(shè)置窗體的ParentWindow屬性即可。這段程序如下: RECTrc;/Line1 HWNDhWnd=(HWND) (atol(ParamStr(2).c_str();/Line2 :GetClientRect(hWnd,&rc);/Line3 ParentWindow=hWnd;/Line4 Left=rc.left;/Line5 Top=rc.top;/Line6 Width=rc.right-rc.left;/Line7 Height=rc.bott
46、om-rc.top;/Line8 在上面的程序片段中,第2行語句是將傳遞過來的第2個(gè)參數(shù)轉(zhuǎn)換成窗口句柄;然后,第3行語句利用這個(gè)窗口句柄,調(diào)用API函數(shù)以獲得該窗口的客戶區(qū)域;第4行語句將選中的屏幕保護(hù)程序的父窗口設(shè)置為指定的窗口;余下的語句是將該程序的窗口大小設(shè)置成副窗口的客戶區(qū)大小。這一程序片段的位置應(yīng)該是在窗體的OnCreate事件處理中。 需要說明的是,這種類型(包括第三步介紹的窗體)的窗體樣式應(yīng)是: FormStyle=fsStayOnTop; 窗體邊界的樣式應(yīng)為: BorderStyle=bsNone; 當(dāng)然,這時(shí)也不需要鼠標(biāo)圖形,因此,可以將鼠標(biāo)的形狀設(shè)為crNone: Curs
47、or=crNone; 二、初始化參數(shù)的設(shè)置 單擊"顯示器屬性"模塊的"屏幕保護(hù)程序"頁面中的"設(shè)置"按鈕時(shí),系統(tǒng)會(huì)啟動(dòng)指定的保護(hù)程序的初始值設(shè)置對(duì)話框,這時(shí)傳遞過來的命令行參數(shù)是:"/c"或"-c"(參數(shù)的處理與前面介紹的相同)。通過該對(duì)話框,可以設(shè)置保護(hù)程序的一些初始參數(shù),比如圖形的變化快慢等。在這段程序中,還要涉及到初始化文件或注冊(cè)表的讀寫,用以記錄初始化參數(shù),便于保護(hù)程序啟動(dòng)時(shí)使用。 三、預(yù)覽及運(yùn)行 預(yù)覽的效果就是屏幕保護(hù)程序被激活后的顯示。單擊單擊"顯示器屬性"模塊的
48、"屏幕保護(hù)程序"頁面中的"預(yù)覽"按鈕,就可以觀察保護(hù)程序運(yùn)行的實(shí)際效果。這時(shí),系統(tǒng)啟動(dòng)該程序時(shí)傳遞過來的命令行參數(shù)是:"/s"或"-s"。對(duì)于命令行參數(shù)的處理與前面的步驟相同,但在這一步中,還要對(duì)幾個(gè)消息進(jìn)行處理,這些消息是:WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_MBUTTONDOWN,WM_RBUTTONDOWN,WM_KEYDOWN,WM_ACTIVATE。對(duì)WM_MOUSEMOVE和WM_ACTIVATE消息的處理形式如下: void_fastcallHandleSomeMessage
49、(TMessage&Msg) switch(Msg.Msg) /. caseWM_ACTIVATE:if(Msg.WParamLo=WA_INACTIVE) Close(); break; caseWM_MOUSEMOVE:if(OldMouseX=-1&&OldMouseY=-1) /Intheconstructor,OldMouseXand OldMouseYmustbeinitializedby-1. OldMouseX=Msg.LParamLo; OldMouseY=Msg.LParamHi; elseif(OldMouseX!=Msg.LParamLo |Ol
50、dMouse!=Msg.LParamHi) Close(); break; . 對(duì)于其他的消息僅僅是調(diào)用Close()函數(shù)來關(guān)閉應(yīng)用程序即可。應(yīng)用這種消息處理方式時(shí),必須要類定義時(shí)進(jìn)行消息映射,不然的話,就要在相應(yīng)的消息響應(yīng)中進(jìn)行處理(使用一定的布爾變量,就可以與第一步合用一個(gè)窗體)。 與第一步類似,在該步驟中,也不需要具體的鼠標(biāo)指針的形狀,因此,將鼠標(biāo)指針設(shè)為crNone: Cursor=crNone; 四、修改項(xiàng)目源文件 在C+Builder3中,一個(gè)窗體也就是一個(gè)類,換句話說,具有某些特性的類也就是一個(gè)窗體,因此,編制屏幕保護(hù)程序時(shí),也不需要什么主窗體,同時(shí),也不用自動(dòng)創(chuàng)建某些窗體了,這
51、時(shí)就要修改項(xiàng)目源文件,下面所列出的程序就是筆者在編制某屏幕保護(hù)程序時(shí)使用的項(xiàng)目源文件,供讀者參考。 WINAPIWinMain(HINSTANCE,HINSTANCE,LPSTR,int) CreateMutex(NULL,true,"ScreenSaver"); if(GetLastError()!=ERROR_ALREADY_EXISTS) try Application->Initialize(); Application->Title="屏幕保護(hù)程序測試" if(UpperCase(ParamStr(1)= "/C"
52、;|UpperCase(ParamStr(1)="-C" |ParamCount()=0) TScrSaverConfiguerF*ScrCfg= newTScrSaverConfiguerF(NULL); ScrCfg->ShowModal(); deleteScrCfg; return0; /單擊"設(shè)置"按鈕 elseif(UpperCase(ParamStr(1)= "/P"|UpperCase(ParamStr(1)="-P") TScrForP*ScrFP=newTScrForP(NULL); Sc
53、rFP->ShowModal(); deleteScrFP; return0; /在"屏幕保護(hù)程序"下拉列表框中選擇一個(gè)程序 elseif(UpperCase(ParamStr(1)= "/S"|UpperCase(ParamStr(1)="-S") TScreenSaveF*ScreenSave=newTScreenSaveF(NULL); ScreenSave->ShowModal(); deleteScreenSave; return0; /單擊"預(yù)覽"按鈕,及運(yùn)行屏幕保護(hù)程序 else retu
54、rn1; catch(Exception&exception) Application->ShowException(&exception); return0; /theWinMainFunctionend 前面介紹了在C+Builder3下編制屏幕保護(hù)程序的方法.對(duì)于C+Builder3這種RAD工具來講,開發(fā)這類程序也是相當(dāng)方便的,按照前述的方法,可以在極短的時(shí)間開發(fā)出屏幕保護(hù)程序。對(duì)于屏幕保護(hù)程序,在本文中沒有說明的就是如何設(shè)置口令的問題,這部分就由讀者自己摸索吧。TCP/IP頭格式一、先是常用的IP頭格式。 IP頭格式: 版本號(hào) (4位) IP頭長度 (4位) 服
55、務(wù)類型 (8位) 數(shù)據(jù)包長度 (16位) 標(biāo)識(shí)段 (16位) 標(biāo)志段 (16位) 生存時(shí)間 (8位) 傳輸協(xié)議 (8位) 頭校驗(yàn)和 (16位) 發(fā)送地址 (16位) 目標(biāo)地址 (16位) 選項(xiàng) 填充簡單說明 = 1. IP頭長度計(jì)算所用單位為32位字, 常用來計(jì)算數(shù)據(jù)開始偏移量 2. 數(shù)據(jù)包長度用字節(jié)表示, 包括頭的長度, 因此最大長度為65535字節(jié) 3. 生存時(shí)間表示數(shù)據(jù)被丟失前保存在網(wǎng)絡(luò)上的時(shí)間, 以秒計(jì). 4. 頭校驗(yàn)和的算法為取所有16位字的16位和的補(bǔ)碼. 5. 選項(xiàng)長度是可變的, 填充區(qū)域隨選項(xiàng)長度變化, 用于確保長度為整字節(jié)的倍數(shù).描述 = struct iphdr BYTE versionihl; BYTE tos; WORD tot_len; WORD id; WORD frag_off; BYTE ttl; BYT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)人與公司租賃合同標(biāo)準(zhǔn)文本2024年版一
- 2025年度旅游汽車租賃及旅游紀(jì)念品銷售合同3篇
- 個(gè)人網(wǎng)絡(luò)營銷策略制定合同(2024年)
- 2024離婚合同不執(zhí)行起訴狀案例
- 二零二五版民辦學(xué)校校長任期家長溝通協(xié)作合同4篇
- 二零二五版?zhèn)€人對(duì)文化傳承產(chǎn)業(yè)借款合同示范3篇
- 二零二五年度住宅小區(qū)車位代理租賃及管理服務(wù)合同4篇
- 2025年度茶藝培訓(xùn)與茶藝館投資合作合同范本4篇
- 2025年度船舶航行安全保障體系設(shè)計(jì)與實(shí)施合同2篇
- 專屬房地產(chǎn)項(xiàng)目代建合作合同(2024版)版B版
- 保險(xiǎn)反洗錢培訓(xùn)
- 普通高中生物新課程標(biāo)準(zhǔn)
- 茉莉花-附指法鋼琴譜五線譜
- 結(jié)婚函調(diào)報(bào)告表
- SYT 6968-2021 油氣輸送管道工程水平定向鉆穿越設(shè)計(jì)規(guī)范-PDF解密
- 冷庫制冷負(fù)荷計(jì)算表
- 肩袖損傷護(hù)理查房
- 設(shè)備運(yùn)維管理安全規(guī)范標(biāo)準(zhǔn)
- 辦文辦會(huì)辦事實(shí)務(wù)課件
- 大學(xué)宿舍人際關(guān)系
- 2023光明小升初(語文)試卷
評(píng)論
0/150
提交評(píng)論