riority = tpNormal; + v) q+ B9 S( z# C0 g" v b9 C
rocessMessages(); * h/ _8 ]. h5 U; G% Y% U4 K# w
rocessMessages();
rocessMessages(); " I3 S) L+ k1 d' m7 Z6 D# j
>取得本地internet机器的名字及IP地址 </P><
>一、下面的例子使用 Winsock API 取得本地主机的名字及地址
>//Get the computer name * o; x7 a' f; ~# n* ?0 f! Q; f
>//Get the IpAddress 2 L. d# ]8 J6 U! o, k1 Q
>void __fastcall TForm1::FormCreate(TObject *Sender) ( q. k% y$ H0 b) B: b, `' v! a0 C
>//Start up WinSock 5 H8 E ^! o: k/ k O. I
>void __fastcall TForm1::FormDestroy(TObject *Sender)
>用C++Builder创建数字签名 </P><
> U' T! F, A. k& F' K! {/ g$ T
> 一、程序原理 </P><
> 数字签名的工作原理还是比较简单的,它是根据你所提供的原始数据,经过复杂的算法,产生特定的数据签名,对方通过同样的过程也产生签名,如果数据已被修改,那么就不可能得到两份一模一样的签名,从而就可判断数据已被他人修改。编程人员利用Windows的CAPI接口,就可以实现数据的加密、解密和数字签名。 </P><
> 二、程序清单 </P><
> 下面用C++ Builder的语句来看一下它的具体实现过程。
> 以上是一个数字签名的简单实现,得到的签名数据可以单独保存,也可以分开保存。 </P><
>用Enter 键 控 制 焦 点 切 换 的 方 法 </P><
>在Windows 环 境 下, 要 使 一 个 控 件 取 得 焦 点, 可 在 该 控 件 上 用 鼠 标 单 击 一 下, 或 按Tab 键 将 焦 点 移 至 该 控 件 上。 这 种 控 制 焦 点 切 换 的 方 法 有 时 不 符 合 用 户 的 习 惯。 就 图 一 而 言, 用 户 就 希 望 用Enter 键, 控 制 焦 点 由Edit1 切 换 到 Edit2。 要 实 现 这 样 的 功 能 需 借 助WinAPI 函 数SendMessage 来 完 成。 方 法 是: 先 设Form1 的KeyPreview 属 性 为true, 然 后 在Form1 的OnKeyPress 事 件 中 加 入 如 下 的 代 码。 这 样, 用 户 就 可 以 通 过 按Enter, 键 控 制 焦 点 按 定 义 好 的Taborder 顺 序 来 移 动 了 !
>{
>1 T& U, v( [0 @) S8 U5 N
>
>---- 引子 </P><
>---- C++ Builder不愧为Borland公司的优秀产品,用它来开发Windows程序非常快捷高效,但在编程过程中你也会发现它的一些限制性,让你无法实现自己的想法。比如你无法在修改表单的系统菜单;比如使用跟踪栏时,你找不到StartTrack和EndTrack事件,而偏偏你的程序需要这两个事件。Windows API编程中,你就不会有这些麻烦,只需处理一下WM_SYSCOMMAND和WM_HSCROLL(或WM_VSCROLL)消息,就能实现上述功能。Windows API的缺点是编程十分麻烦,太多的时间要耗在细节上面,但它的功能却是最强大的。C++ Builder的VCL在功能上只是它的一个子集,因为VCL是在API的基础上封装的,封装时舍弃了一些不常用到的功能。但是程序员的想象力没有被封装,他们总怀着更大的热情去实现别出心裁的想法,修改系统菜单和给跟踪栏增加StartTrack和ndTrack事件只是其中的小把戏而已。可是VCL并没有这些功能,怎么办? </P><
>---- 幸好,Borland公司没有把路堵死,而是留了个后门--允许程序员自己拦截并处理Windows消息,就象API编程一样。于是,办法有了... </P><
>---- 方法 </P><
>---- 拦截Windows消息需要以下几步: ; n" ^4 n; [6 r3 E. W
>BEGIN_MESSAGE_MAP
>
>private: // User declarations - m# X2 Z! Q9 e6 b: k0 p
>/ ?5 v( t- j' J/ u n& l% }
ispatch(&Message);
>
>---- 1. 关于TMessage </P><P>---- TMessage是VCL预定义的结构,定义如下:
ispatch(&Message) </P><P>---- 自定义的消息处理函数末尾最好加一句TForm:
ispatch(&Message),这一句的作用是让消息继续传递下去。如果没有这一句,消息将被完全拦截,VCL类可能由于得不到消息而无法实现正常功能。 </P><P>---- 实例一:修改系统菜单 </P><P>---- 有一些程序,主窗口很小,菜单也没有,如果想加入关于或设置对话框,最好的办法是拿系统菜单开刀。Windows API编程中,修改系统菜单与实现其他功能一样,不太容易,也不会太难。但在C++ Builder中,表单类(TForm)没有提供有关系统菜单的任何属性与方法,实现其他功能易如反掌,而修改系统菜单似乎难于上青天。 </P><P>---- 还好,Borland公司允许程序员自已处理Window消息,于是机会来了! </P><P>一、用Window API函数修改系统菜单 </P><P>假定表单名为MainForm,设置MainForm::OnCreate()函数: </P><P>1. 用GetSystemMenu(MainForm->Handle,false)取得系统菜单句柄; </P><P>2. 用AppendMenu,DeleteMenu,ModifyMenu函数修改系统菜单,把新的ID号赋于自定义的菜单项。 % t" t. `8 k0 a8 B% o- S0 u K
ispatch(&Message); ! w3 n& t# c, {
oIt() </P><P> { </P><P> PostMessage(FHandle, </P><P>MY-MESSAGE, 0, 0); </P><P> } 这个函数发送一个消息组件的窗口句柄(记住,这个窗口句柄是以前存入到Fhandle数据成品中的)。现在我们已经完成了创建组件选择,用SelectFile|ColseAll来保存我们的工作测试组件。 </P><P> 下一步将测试组件。如果你使用BCB3,那么你必须把组件加入到“包”(Packege)中,然后用Componet|install(可以使用DCLSTD35 Packege来快速测试)。再选择你刚存的TestBCB.Cpp,一旦你安装完成组件后,它将出现在组件板上。双击按钮,为按钮的OnClick事件创建以下代码: </P><P> Test1-〉 DoIt( ); </P><P> 现在运行程序,当你点击按钮时,将看到一个消息框显示“Got here". </P><P> ListingA和B包含了头文件和源代码以下列出。 </P><P> 总结:一个可以响应Windows消息的非可视组件有许多用途。最显而易见的就是用来封装某些方面的WindowsAPI。例如:TAPI和WinSock发送消息给事件的指定用户。如果你写的组件封装了一个这样的API。你将需要捕捉Windows发送的消息。而在你的组件中加入隐藏窗口将很好的帮你做到这一点。 </P><P> 以上程序在C++ BUILDER 3.0中调试通过。 </P><P>用C++Builder 建立数据库VCL使用经验 </P><P> 随着数据库的广泛应用,数据库编程已经成为程序设计中发展迅猛的一支。C++ Builder在数据库开发方面具有的强大功能是无可比拟的,你甚至可以不写一行程序就生成漂亮的数据库程序。 </P><P> 下面对C++Builder中的几个数据库VCL的使用技巧做一下介绍: </P><P> 一、DBGrid控件 </P><P> 1.设置DBGrid的字段显示宽度属性 </P><P> 为了在DBGrid中建立较小的列,你必须建立一个显示标题,它等于或小于字段值。例如,你希望建立一个只有三个字符宽的列,你的列标题显示必须只有三个字符或更少。 </P><P> 2.改变DBGrid的显示字段及日期显示格式 </P><P> (1)双击DBGrid对应的Table1,进入字段编辑器。 </P><P> (2)点右键出现选单选“Add Fields…" ,出现添加字段对话框,选择要添加的字段(该字段将在运行时由DBGrid显示)然后点OK按钮。 </P><P> (3)假设添加了“日期”字段,点该字段,在属性表中的:DisplayLabel中填入你希望DBGrid显示的字段名。如果原来字段名是英文的,这里用中文名后DBGrid将显示中文名。在DisplayFormat中填入:yyyy-mm-dd,以后日期将按1999-05-28格式显示。 </P><P> 二、Tquery控件 </P><P> Tquery 控件是数据库编程中非常重要的一个控件,它负责通过BDE与数据库建立联系,通过SQL语句方便的建立查询。Query必须建立相应的SQL才能生效。 </P><P> Tquery的参数设置如下: </P><P> (1)在SQL属性中:Select * from 表名 where 字段名=:变量名 </P><P> 跟在“ : "后面的是变量。这样写后,在参数属性中就可以修改该变量的数据类型等。 </P><P> (2)对变量的赋值: </P><P> Query1-〉Active=false; </P><P> Query1-〉Params-〉Items[0]-〉AsString=Edit1-〉Text; </P><P> Query1-〉Active=true;//查找符合变量的记录 </P><P> (3)用DBGrid显示结果 </P><P> DBGrid的DataSource与DataSource1连接,而DataSource1的DataSet与Tquery1 连接。 </P><P> 三、应用示例 </P><P> 通过Query控件嵌入SQL语句建立的查询比Table更简单、更高效。 </P><P> 用一个简单的代码来说明如何建立查询程序: </P><P> 例如,要建立一个检索表1中书名为book1的程序则在表单上放置DBGrid,DataSource,Query三个控件加入以下代码: </P><P> DBGrid1-〉DataSource=DataSource1; </P><P> DataSource1-〉DataSet=Tqery1; </P><P> Query1-〉Close(); </P><P> Query1-〉SQL-〉Clear(); </P><P> Query1-〉SQL-〉Add(″Select * From 表 Where (书名=′book1′ ″); </P><P> Query1-〉ExecSQL(); </P><P> Query-〉Active=true; </P><P> 你就可以在生成的表格中看到所有名称为book1的记录。 </P><P>用C++ Builder创建基于Internet的点对点Chat </P><P>---- 创建基于Internet的应用程序,你也许会想到复杂的WinSock编程。不过,C++ Builder3提供了新的WebBroker的Internet套件,其中的TClientSocket和TServerSocket组件封装了Windows的有关API,大大简化了WinSock编程。要通过Internet传输数据,至少需要一对Socket,一个Socket在客户端,另一个Socket在服务器端。其实TClientSocket、TServerSocket组件并不是Socket对象,其属性Socket将返回各自的Socket对象。TClientSocket用来处理客户端到服务器端之间的socket连接,TServerSocket用来处理由客户端发来的socket连接,一旦客户端和服务器端都接通了socket,客户端和服务器端就可以相互通信了。 </P><P>---- 建立一新项目,创建应用程序的用户界面: </P><P>---- 1.将组件页切换到Internet页,放一个TServerSocket组件和一个TClientSocket组件到窗体上,这样应用程序既可以是TCP/IP服务器,也可以是TCP/IP客户。将Port属性都设为同一个值(如1000),确定Socket之间的连接类型为NonBlocking(非阻塞方式)。 </P><P>---- 2.放两个TMemo组件到窗体上,用来分别显示双方的谈话内容,将Memo2的ReadOnly属性设为True。 </P><P>---- 3.在窗体的顶部放上一个Panel组件,在其上放三个按钮:监听(btnlisten)、连接(btnconnect)、断开(btndisconnect),用来启动相应的操作。 </P><P>---- 4.在窗体底部放一个StatusBar组件,将其SimplePanel属性设为True,在相应的事件处理程序中改变状态条信息,让用户随时了解连接状态。 </P><P>---- 打开头文件,在窗体类的Private段添加两个私有成员: bool IsServer;String Server。双方通信时需同时运行Chat程序,IsServer用来确定哪个Chat程序处于服务器端,Server用来存放服务器的主机名。建立窗体类的构造器如下: </P><P>__fastcall TForm1::TForm1(TComponent* Owner) 7 U, i. |, v- x1 B+ U& o
eviceIoControl( sDiskImageInfo->hDevice, ' B/ J4 Y+ c) s E, j: o
eviceIoControl( sDiskImageInfo->hDevice,
eviceIoControl( hDevice, VWIN32_DIOC_DOS_INT13,
>Windows95/98下怎样隐藏应用程序不让它出现在CTRL-ALT-DEL对话框中? </P><
>* E3 {' o- G& ~+ K/ ~3 j6 B
>WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
>下面的例子代码演示了在Windows95/98下怎样通过使用RegisterServiceProcess来把你的程序从CTRL-ALT-DEL对话框中隐藏起来。 </P><
>//------------Header file------------------------------
>class TForm1 : public TForm
>5 I0 C6 {+ w; H
>#define RSP_SIMPLE_SERVICE 1 4 i5 F8 f w; C! ?3 D- D4 ^
>__fastcall TForm1::TForm1(TComponent* Owner)
>if(RegisterServiceProcess)
>__fastcall TForm1::~TForm1()
>FreeLibrary(hKernelLib);
>怎样隐藏应用程序的任务条图标 </P><
>
>ShowWindow(Application->Handle, SW_HIDE); 7 D, Z$ {4 E5 F$ ]
>ShowWindow(Application->Handle, SW_SHOW); / T# c! O$ M8 J4 F6 ?2 V
>注: 通过ShowWindow来隐藏窗口的任务条图标是不持久的。某些动作会使任务条图标重现。你可以将隐藏的应用程序窗口设为Tool Window来移走程序的任务条图标而避免它再次出现。Tool windows永远不会有任务条图标。 使应用程序窗口成为一个Tool Window有一个副作用:当用户按下Alt-TAB时它将不在程序列表中出现。你可以调用API函数GetWindowLong和SetWindowLong来使应用程序窗口成为一个Tool Window。 </P><
>WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) / p, v9 g. ]8 K6 D; d8 {, x
>DWORD dwExStyle = GetWindowLong(Application->Handle, GWL_EXSTYLE); t- Z, U! P: x9 e# F
>try
>
>
> Ping的实现过程很简单,该命令将引发IP层发送一个简单的IP包,一般是32字节。而目的方收到这个包后,将源地址和目的地址变换一下,重新发送这个包即可,当然还要加一些超时机制。 </P><
> 其实,我们也可用C++ Builder NetMaster中的NMEcho控件来实现网络连接检测功能。 </P><
> 首先定义以下控件: </P><
> 三个Edit控件:一个用于接收远程主机的IP地址或域名,一个用于接收用户设置的超时机制的时间,一个用于设置端口号。 </P><
> 两个RichEdit控件:一个用于给远程主机发送信息,一个用于接收来自远程主机的信息。 </P><
> 两个CheckBox控件:用于用户是否自己设定端口号。 </P><
> 一个Button控件:用于执行测试。 </P><
> 一个StatusBar控件:用于显示应用程序的状态。 </P><P> 程序实现代码如下: </P><P> void __fastcall TForm1::Button1Click(TObject ?Sender) </P><P> { //设置NMEcho控件的标准TCP/IP属性 </P><P> NMEcho1-〉Host=Edit1-〉Text ; </P><P> NMEcho1-〉TimeOut=StrToInt(Edit2-〉Text) ; </P><P> if(CheckBox1-〉Checked) </P><P> NMEcho1-〉Port=StrToInt(Edit3-〉Text); </P><P> else </P><P> NMEcho1-〉Port=7; </P><P> //TCP/IP中Echo的默认端口号 </P><P> NMEcho1-〉ReportLevel=Status_Basic; </P><P> NMEcho1-〉Connect(); //建立连接 </P><P> RichEdit2-〉Clear (); </P><P> for(int i=0;i
eleteBtnClick / t* Z7 Q. t+ A% h4 h5 O' B
rocessMessage 9 u0 C( y# K* N9 G
( O d5 P- C" @| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |