C++Builder的60个编程资料.pdf
C+Builder的 60个编程资料6、用C+Builder 3 制作屏幕保护程序7、TCP/IP头格式8、UDP9,判断windows的Desktop及其它目录10、取得本地internet机器的名字及IP地址11、Jlj C+Builder创建数字签名12、用 Enter键控制焦点切换的方法13、拦 截 Windows消息14、使用 CommaText15、程序开始时先显示信息框16、怎样获取程序的命令行参数?17、如何监视剪贴板18、加何使用Onldle事件19、用 C+Builder编写出行异步通信程序20、C+BUILDER非可视组件的消息处理技巧21、用 C+Builder建立数据库VCL使用经验22、用 C+Builder 创建基 J Internet 的点对点 Chat23、用 C+Builder获取应用程序图标24、BIG5到GB的转换技术25、C+BUILDER让你的任务栏图标动起来26、TFORM27、用 BCBa windows臬而创建快捷方式28、读磁片磁区29、I/O 端口读写的实现30、检测区标位置3 1,令Win32应用程序跳入系统零层32、如何取得Memo的行和列33、使用 Sockets34、Windows95/98下把样隐藏应用程序不止它出现在CTRL-ALT-DEL对话框中?35、怎样照藏质用程序的任务条图标36、编写自己的Ping.exe程序37、用 C+Builder 在 WINNT 卜编制 个 Service38、如何在C+BUILDER中自动关闭WINDOWS屏保39、显示/陶敏任务栏图标40、信箱监视程序41、C+Building 制作闹钟42、拨号上网IP地址的检知43、用 C+Builder 编 Tray 程序44、怎样用代码来最小化或恢复程序45、制作主窗口显示前的版权窗U46、判断是否已经联到internet47、获取登砧用户名48、隐藏桌面图标49、程序启动时运行50、控制面板的调用51、模拟键盘按键52、让标题栏闪烁53、后动屏箱保护54、年月日星期的取法55、键俄事件56、照藏任务栏57、禁止关机58、怎样以最小化方式启动程序59、在Memo中增加,行后,如何使展后一行能显示6 0 s设置壁纸方法1、怎样在C+Builder中创建使用DLL自从C+Builder从去年浪漫情人节上市以来.吸引了大展的Delphi、VC、Vb的程序员到它的怀抱,大址的C、C+程序员感叹道:总算有了 C 的可视化开发工具,对我也是样,从BC.Delphi到C+Builder:动态链接库(DLL)是Windows编程常遇到的编程方法,卜而我就介绍 卜在BCB(C+Builder卜简称BCB)中如何创建使用DLL和 些技巧.一、创建:使用BCBF NEW建立一个新的DLL I程,并保存好文件B C B,生 成 个 DLL的程序框架.1.DIIEntryPoint函数为 个入口方法,如果使用者在DLL被系统初始化或者注销时被调用,用来写入对DLL的初始化程序和蚓载程序:参数:hinst用来指小DLL的基地址;reason用来指示DLL的调用方式,用于区别多线程单线程对DLL的调用、创建、卸载DLL;2.在程序中加入自己所要创建的DLL过程、函数;3.用 dllimport 描述出口例程序如M include#pragma hdrstopextern C _ declspec(dllexport)int test();intWINAPI DIIEntryPoint(HINSTANCE hinst,unsigned long reason,void*)(return 1;)int test()(return 3;注意:动态链接库中谢用过程、函数时有不同的CALL方式 _cded、_pascal,_fastcalK _stdcall.BCB中默认的方式为_cdecl(可不写),如果考虑兼容性可用时_stdcall声明方法为:extern C _ declspec(dllexport)int _ stdcall test();对 r其中过程、函数也改为:int _ stdcall test()二、使用DLL在 BCB中使用DLL有两种方法:1.用静态调用法首先需要在BCB的项目中加入输入接口阐import library),打开工程项目,使用BCB View|Project Manager打开项目列表,向项目中加入接口阵(*Jib)。其次在头文件中加入接口声明.例程序如K/define in include fileextern C _ declspec(dllimport)int _ cdecl test();/use function in main programinti:l=test();注意:动态链接库调用过程、函数时CALL方 式,创建时方式-样不写为_ c d e d,其它需要声明,(2)BCB 创建的 DLL 仃对应的输入接口库(import library)如只有 DLL 而无库时,可用 BCB 的 implib I:具产4.:implib xxx.lib xxx.dll 另外可用 tlib xxx.lib.xxx.lst产牛.DLL的内部函数列表,许多Windows的未公开技术就是用这种方法发现的.2.动态调用法动态调用法要用Windows A P I中 的LoadLibrary()fll GetProcAddress。来调入DLL库,指出库中函数位置,这种方法较常见.例程序如F:HINSTANCE dd;int _stdcall(*ddd)(void);dd=LoadUbrary(xxx.dir);ddd=GetProcAddress(dd,tesr);Caption=lntfbStr(dddO);FreeLibrary(dd);三、注意:创 建DLL时编译链接时注意设置Project Options?Packages 标签:去除 Builder with runtime packages 拉住Kt.Linker标签:去除Use dynamic RTL检杳机。否则创建的 DLL 需要 Runtime packages or Runtime library2、用C+Builder在WIN.INI中保存信息现在许多软件把程序中需要的数如;保存在注册表中,这样肖用户装的软件越来越多时,致使注册表越来越庞大,容易使系统出错。当然,微软也建议在注册表中保存数据但当我们需要保存的数据不多时完全可以把数据保存在WIN.INIW,这样可以很方便地维护,实现方法相时来说比较简单“下而我以BorlandC+Builder为例来说说如何实现。原理K实很简单,只需调用API的WriteProfileString和GetProfilelnt函数就可以了“这两个函数的原型是:BOOL WriteProfileStringfLPCTSTR lpAppName,LPCTSTR IpKeyName.LPCTSTR IpString);UINT GetProfilelnt(LPCTSTR IpAppName.LPCTSTR IpKeyName.INT nDefault);其 中IpAppName指在WINJNI中段的名字,即用口括起来的字符叫 IpKeyName指在这个段中每一个项目的名字,IpString指这个项目的值,即“=1后的数,nDefault为 当GetProfilelnt没 有 找 到IpAppName和IpKeyName时返网的值,即敏省他前者返问为布尔伊(true或false).后者返何为无符号整形值.当在WriteProfileString函 数 中IpKeyName为空(NULL)时,则消除这个段的全部内容,IpString为空时,则清除这一项目的内容,即这行将消除掉.下面举 例子来说明这两个函数的用法“新 建,个应用程序,在Form l上放两个Edit和.个Button.其 中Edit的Text为空,.个Button的Caption分别为添加、-件看、“消除,双击“添加”按钮加入卜面代码:WriteProfileString(“例子程序”,项 FT.Edit1-*Text.c_str();双击“查看 按钮加入如F代码:unsigned int Temp;Temp=GetProfilelnt(“例子程序,项目,100);Edit2 Text=lntToStr(Temp);双廿清除”按钮加入如卜代码:WriteProfileStringC1 例子程序.NULL.NULL):然后按F 9犍运行程序。F来 可 以 检 胺 卜 程 序 的 正 确 恨 在 E d itl中输入数字,短 32 6 5,按 添加-按钮,这时运行“sysedit来查看-W IN.INf文件的股后|川,可以看到加入了如下内容:例子程序项目=3265其中。和“=是函数自动加上的。按下“佟右 按钮,在 Edit2中出现*3265”,当按卜“消除 按钮可消除添加的部分。经过杳看可知程序已达到预期的H 的。喜爱编程的朋友可以把上述方法应用到自己的程序中去,来达到保存数据信息的作用.当确实要把信息保存到注册表中,可 以 在 C+Builder中定义个 TRegistry类的时象来进行相关的操作,或者直接调用Windows的 A P I函数,具体如何编程大家可以参阅相关资料或者同我联系。3、如 何 在 C+Builder中检测硬件在我们编写的程序中常隹要和硬件打交道,那么如何在程序中确定系统中是否仃该设备,它的运行状态乂是怎样的呢?对于初学者来说,这个问题常常不好解决,其实只需简单地利用儿个A P I函数.硬件的问题并不神秘”下面就让我们 起看看在C+Build e r中是如何检测硬件的.1.检 测 CPU的型号先让我们从殿简单的做起,看 下 自。的 C PU型号.首先,在 C+Builder中画出图1 所示的窗体,在下面的几个例子中我们将 直使川这个窗体作小范,它包括一个用来激活测试的Button和 个用来显示结果的Memo:我们可以用GetSystemlnfo这 个 A P I获得CPU的型号.将卜列代码添加到Button的 Click事件里就可以了:void _ fastcall TForm1:Button1Click(TObject,Sender)(获得C PU型号SYSTEM_INFO systeminfo;GetSystemlnfo(&systeminfo);Memo1-Lines,Add(您的 CPU 类型是:+String(systeminfo.dwProcessorTy pe);运行它,点击Test试试,CPU型号出来了吧!2.检测内存状态获得内存状态的方法和C P U 型号差不多,只是他用到的是另外 个 API:GlobalMe moryStatus.其 中,成 员 dwTotalPhys用来获笥物理内存总站而dwAvailPhys顾名思义是有效物理内存的意思。我们只要把卜面儿行代码加到上面程序的后面就可以了(不用重做,卜同):获行内存状态MEMORYSTATUS memory;memory.dwLength=sizeof(memory);初始化memory.dwLength=sizeof(memory):初始化GlobalMemoryStatus(&memory);Memo1-Lines-Add(您的物理内存:是(Mb):+String(int(memory.dw7btalPh ys/1024/1024);Memo1-Lines-Add(其中可用内存是(Kb):+String(int(memory.71024);怎么样,看出点门道了么?两段程序的格式儿乎 模 样.其 实,GetSystemlnfo和 GlobalMemoryStatus还可以获得许多其他仃关C PU和内存的信息.就按照上面的格式去套就行了,更详细的资料可以去看C+Builder4的 Help.3.检测可用硬盘空间好了,经过前而两个简单问题的热身,我们来处理一个稍微复杂的问题:我们知道安装程序大部仃个检测硬盘空间的过程,那么这是怎么实现的呢?他川到 的 是 A P I函数GetDiskFreeSpace,这个函数输入 个参数:目标盘的路径:返回四个参数,依次是每簇的扇区数、每扇区的字节数、空闲的簇数、总赧数。假如我们需要检测C 盘的总容址和可用容量,那么可以把以下代码加到上面的程序中:获得C 盘可用空间DWORD sector.byte.duster,free;long int freespace,totalspace;GetDiskFreeSpace(C:,§or.&byte,&free,&cluster);获得返回参数totalspace=int(cluster)*int(byte)*int(sector)/1024/1024;计 算总容:;freespace=int(free)*int(byte)*int(sector)/1024/1024;H 獴可JIJ空间Memo1-Lines-Add(C 盘总空间(Mb):+String(totalspace);Memo1-Lines-Add(,C 盘可川空间(Mb):-+String(freespace);怎么样?现在可以自己做安装程序了吧!4.检测 CD-ROM我们在编写程序时常常需要读取CD R O M 可是究竟哪 个盘符是光驱呢?有人是梃佛佛?是光驱呢?有人??揩坡后一个盘符当作光驱的,但是名遇到双光驱或者MO的情况时常常会出错。其实这个问题用 个API来解决并不困难,这就是:GetDriveType().这个函数返回 个0-6 之间的值,依次代表:0未知做、1 一不存在、2可移动磁盘、3固定破盘、4一网络破盘、5-CD-ROM,6内存虚拟盘.因此我们可以添加下面代码来J 找 CD-ROM:I I 获得CD-ROM信息UINT type;char name;for(name=C;name=Z;name+)循环检测 A-Z type=GetDriveType(String(name)+Smng(:).c_str();获得磁 盘类型if(type=5)Memo1-Lines-Add(您的光麻盘符为:+String(name);)得到光张盘符之后我们可以进一步利用API函数GetVolumelnformation检测光羯中是否有光盘,这个函数如果成功调用,会得到磁盘的卷标序列号等信息;如果调用失败则可知光驱中无光盘.程序如下:检测光盘(假设光驱为G:)char volname255,filename100;/buffer512;DWORD sno.maxl.fileflag;if(!(GetVolumelnformation(G:I volname,255,&sno,&maxl,&fileflag.filename,100)如果返何l值为假Memo1-Lines-Add(G驳中没有发现光盘)else如果返回值为其Memol-Lines-Add(G 典中光盘卷标为:+String(volname);Memo1-Lines-Add(G 眼中光盘序号为:+String(sno);)5.检测声K配置在编制多媒体程序时,我们常常会用到声音文件,而当这些程序在没有配置内卡的机器上运行时,我们应该给出必要的警告.对于声R的校测,可以分别通过 waveOutG etNumDevs。和 midiOutGetNumDevs()检测波形设备和 MIDI 设备,再利用 waveOutGetDevC aps()和 midiOutGetDevCaps()获得声i午设备的细节资札将下面一段代码加入上 面的程序即可,但要注意将#include添至程序首部:检测声卡int wavedevice,mididevice;WAVEOUTCAPS wavecap;MIDIOUTCAPS midicap;wavedevice=(int)waveOutGetNumDevs();波 形 设 备 信 息 mididevice=(int)midiOutGetNumDevs():MIDI 设 备 信 息mididevice=(int)midiOutGetNumDevs();II MIDI 设备信息if(wavedevice=0)Memo1-Lines-Add(没有发现波形设备);elsewaveOutGetDevCaps(0,&wavecap,szeof(WAVEOUTCAPS):Memol-Lines-Add(当旃波形设备:+String(wavecap.szPname);if(mididevice=O)Memol-Lines-Add(没有发现 MIDI 设备);elsemidiOutGetDevCaps(0,&midicap,sizeof(MIDIOUTCAPS);Memol9-Lines-Add(当前 MIDI 设备:+String(midicap.szPname);)6.检测品示器信息编写和图形图像仃关的程序时常常需要检测显示器的分辨率和色深,母后我们来看看这个问题的解决办法。分辨率的求法很简单.直接调用Screen对象的属性就行了而照求色深则要利用API函 数GetDeviceCaps获得每像素的比特数和色彩的页面数,然后计算2的“每像素的比特数”次程即得色彩的梯度数,再计算 色彩的梯度数”的“色彩的页面数次籍即得色深:程 序如F:检测显示器int tcs;long int bpp.cp.tc;Memo1-Lines-Add(%前.分辨率为:+String(Screen-Width)+-M+S tring(Screen-Height);bpp=GetDeviceCaps(Form1-Canvas-Handle.BITSPIXEL);bpp=GetDeviceCaps(Form1-Canvas-Handle.BITSPIXEL);tcs=pow(2,bpp);计算色彩的梯度数cp=GetDeviceCaps(Form1-Canvas-Handle,PLANES);tc=pow(tcs,cp);计?Z 色深Memol-Lines-Add(节前色深为:+String(tc):好了,现在在让我们点击一下Test吧,其实本文所涉及的API函数的功能不止这些,大家下去可以查一有Win32 API F册,或者直接在C+Builder 4中察看Help:相信自己开发个硬件检测软件也不是难驿哦!4、C+Builder如何响应消息及自定义消息Inprise(Borland)C+Builder 可以致在Delphi中一样响应消息,只是看起来要稍熨杂一点.对于系统已定义的消息,可以直接响应:#define WM_MY_OPEN_CMDLINE_FILE(WM_USER+1)迸程间通讯的自定义消息#define WM_MY_SEARCH_NODE(WM_USER+2)行找命令的|,|定义消息class TSomeForm:public TForm(类中的其它代码protected:消息的响应过程void _ fastcall OpenCmdLineFile(TMessage Message):void _ fastcall SearchDocumentNode(TMessage Message);void _ fastcall GetWindowMinMaxlnfo(TWMGetMinMaxlnfo Message);以下通过宏定义实现涧息的正确响战BEGIN_MESSAGE_MAPMESSAGE_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(TForm);/end class以下为实现代码void _ fastcall TSomeForm:OpenCmdLineFile(TMessage Message)直接通过消息结构传递参数LPSTR lpCmdLine=(LPSTR)Message.LParam;从 Message 中取得参数thiSHandleCmdLineFile(lpCmdLine);处理命令行的参数return;)void _ fastcall TSomeForm:SearchDocumentNode(TMessage Message)/响应依找消息/Message中的参数在此处不需要。this-SearchNode();return;)void _ fastcall TSomeForm:GetWindowMinMaxlnfo(TWMGetMinMaxlnfo Message)设置主窗口的至小尺寸MINMAXINFO,MinMaxlnfo=Message.MinMaxlnfo;MinMaxlnfo-ptMinTrackSize.x=400;MinMaxlnfo-ptMinTrackSize.y=300;return;其中:TMessage和TWMGetMinMaxInfo类型的定义可参见:C:Program FilesBorlandCBuilderinlucdevclMessages.hpp:.其它的消息响应方法与此相同。另外,可以为自定义的消息也定义 个对应的消息结构(如:TSearchNode_Message),至于如何定义消息结构,可以参考:C:Program FilesBorlandCBuilderinlucdevclMessages.hpp5、利 用C+Builder开发动画DLL我们在Windows98环 境F执行拷贝文件、杳找文件或计簿机等耗时比较长的操作时,Windows会显示 个小小的动画,指示正在进行的操作,与死板的静止图像相比增色不少.那么我们白已开发软件时,能否也U示 个 这 样 的 动 画 提 示 呢?我在开发个外贸应用软件系统时,遇到的数据量很大.当通过兔合条件直找时,因为不是数据阵表的每个项目都有索引,所以很费时,系统也会表现出长时间停顿,用户感觉极为不爽。我经过一段时间的探索,开发了 个能够在采用的开发环境PowerBuilder卜调用的动画D L L,由丁,采用多线程编程,PB调用的DLL函数能够及时将控制权交还为P B,不影响应用系统的运转.,用户能够看到个东西布动,也就不会想到系统是不是停止响应了,感觉时间也似乎没那么久了.代码与编译选项(1).在C+Builder的File菜雅卜.选择N ew.在New Item对话框的New属性中选择DLL,C+Builder就会创建个空白的DLL项目(2).6:File菜单 卜选 择New Form,C+Builder创建一个空臼的Form,修改它的属性为BorderStyle=bsDialogBordericons的子属性均为FalseFormStyle=fsStayOnTopPosition=poScreenCenterName=StatusForm(3)./h Form 上添加一个 Win32 F的 Animate 控件 Animatel,修改它的属性为 Align=allbp(4).在Form 上添加一个Standard卜 一 的 Button控件Button_Cancel.再添加System F的 Timer控件Timeri.设置定时Interval时间位2 5 0.以较快的响应用户的取消请求.因为PB应用系统与动湎窗体代码分别属F两个畿程,不能采用PB线程直接关闭动画窗体线程的窗口,否则会引起系统运行不正常,因此采用PB线程设置关闭标志,血动画线程采用Timer控件定时检查标志.检测到关闭标志,就关闭窗口,清除线程标志,结束动的线程。卜面给出编码及编码原理:1.DLL DLL主体代码:D LL卜:体 代 码,定义DLL公用变独*g_CommonAVI对Animate控件动画类型索引*gi_CanceledButton_Cancel按钮是否被选择过*gi_AVIType以显示的动画类型.由DLL输出函数做为参数输入*gi_RequestClose求动画线程关闭标志*gi_WindowActive动画窗口所处的状态*IpsWinTitle动画窗体的标题,由DLL输出函数做为参数输入7TCommonAVI g_CommonAVI=aviNone,aviFindFolder,aviFindFile.aviFindComputer,aviCopyFiles.aviCopyFile,aviRecycleFile,aviEmptyRecycle,aviDeleteFile);int gi_Canceled=O,gi_AVIType=O;int gi_RequestClose=0,gi_WindowActive=0;char lpsWinTitle256;HWND hWndParent=NULL;r定义DLL输出函数*/extern C _ declspec(dllexport)int pascal DIIEntryPoint(HINSTANCE hinst,unsigned long reason,void*);extern-C _ declspec(dllexport)intpascal ShowStatusWindow(int AVIType,LPSTR WinTitle.long hWnd);extern C _ declspec(dllexport)intpascal GetStatus(int ai_CloseWin);extern C _ declspec(dllexport)intpascal CloseStatusWindow();广定义线程TformThread:*/class TFormThread:public TThreadpublic:/User declarations_ fastcall TFormThread(bool CreateSuspended):void _ fastcall Execute(void););_ fastcall TFormThread:TFormThread(bool CreateSuspended):TThread(CreateSuspended)厂动画线程执行代码,动画窗体的定时器控件会关闭它,清除窗体存在标忐后结束线程的运行7void _ fastcall TFormThread:Execute(void Xgi_WindowActive=1;StatusForm=new TStatusForm(NULL);StatusForm-Caption=lpsWinTitle;StatusForm-ShowModal();gi_WindowActive=0;delete StatusForm;gi_RequestClose=0;)/定义一个线程实例指针/TFormThread*FormThread;/*,*输出函数代码实现部分,DIIEntryPoint 32 位 DLL 入口“ShowStatusWindow 整示动画窗口,它通过创建个线程来创建窗口,避免由于窗口的MODAL属性而使控制权不能及时的返还给调用者 GetStatus取得“取消”状态,即用户有没仃选择“取消”按钮,CloseStatusWindow 关闭动画窗口,7_ declspec(dllexport)int WINAPI DIIEntryPoint(HINSTANCE hinst,unsigned long reason,void*)return 1;_ declspec(dllexport)int pascalShowStatusWindow(int AVIType.LPSTRWinTiUe.long hWnd)hWndParent=(HWND)hWnd;memset(lpsWinTitle,0,sizeof(lpsWinTitle):stmcpy(l psWinTitle,W inTitle,sizeof(lpsWinTitie)-1);if(AVIType 0&AVITypePriority=tpNormal;FormThread-Resume();)_ declspec(dllexport)int pascalGetStatus(int ai_CloseWin)if(gi_Canceled)if(gi_WindowActiveXgi_RequestClose=1;while(gi_ReCommonAVI=g_CommonAVIgi_A/IType;Animatel-Active=true;)/-extern int gi_RequestClose;/定时器事件检测到结束标志关闭窗体void _ fastcall TStatusForm:Timer1Timer(TObject,Sender)(if(gi_RequestCloseXModalResult=mrOk;)II-(5)没置编译选项:Project-Options打开Project Options对话框,消除Linker星件页中的Use Dynamic RTL标段 清除Packages属性羽中的Build withruntime packages,这样只耍整个DLL就可以运行了,而不必安装 些动态连接运行时间阵“使用动画DLL上面编译出DLL可以由箕它任何开发语言调用.下面给出在PB中的使用方法。(1)定义:/Declare-Global External FunctionsFUNCTION Long ShowStatusWindow(LongAVIType,String WinTitleJong hWnd)&LIBRARY STATWIN.DLL ALIAS FOR ShowStatusWindowFUNCTION Long GetCancelStatus(Long CloseWindow)&LIBRARY STATWIN.DLL ALIAS FOR GetStatusFUNCTION Long CloseStatusWindow()&LIBRARY-STATWIN-DLL ALIAS FOR CloseStatusWindow-调用:long ll_EndTime显示查找文件夹动画ShowStalusWindow(2)setpointer(HourGlass!)II.EndTime=Cpu()+10*1000DOif GetCancelStatus(0)=1 thenexitend ifH做想做的事情LOOP UNTIL cpu()$#62;ll_EndTimeCloseStatusWindow()6、用C+Builder 3制作屏幕保护程序屏幕保护程序是以scr为扩展名的标准Windows可执行程序,在激活控制面板的显示器属性的解板呆护程序页时,该模块会自动在Windows用动目录(Windows目录和系统目录)卜一杳找扩展名是scr的基于Windows的可执行文件。使用屏幕保护程序,不仅可以延长显示曙的使用寿命,还可以保护私人信息。编洞屏修保护程序不仅要涉及消息的处理,还要涉及命令行参数的处理.在WIN32SDK文档中描述了编制战WIN32的标准的屏幕保护程序所必须遵守的严格标准:按照这咚标准,屏幕保护程序必须要输出两个函数:ScreenSaverProc fll ScreenSaverConfigureDialog,但是,在Windows系统中的很多屏幕保护程序并没有遵循这些标准(使用Impdef或 否tdump实 用 .具查看即可).并且使用该文档中介绍的方法编写解整保护程序.不仅要使用资源编辑器,并且在链接时还要利用Scrsaver.lib文 件(在C+Builder3环境下,不能成功连接)。不仅要涉及消息的处理,还要涉及命令行参数的处理:C*+Builder3是 种 快 速 的 应 用 程 序 开 发 艮,提供了许多类型的应用程序开发模板,但没仃提供开发屏幕保护程序的模板,井且在其在线帮助中也没有提及如何开发这类应用程序。经过木人的研究,找到了用C+Builder3编制屏幕保护程序的方法。在控制面板的”显示器属性 项的 解密保护程序”页中进行设置时.要遇到:.种类型的命令行参数并且,各种情况卜的屏幕保护程序的显示结果也各不相同,般来讲,就需要:种类里的宙体(或两种,花随后的内容中讨论)。人而将分四步来具体地说明如何编制解落保护程序。一、屏幕保护程序的选择如果花标题为 屏粒保护程序-的卜-拉列表框中选中了某个保护程序时,系统会白动启动该程序,这个程序的显示范围是在这个页面1:的显示潴图形的屏群能网 同 时,会将两个命令行参数;个是p:另 个是显示窗I 的句柄传递给这个被选中的程序 因此这类程序首先应该能够处理命令行参现在C+Builder3中,与命令行参数处理有关的函数是:ParamCount()ffi ParamStr().具体的申明方式如F:1.extemPACKAGEint_fastcallParamCount(void);该函数返回命令行参数的个数,但不包含应用程序本身-2.externPACKAGEAnsiString_ fastcallParamStr(intlndex);该函数返回指定索弓I值的命令行参数。ParamStr(O)返回的是应用程序本身.所以,在这以步骤中的参数判断的i千句如下:if(UpperCase(ParamStr(1)=-p|UpperCase(ParamStr(i)=7p)(/addthecodeinhere)在完成了参数判断后,就应该对显示窗口的处理,为能够使程序在显示器图形的屏密区域内显示,就要状新设置程序的父窗口和整示区域,这要涉及到父腐口句柄的获得及父商U的 设 置,以 及A P I函数的调用。这种环境下的父窗I句柄就是传递过来的第个命令行参数:要设置父窗口,只褥设置窗体的Parentwindow展性即可,这段程序如K:RECTrc;/Line1HWNDhWnd=(HWND)(atol(ParamStr(2).c_str()y/Line2:GetClientRect(hWnd.&rc);/Line3ParentWindow=hWnd;/Line4Left=rc.left;/Line5Tbp=rc.top;/Line6Width=rc.right-rc.left;/Line7Height=rc.bottom-rc.top;/Line8在上面的程序片段中,第2行语句是将传递过来的第2个参数转换成窗口句柄:然后,第3行语句利用这个窗口句柄,调用API函数以获得该窗口的客户区域:第4行语句将选中的屏幕保护程序的父窗口设置为指定的窗口:余下的语句是将该程序的窗口大小设苴成副窗I的客户区大小。这一程序片段的位置应该是在窗体的OnCreate事件处理中.需要说明的是,这种类型(包括第三步介绍的窗体)的窗体样式应是:FormStyle=fsStayOnTop;窗体边界的样式应为:BorderStyle=bsNone;当然,这时也不需要鼠标图形,因此,可以符鼠标的形状设为crNone:Cursor=crNone;.、初始化参数的设置单击 显示器属性 帙块的 屏幕保护程序 页面中的 设置 按钮时,系统会宿动指定的保护程序的初始值设置对话框,这时传递过来的命令行参数是:心 或 Y(参数的处理与前面介绍的相同)。通过该对话框,可以设置保护程序的 芈初始参数,比如图形的变化快悔等。在这段程序中,还要涉及到初始化文件或注册表的读写,用以记录初始化参数,便于保护程序启动时使用.三、预览及运行预览的效果就是解幕保护程序被激活后的显示“单击单击”圾示器屈性 模块的 解窑保护程序 页曲中的 预览 按钮,就可以观察保护程序运行的实际效果.这时,系统启动该程序时传递过来的命令行参数是:=s 1或-S