C++Builder资料库.pdf

上传人:文*** 文档编号:89819745 上传时间:2023-05-13 格式:PDF 页数:115 大小:14.22MB
返回 下载 相关 举报
C++Builder资料库.pdf_第1页
第1页 / 共115页
C++Builder资料库.pdf_第2页
第2页 / 共115页
点击查看更多>>
资源描述

《C++Builder资料库.pdf》由会员分享,可在线阅读,更多相关《C++Builder资料库.pdf(115页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、1.怎样在C+Build er中创建使用DLL2.用C+Bulid er在 WIN.INI中保存信息3.如何在C+Build er中检测硬件4.C+Build er如何响应消息及自定义消息5,利用C+Build er开发动画DLL6.用C+Build er 3 制作屏幕保护程序7.TCP/IP头格式8.UDP9.判断wind ows的 Desktop及其它目录10用 C+Build er创建数字签名11用 Enter键控制焦点切换的方法12.拦截 Wind ows消 息13.使用 CommaText14.程序开始时先显示信息框15.怎样获取程序的命令行参数?16.如何监视剪贴板17.如何使用O

2、nld le事件18.用C+Build er编写串行异步通信程序19.C+BUILDER非可视组件的消息处理技巧20.用C+Build er建立数据库VCL使用经验21.用C+Build er创建基于Internet的点对点Chat22.用C+Build er获取应用程序图标23.BIG5到 G B的转换技术24.C+BUILDER让你的任务栏图标动起来25.TFORM26.用BCB在 wind ows桌面创建快捷方式27.读磁片磁区28.1/0 端口读写的实现29.检测鼠标位置30.令 W in32应用程序跳入系统零层31.如何取得Memo的行和列32.使用 Sockets33.Wind o

3、ws95/98下怎样隐藏应用程序不让它出现在CTRL-ALT-DEL对话框中?34.怎样隐藏应用程序的任务条图标35.编写自己的Ping.exe程序36.用 C+Build er 在 WINNT 下编制一个 Service37.如何在C+BUILDER中自动关闭WINDOWS屏保38.显示/隐藏任务栏图标39.信箱监视程序4O.C+Build ing 制作闹钟41.拨号上网IP 地址的检知42.用 C+Build er 编写 Tray 程序43.怎样用代码来最小化或恢复程序44.制作主窗口显示前的版权窗口45.判断是否己经联到internet46.获取登陆用户名47.隐臧桌面图标48.程序启动

4、时运行49.控制面板的调用50.模拟键盘按键51.让标题栏闪烁52.启动屏幕保护53.年月日星期的取法54.键盘事件55.隐藏任务栏56.禁止关机57.怎样以最小化方式启动程序58.在Memo中增加一 行 后,如何使最后一行能显不59.设置壁纸方法怎样在C+Build er中创建使用DLL自从C+Build er从去年浪漫情人节上市以来,吸引了大量的Delphi、VC、Vb的程序员到它的怀抱,大量的C、C+程序员感叹道:总算有了 C 的可视化开发工具,对我也是一样,从 BC、Delphi 到 C+Build er。动态链接库(DLL)是 Wind ows编程常遇到的编程方法,下面我就介绍一下在

5、BCB(C+Build er下简称B C B)中如何创建使用DLL和一些技巧。一、创建:使用BCB FilelNEW建立一个新的DLL工程,并保存好文件B C B,生成个 DLL的程序框架。1.DHEntryPoint函数为一个入口方法,如果使用者在DLL被系统初始化或者注销时被调用,用来写入对DLL的初始化程序和卸载程序;参数:hinst用来指示DLL的基地址;reason用来指示DLL的调用方式,用于区别多线程单线程对DLL的调用、创建、卸载DLL;2.在程序中加入自己所要创建的DLL过程、函数;3.用 d llimport 描述出口;例程序如下:#includ e#pragma hd r

6、stopextern 擎?_d eclspec(d llexport)int test();int WIN API DllEntryPoi nt(HINSTAN CE hinst,unsigned long reason,void *)(return 1;)int test()(return 3;)注意:动态链接库中调用过程、函数时有不同的C A LL方式 _cd ecl、_pascal,_ fastcall _ std call,BCB中默认的方式为_cd ecl(可不写),如果考虑兼容性可用时_std call声明方法为:extern 挈?_d eci spec(d l lexport)i

7、nt _ std call test();对于其中过程、函数也改为:int_ std call test()二、使用DLL在 BCB中使用DLL有两种方法:1.用静态调用法首先需要在BCB的项目中加入输入接口库(import library),打开工程项目,使 用 BCBViewlProject Manager打开项目列表,向项目中加入接口库(*Jib)。其次在头文件中加入接口声明。例程序如下:/d efine in includ e fileextern 掣?_d eclspec(d llimport)int _ cd ecl test();/use function in main pro

8、gramint I;I=test();注意:(D动态链接库调用过程、函数时CALL方式与创建时方式一样不写为_ c d e c l,其它需要声明。BCB创建的DLL有对应的输入接口库(import library),如只有DLL而无库时,可用BCB的 implib 工具产生:implib xxx.lib xxx.d ll;另外可用:tlib xxx.lib,xxx.lst 产生 DLL 的内部函数列表,许多Wind ows的未公开技术就是用这种方法发现的。2.动态调用法动态调用法要用Wind ows A P I中的Load LibraryO和 GetProcAd d ress。来调入DLL库,

9、指出库中函数位置,这种方法较常见。例程序如下:H1NSTANCE d d;int _std call(*d d d)(void);d d=Load Library(I xx.d ll?;d d d=GetProcAd d ress(d d,est?;C 叩 tion=InlToStr(d d d();FreeLibrary(d d);三、注意:创建DLL时编译链接时注意设置Project OptionsoPackages 标签:去除 Build er with runtime packages 检查框。Linker标签:去除Use d ynamic RTL检查框。否则创建的 DLL 需要 Ru

10、ntime packages or Runtime libraryo用 C+Bulid er在 WIN.INI中保存信息现在许多软件把程序中需要的数据保存在注册表中,这样当用户装的软件越来越多时,致使注册表越来越庞大,容易使系统出错。当然,微软也建议在注册表中保存数据,但当我们需要保存的数据不多时完全可以把数据保存在WIN.INI中,这样可以很方便地维护,实现方法相对来说比较简单。下面我以Borland C+Build er为例来说说如何实现。原理其实很简单,只需调用API的 WriteProfileString和 GetProfilelnt函数就可以了。这两 个 函 数 的 原 型 是:BO

11、OL WriteProfi leStri ng(LPCTSTR lpAppName,LPCTSTRlpKeyName,LPCTSTR IpString);UINT GetProfileInt(LPCTSTR IpAppName,LPCTSTR IpKeyNameJNT nDefault);其 中 IpAppName指 在 WIN.INI中段的名字,即用口括起来的字符串,IpKeyName指在这个段中每一个项目的名字,IpString指这个项目的值,即“=”后的数,nDefault为当GetProfilelnt没有找到IpAppName和 IpKeyName时返回的值,即缺省值,前者返回为布尔值

12、(true或 false),后者返回为无符号整形值。当在WriteProfileString函数中IpKeyName为空(NULL)时,则清除这个段的全部内容,IpString为空时,则清除这一项目的内容,即这一行将清除掉。下面举例子来说明这两个函数的用法。新建一个应用程序,在 Form l上放两个Ed it和三个Button,其中Ed it的Text为空,三个Button的 Caption分别为“添加”、“查看”、“清除”。双 击“添加”按钮加入下面代码:WriteProfileString(例子程序,项目,Ed itl-Text.c_str();双 击“查看”按钮加入如下代码:unsign

13、ed int Temp;Temp=GetProfileInt(例子程序,项目,100);Ed it2-*Text=IntToStr(Temp);双 击“清除”按钮加入如下代码:WriteProfileString(“例子程序”,NULL,NULL);然后按F9键运行程序。下来可以检验一下程序的正确性。在 E d itl中输入数字,如“3265”,按“添加”按钮,这时运行“sysed it”来 查 看“WIN.INI”文件的最后面,可以看到加入了如下内容:例子程序项目=3265其 中“口”和“=”是函数自动加上的。按 下“查看”按钮,在 Ed it2中出现“3265”,当按下“清除”按钮可清除添

14、加的部分。经过查看可知程序已达到预期的目的。喜爱编程的朋友可以把上述方法应用到自己的程序中去,来达到保存数据信息的作用。当确实要把信息保存到注册表中,可以在C+Build er中定义一个TRegistry类的对象来进行相关的操作,或者直接调用Wind ows的 API函数,具体如何编程大家可以参阅相关资料或者同我联系。如何在C+Build er中检测硬件在我们编写的程序中常常要和硬件打交道,那么如何在程序中确定系统中是否有该设备,它的运行状态又是怎样的呢?对于初学者来说,这个问题常常不好解决,其实只需简单地利用几个API函数,硬件的问题并不神秘。下面就让我们一起看看在C+Build er中是如

15、何检测硬件的。1.检测CPU的型号先让我们从最简单的做起,看一看自己的CPU型号。首先,在 C+Build er中画出图 1所示的窗体,在下面的儿个例子中我们将一直使用这个窗体作示范,它包括一个用来激活测试的Button和一个用来显示结果的M emoo我们可以用GetSystemlnfo这 个 A PI获得CPU的型号。将下列代码添加到Button的 Click事件里就可以了:void _ fastcall TForml:Button lClick(TObject*Send er)(获得CPU型号SYSTEMJNFO systeminfo;GetSystemlnfo(&systeminfo);

16、Memo 1 -*Lines-A dd(腌 PU 类型是:克攵旅 tring(systeminfo.d wProcessorType);)运行它,点击Test试试,CPU型号出来了吧!2.检测内存状态获 得 内 存 状 态 的 方 法 和 C P U 型号差不 多,只 是 他 用 到 的 是 另 外 一 个 API:GlobalMemoryStatuso其中,成员d wTotalPhys用来获得物理内存总量,而 d wAvailPhys顾名思义是有效物理内存的意思。我们只要把下面几行代码加到上面程序的后面就可以了(不用重做,下同):获得内存状态MEMORYSTATUS memory;memor

17、y.d wLength=sizeof(memory);初始化GlobalMemoryStatus(&memory);Memo 1 Lines-*Ad d(S 奈锢祚i圭姗?Mb):敢旅 tring(int(memory.d wTotalPhys/1024/1024);Memol Lines-Ad d(携渲锌捎媚诜娥?Kb):敢象 tring(int(memory./1024);怎 么 样,看 出 点 门 道 了 么?两 段 程 序 的 格 式 几 乎 一 模 一 样,其 实,GetSystemlnfoGlobalMemoryStatus还可以获得许多其他有关CPU和内存的信息,就按照上面的格式

18、去套就行了,更详细的资料可以去看C+Build er4的 Help。3.检测可用硬盘空间好了,经过前面两个简单问题的热身,我们来处理个稍微复杂的问题:我们知道安装程序大都有一个检测 硬 盘 空 间 的 过 程,那么这是怎么 实 现 的 呢?他 用 到 的 是 A P I函数GetDiskFreeSpace,这个函数输入一个参数:目标盘的路径;返回四个参数,依次是每簇的扇区数、每扇区的字节数、空闲的簇数、总簇数。假如我们需要检测C 盘的总容量和可用容量,那么可以把以下代码加到上面的程序中:获得C 盘可用空间DWORD sector,byte,cluster,free;long int frees

19、pace,total space;GetDiskFreeSpace(S:?§or,&byte,&free,&cluster);/获得返回参数totalspace=int(cluster)*int(byte)*int(sector)/1 024/1024;/计算总容量freespace=int(free)*int(byte)*int(sector)/1024/1024;/计算可用空间Memol fL in e sf Ad d(掣盘总空间(Mb):敷旅 tring(totalspace);Memol Linesf Ad d(擎盘可用空间(Mb):兑 攵 皴 tring(freespace)

20、;怎么样?现在可以自己做安装程序了吧!C+Build er如何响应消息及自定义消息Inprise(Borland)C+Build er I1,可以象在Delphi中一样响应消息,只是看起来要稍复杂一点。对于系统已定义的消息,可以直接响应:#d efine WM_MY_OPEN_CMDL1NE_FILE(WM_USER+1)/进程间通讯的自定义消息#d efine WM_MY_SEARCH_NODE(WM_USER+2)查找命令的自定义消息class TSomeForm:public TForm(类中的其它代码protected:消息的响应过程void _ fastcall OpenCmd Li

21、neFile(TMessage Message);void _ fastcall SearchDocumentNod e(TMessage Message);void _ fastcall GetWind owMinMaxInfo(TWMGetMinMaxInfo Message);以下通过宏定义实现消息的正确响应BEGIN_MESSAGE_MAPMESSAGE_HANDLER(WM_MY_OPEN_CMDLINE_FILE,TMessage,OpenCmd LineFile)MESSAGE_HANDLER(WM_MY_SEARCH_NODE,TMessage,SearchDocumentNo

22、d e)MESSAGE_HANDLER(WM_GETMINMAXINFO,TWMGetM inMaxinfo,GetWind owMinMaxIn fo)END_MESSAGE_MAP(TForm);/end class以下为实现代码void _ fastcall TSomeForm:OpenCmd LineFile(TMessage Message)直接通过消息结构传递参数LPSTR lpCmd Line=(LPSTR)Message.LParam;从 Message 中取得参数thisHand leCmd LineFile(lpCmd Line);处理命令行的参数return;)void

23、_ fastcall TSomeForm:SearchDocumentNod e(TMessage Message)响应查找消息/Message中的参数在此处不需要。this-SearchNod e();return;)void _ fastcall TSomeForm:GetWind owMinMaxInfo(TWMGetMinMaxInfo Message)设置主窗口的最小尺寸MINMAXINFO*MinMaxInfo=Message.MinMaxInfo;MinMaxInfo-ptMinTrackSize.x=400;MinMaxInfo-ptMinTrackSize.y=300;ret

24、urn;)其中:TMessage和 TWMGetMinMaxInfo类型的定义可参见:C:Program FilesBorland CBuild erinlucd evclMessages.hpp;其它的消息响应方法与此相同。另外,可以为自定义的消息也定义,个对应的消息结构(如:TSearchNod e_Message),至于如何定义消息结构,可以参考:C:Program FilesBorland CBuild erinlucd evclMessages.hpp利用C+Build er开发动画DLL我们在Wind ows98环境下执行拷贝文件、查找文件或计算机等耗时比较长的操作时,Wind o

25、ws会显示一个小小的动画,指示正在进行的操作,与死板的静止图像相比增色不少。那么我们自己开发软件时,能否也显示一个这样的动画提示呢?我在开发一个外贸应用软件系统时,遇到的数据量很大,当通过复合条件查找时,因为不是数据库表的每个项目都有索弓 I,所以很费时,系统也会表现出长时间停顿,用户感觉极为不爽。我经过一段时间的探索,开发了一个能够在采用的开发环境PowerBuild er下调用的动画D L L,由于采用多线程编程,PB调用的DLL函数能够及时将控制权交还为P B,不影响应用系统的运转。用户能够看到一个东西在动,也就不会想到系统是不是停止响应了,感觉时间也似乎没那么久了。代码与编译选项(1)

26、在 C+Build er的File菜单下选择New,在New Item对话框的New属性中选择DLL,C+Build er就会创建一个空白的DLL项目。(2)在 File菜单下选择New Form,C+Build er创建一个空白的Form,修改它的属性为Bord e rStyle=bsDialogBord ericons的子属性均为FalseFormStyle=fsStayOnTopPosition=poScreenCenterName=StatusForm(3)在 F orm 上添加-一个Win32下的Animate控件Animate 1,修改它的属性为Align=alTop(4)在 Fo

27、rm上添加一个Stand ard 下的Button控 件 Button_CanceL再添加System下的Timer控件Timer 1,设置定时Interval时间位2 5 0,以较快的响应用户的取消请求。因为PB应用系统与动画窗体代码分别属于两个线程,不能采用PB线程直接关闭动画窗体线程的窗口,否则会引起系统运行不正常,因此采用PB线程设置关闭标志,而动画线程采用Timer控件定时检查标志,一旦检测到关闭标志,就关闭窗口,清除线程标志,结束动画线程。下面给出编码及编码原理:1.DLL DLL主体代码:*DLL主体代码*定义DLL公用变量*g_CommonAVI对 Animate控件动画类型索

28、引*gi_CanceledButton_Cancel按钮是否被选择过*gi_AVIType要显示的动画类型,由 DLL输出函数做为参数输入*gi_RequestClose请求动画线程关闭标志*gi_Wind owActive动画窗口所处的状态*IpsWinTitle动画窗体的标题,由DLL输出函数做为参数输入*/TCommonAVI g_CommonAVI|=aviNone,aviFind Fold er,aviFind File,aviFind Computer,aviCopyFiles,aviCopyFile,aviRecycleFile,aviEmptyRecycle,aviDelete

29、File);int gi_Canceled=O,gi_AVIType=O;int gi_RequestClose=0,gi_Wind owActive=0;char lpsWinTitle256;HWND hWnd Parent=NULL;/*定义D LL输出函数*/extern C _ d eclspec(d llexport)int pascal DllEntryPoint(HINSTANCE hinst,unsigned long reason,void*);extern”C d eclspec(d llexport)intpascal ShowStatusWind ow(int AVI

30、Type,LPSTR WinTitleJong hWnd);extern _ d eclspec(d llexport)intpascal GetStatus(int ai_CloseWin);extern Cd eclspec(d llexport)intpascal CloseStatusWind ow();/*定义线程 TformThread:*/class TFonnThread :public TThread public:/User d eclarationsfastcall TFormThread(bool CreateSuspend ed);void _ fastcall Ex

31、ecute(void););fastcall TFormThread:TFormThread(bool CreateSuspend ed):TThread(CreateSuspend ed)/*动画线程执行代码,动画窗体的定时器控件会关闭它,清除窗体存在标志后结束线程的运行*/void _ fastcall TFormThread:Execute(void)gi_Wind owActive=l;St atu sForm=ne w TStatus Form(N U LL);StatusForm-Caption=lpsWinTitle;StatusForm-ShowMod al();gi_Wind

32、 owActive=0;d elete StatusForm;gi_RequestClose=0;)/*定义一个线程实例指针*/TFormThread *FormThread;*输出函数代码实现部分*DllEntryPoint 32 位 DLL 入 口*ShowStatusWind ow 显示动画窗口,它通过创建一个线程来创建窗口,避免由于窗口的 MODAL属性而使控制权不能及时的返还给调用者*GetStatus取得搠/廨状态,即用户有没有选择摘N廨按钮*CloseStatusWind ow 关闭动画窗口,*/d eclspec(d llexport)int WINAPI DllEntryPo

33、int(HINSTANCE hinst,unsigned long reason,void*)(return 1;)_ d eclspec(d llexport)int pascalShowStatusWind ow(int AVIType,LPSTRWinTitleJong hWnd)hWnd Parent=(HWND)hWnd;memset(lpsWinTitle,0,sizeof(lpsWinTitle);strncpy(lpsWinTitle,WinTitle,sizeof(lpsWinTitle)-l);if(AVIType 0&AVITypePriority=tpNormal;Fo

34、rmThread-Resume();)_ d eclspec(d llexport)int pascalGetStatus(int ai_CloseWin)if(gi_Canceled)if(gi_Wind ow Active)gi_RequestClose=1;while(gi_RequestClose);)return gi_Canceled;d eclspec(d llexport)int pascalCloseStatusWind ow()if(gi_Wind owActive)gi_RequestClose=1;while(gi_RequestClose);)return gi_Ca

35、nceled;)2.窗体StatusForm的代码:TStatusForm*StatusForm;/-extern int gi_Canceled;extern int gi_AVIType;extern TCommonAVI g_CommonAVI;fastcall TStatusForm:TStatusForm(HWND Parentwind ow):TForm(ParentWind ow)(gi_Canceled=O;/-取消按钮并不直接关闭窗体,而指示设置取消标志,供调用者查看void _ fastcall TStatusForm:Button_CancelClick(TObject*

36、Send er)(gi_Canceled=1;/Mod alResult=mrCancel;)/-激活动画,在 FORMCREATE事件中void _ fastcall TStatusForm:FormCreate(TObject*Send er)(Animate 1 -CommonAVI=g_CommonAVIgi_AVIType;Animate 1-Active=true;/-extern int gi_RequestClose;/定时器事件检测到结束标志关闭窗体void _ fastcall TStatusForm:Timer 1 Timer(TObject Send er)if(gi_

37、RequestClose)Mod al Result=mrOk;)/-(5)设置编译选项:Project-Options打开Project Options对话框,清 除 Linker属性页中的 Use Dynamic RTL 标志,清除 Packages 属性虫中的 Build with runtime packageso 这样只要单个DLL就可以运行了,而不必安装一些动态连接运行时间库。使用动画DLL上面编译出DLL可.以由其它任何开发语言调用,下面给出在PB 中的使用方法。(1)定义:/Declare-Global External FunctionsFUNCTION Long ShowS

38、tatusWind ow(LongAVIType,String WinTitleJong hWnd)&LIBRARY STATWIN.DLL1 ALIAS FOR nShowStatusWind owHFUNCTION Long GetCancelStatus(Long Close Wind ow)&LIBRARY“STATWIN.DLL”ALIAS FOR nGetStatusnFUNCTION Long CloseStatusWind ow()&LIBRARY“STATWIN.DLL”ALIAS FOR HCloseStatusWind owH(2)调用:long ll_End Time显

39、示查找文件夹动画ShowStatus Wind ow(2)setpointer(HourGlass!)ILEnd Time=Cpu()+10*1000DOif GetCancelStatus(O)=1 thenexitend if/做想做的事情LOOP UNTIL cpu()ILEnd TimeCloseStatusWind ow()用 C+Build er 3 制作屏幕保护程序屏幕保护程序是以scr为扩展名的标准Wind ows可执行程序,在激活控制面板的显示器属性的 屏幕保护程序 页时,该模块会自动在Wind ows启动目录(Wind ows目录和系统目录)下查找扩展名是scr的基于Win

40、d ows的可执行文件。使用屏幕保护程序,不仅可以延长显示器的使用寿命,还可以保护私人信息。编制屏幕保护程序不仅要涉及消息的处理,还要涉及命令行参数的处理。在 WIN32SDK文档中描述了编制基于WIN32的标准的屏幕保护程序所必须遵守的严格标准。按照这些标准,屏幕保护程序必须要输出两个函数:ScreenSaverProc和 ScreenSaverConfigureDialog,但是,在 Wind ows系统中的很多屏幕保护程序并没有遵循这些标准(使用impd ef或者td ump实用工具查看即可)。并且使用该文档中介绍的方法编写屏幕保护程序,不仅要使用资源编辑器,并且在链接时还要利用Scrs

41、aver.lib文 件(在 C+Build er3环境下,不能成功连接)。不仅要涉及消息的处理,还要涉及命令行参数的处理。C+Build er3是一种快速的应用程序开发工具,提供了许多类型的应用程序开发模板,但没有提供开发屏幕保护程序的模板,并且在其在线帮助中也没有提及如何开发这类应用程序。经过本人的研究,找到了用C+Build er3编制屏幕保护程序的方法。在控制面板的 显示器属性”项的 屏幕保护程序”页中进行设置时.,要遇到三种类型的命令行参数,并且,各种情况下的屏幕保护程序的显示结果也各不相同,一般来讲,就需要三种类型的窗体(或两种,在随后的内容中讨论)。下面将分四步来具体地说明如何编制

42、屏幕保护程序。一、屏幕保护程序的选择如果在标题为 屏幕保护程序”的下拉列表框中选中了某个保护程序时,系统会自动启动该程序,这个程序的显示范围是在这个页面上的显示器图形的屏幕范围,同时,会将两个命令行参数:一个是/p:另一个是显示窗口的句柄,传递给这个被选中的程序。因此,这类程序首先应该能够处理命令行参数。在 C+Build er3中,与命令行参数处理有关的函数是:ParamCount()和 ParamStr。,具体的申明方式如下:1.externPACKAGEint_ fastcallParamCount(void);该函数返回命令行参数的个数,但不包含应用程序本身。2.externPACKA

43、GEAnsiString_fastcallParamStr(intlnd ex);该函数返回指定索引值的命令行参数。ParamStKO)返回的是应用程序本身。所以,在这以步骤中的参数判断的语句如下:if(UpperCase(ParamStr(1 )=-pIIUpperCase(ParamStr(i)=/p)(/ad d thecod einhere)在完成了参数判断后,就应该对显示窗口的处理,为能够使程序在显示器图形的屏幕区域内显示,就要重新设置程序的父窗口和显示区域。这要涉及到父窗口句柄的获得及父窗口的设置,以 及 A P I函数的调用。这种环境下的父窗口句柄就是传递过来的第二个命令行参数;

44、要设置父窗口,只需设置窗体的Parent Wind ow属性即可。这段程序如下:RECTrc;/LinelHWNDhWnd=(HWND)(at ol(ParamStr.c_str();/Li ne2:GetClientRect(hWnd,&rc);/Line3Paren t Wi nd o w=h Wnd ;/Line4Left=rc.left;/Line5Top=rc.top;/Line6Wid th=rc.right-rc.left;/Line7Height=rc.bottom-rc.top;Line8在上面的程序片段中,第 2 行语句是将传递过来的第2 个参数转换成窗口句柄;然后,第 3

45、 行语句利用这个窗口句柄,调 用 A PI函数以获得该窗口的客户区域;第 4 行语句将选I 的屏幕保护程序的父窗口设置为指定的窗口;余下的语句是将该程序的窗口大小设置成副窗口的客户区大小。这一程序片段的位置应该是在窗体的OnCreate事件处理中。需要说明的是,这种类型(包括第三步介绍的窗体)的窗体样式应是:FormStyle=fsStayOnTop;窗体边界的样式应为:Bord e rStyle=bsNone;当然,这时也不需要鼠标图形,因此,可以将鼠标的形状设为crNone:Cursor=crNone;二、初始化参数的设置单击”显示器属性 模块的 屏幕保护程序”页面中的“设置 按钮时,系统

46、会启动指定的保护程序的初始值设置对话框,这时传递过来的命令行参数是:/C或-c(参数的处理与前面介绍的相同)。通过该对话框,可以设置保护程序的一些初始参数,比如图形的变化快慢等。在这段程序中,还要涉及到初始化文件或注册表的读写,用以记录初始化参数,便于保护程序启动时使用。三、预览及运行预览的效果就是屏幕保护程序被激活后的显示。单击单击 显示器属性 模块的 屏幕保护程序”页面中的“预览 按钮,就可以观察保护程序运行的实际效果。这时,系统启动该程序时传递过来的命令行参数是:“/s或-s“。对于命令行参数的处理与前面的步骤相同,但在这 一 步 中,还 要 对 几 个 消 息 进 行 处 理,这 些

47、消 息 是:WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_MBUTTONDOWN,WM_RBUTTONDOWN,WM_KEYDOWN,WM_ACTIVATE。对 WM_MOUSEMOVE 和 WM_ACTIVATE 消息的处理形式如下:void _ fastcallHand leSomeMessage(TMessage&Msg)switch(Msg.Msg)/caseWM_ACTIVATE:if(Msg.WParamLo=WA_INACTIVE)Close();break;caseWM_MOUSEMOVE:if(Old MouseX=-l&Old MouseY=-l)/Inth

48、econstructor,Old MouseXandOld MouseY mustbeinitialized by-1.Old MouseX=Msg.LParamLo;Old MouseY=Msg.LParamHi;)elseif(Old MouseX!=Msg.LParamLoIIOld Mouse!=Msg.LParamHi)Close();break;对于其他的消息仅仅是调用Close。函数来关闭应用程序即可。应用这种消息处理方式时,必须要类定义时进行消息映射.,不然的话,就要在相应的消息响应中进行处理(使用一定的布尔变量,就可以与第一步合用一个窗体)。与第一步类似,在该步骤中,也不需要

49、具体的鼠标指针的形状,因此,将鼠标指针设为crNone:Cursor=crNone;四、修改项目源文件在 C+Build er3中,-个窗体也就是一个类,换句话说,具有某些特性的类也就是一个窗体,因此,编制屏幕保护程序时,也不需要什么主窗体,同时,也不用自动创建某些窗体了,这时就要修改项目源文件,下面所列出的程序就是笔者在编制某屏幕保护程序时使用的项目源文件,供读者参考。WlNAPIWinMain(HlNSTANCE,HINSTANCE,LPSTR,int)(CreateMutex(NULL,true,Screensaver);if(GetLastError()!=ERROR_ALREADY_

50、EXISTS)(try(Application-Initialize();Application-Title=屏幕保护程序测试”;if(UpperCase(ParamStr(l)=7C,IIUpperCase(ParamStr(l)=,-CMIIParamCount()=0)TScrSaverConfiguerF*Sci,Cfg=newTScrSaverConfiguerF(NULL);ScrCfg-ShowMod al();d eleteScrCfg;returnO;单击“设置”按钮elseif(UpperCase(ParamStr(l)=7P,IIUpperCase(ParamStr(l)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com