第9章__Win32编程_第1页
第9章__Win32编程_第2页
第9章__Win32编程_第3页
第9章__Win32编程_第4页
第9章__Win32编程_第5页
已阅读5页,还剩147页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第9 9章章 Win32Win32编程编程 第第9章章 Win32编程编程 9.1 调用调用Windows API 9.2 处理处理 Windows消息消息 9.3 使用剪贴板使用剪贴板 9.4 使用注册表使用注册表 9.5 使用动态链接库使用动态链接库 习题习题 第第9 9章章 Win32Win32编程编程 9.1 调用调用Windows API API是Application Programming Interface的缩写, 意为应用程序界面(接口)。Windows 作为一种操作系统, 除了提供便利的图形操作界面直接给用户外,它给程 序员提供的编程界面就是Windows API。通过A

2、PI,程 序员能在应用程序中调用由Windows系统提供的各种 底层服务。 第第9 9章章 Win32Win32编程编程 9.1.1 Windows API的有关概念 Windows API都是以DLL输出函数的形式提供的, 大部分核心的API服务都在Kernel32.dll、GUI32.dll和 User32.dll三个文件内,它们位于WindowsSystem (WinntSystem32)目录内。还有许多重要的API函数在 Windows (Winnt)或WindowsSystem (WinntSystem32) 目录中的其它DLL文件内(本章第5节将介绍DLL)。这 些函数数量庞大,而

3、且随着Windows版本的升级仍在 不断增加。对于普通程序员来说,不可能也没必要知 道每个API函数的用法,但应了解一些API的知识并且 能在需要时迅速查到自己感兴趣的API函数的资料。 第第9 9章章 Win32Win32编程编程 在BCB中,一般只要利用VCL组件的属性和事件 就能完成90%以上的编程任务,而且比使用API方便得 多,这是因为BCB很好地将API进行了“包装”,但还 是会遇到有必要使用API的机会。BCB对使用API提供 了很好的支持,大部分API函数可以在BCB中直接使用 (指不必加入带_declspec (dllimport) 修饰符的说明)。 当然,必要时应在项目中包

4、含相应的头文件。 我们其实已经与API打过交道了,比如在本书基础 篇的第3章范例3-2中利用API取得INS等特殊键的状态; 在应用篇第4章则曾利用API播放波形声音文件,是否 每次使用API都给您留下了深刻的印象呢? 第第9 9章章 Win32Win32编程编程 9.1.2 常用的Windows API函数介绍 本小节将分类介绍一些常用的API函数,除了对少 数具有代表性的API函数介绍得较详细并给出应用示例 外,大部分仅以表格形式给出概括性的描述。读者若 要知道它们的详细用法,可以查阅BCB的Help。在应 用程序的某个单元文件内输入API函数的名称,然后将 文本插入点移到该函数名称上并按

5、F1键,即可看到有 关的说明。更完整的参考书应是Microsoft的相关文献。 1窗口控制类 与窗口控制有关的API函数很多,表9-1列出其中 最常用的一部分。 第第9 9章章 Win32Win32编程编程 表9-1 常用窗口控制API函数 API函数名称功 能 描 述 GetActiveWindow获得活动窗口的句柄 GetFocus获得拥有输入焦点窗口的句柄 GetParent获得指定窗口的父窗口 IsChild判断一个窗口是否为另一窗口的子窗口 IsIconic判断一个窗口是否处于最小化状态 SetWindowPos改变窗口的位置 MoveWindow改变窗口的位置和大小 第第9 9章章

6、 Win32Win32编程编程 BringWindowToTop将指定的窗口带到顶部 FindWindow寻找符合某些条件的窗口 FlashWindow使指定的窗口闪烁显示 GetWindowText取窗口的标题或控件的内容 SetWindowText设置窗口标题或控件的内容 EnableWindow允许或禁止对指定窗口的输入 ShowWindow控制窗口的可见性 CloseWindow关闭窗口,但不会从内存中清除 DestroyWindow清除指定窗口及其它的所有子窗口 第第9 9章章 Win32Win32编程编程 对于BCB中的窗体,我们一般可以用调用窗体对 象的方法来控制,而对于某些不是

7、由BCB编写的应用 程序所产生的窗体,我们也可以在BCB应用程序中调 用窗口控制API函数对它们进行控制。 窗体控制API函数一般都会用到一个称为窗口句柄 的参数,在Windows中窗口句柄的类型为HWND,它 可以被理解为是一种指针。对于BCB窗体,可以用 handle属性取得窗口句柄。对于非BCB窗体,则可以用 GetActiveWindow、FindWindow等API函数取得其句柄。 第第9 9章章 Win32Win32编程编程 下面一个例子是在当前Windows环境下查找一个标 题为“Hello”的窗口,如果查到该窗口,就将其标题改 为“How Are You”。 HWND hWnd

8、 ; if (hWnd = FindWindow (0, Hello) SetWindowText (hWnd, How Are You); else ShowMessage (Window Not Found ); 第第9 9章章 Win32Win32编程编程 注意:SetWindowText 的第一个参数是被设置标题 的窗口句柄。FindWindow的第一个参数指定要查找的 窗口类型,该参数等于“0”表示对类型无任何限制。 第二个参数指定要查找的窗口的标题。 第第9 9章章 Win32Win32编程编程 2文件操作类 BCB对基本文件处理的支持较弱,但结合使用有 关的API功能,就能充分满

9、足各种需求。常用文件操作 API函数如表9-2所示。 第第9 9章章 Win32Win32编程编程 表9-2 常用文件操作API函数 API函数名称功 能 描 述 CreateFile创建文件、管道等 OpenFile打开文件 CloseHandle关闭文件 GetFileAttributes获取指定文件的属性 GetFileSize获取指定文件的长度 GetFileTime获取指定文件的时间信息 CopyFile复制文件 第第9 9章章 Win32Win32编程编程 DeleteFile删除指定的文件 FindFirstFile查找符合条件的文件 FindNextFile查找下一个文件(与F

10、indFirstFile结合使用) ReadFile读文件中数据至缓冲区 WriteFile将缓冲区中数据写入文件 CreateDirectory创建一个目录 RemoveDirectory删除指定目录 SetCurrentDirectory设置当前目录 第第9 9章章 Win32Win32编程编程 GetDriveType判断驱动器的类型(如硬盘、软盘、网络、CD- ROM等) GetDiskFreeSpaceEx获取磁盘的剩余容量 RegCreateKeyEx创建一个注册表子项 RegOpenKeyEx打开注册表上一个项 RegDeleteKey删除注册表上一个项 RegQueryValu

11、eEx获取注册表上一个项的值 RegSetValueEx设置注册表上指定项的值 RegEnumKeyEx枚举注册表上指定项的子项 RegEnumValue枚举注册表上指定项的值 第第9 9章章 Win32Win32编程编程 这些函数使用相对较复杂,并涉及到Windows中定 义的一些专用的结构体类型。下面是一个创建目录的 例子。 SECURITY_ATTRIBUTES *SA; SA=new (SECURITY_ATTRIBUTES ); if (!CreateDirectory (C:NewSub2, SA) ShowMessage (Not Successful !); delete (S

12、A); API函数CreateDirectory需要一个 SECURITY_ATTRIBUTES 类型的参数传送有关的安全 属性,本例中用new动态创建了一个这种结构,使用的 是缺省设置。 第第9 9章章 Win32Win32编程编程 3图形与图像处理类 Windows是图形操作系统,与图形、图像有关的 API功能调用十分丰富,表9-3列出了其中的一部分。 第第9 9章章 Win32Win32编程编程 表9-3 常用图形与图像API函数 API函数名称功 能 描 述 DrawText将文本描绘到指定的矩形 (可选择字体、颜 色等) GetDC取得某输出设备句柄 GetTextColor取指定设

13、备中当前文本的颜色 SetTextColor设置指定设备中当前文本的颜色 TextOut在指定设备的指定位置输出文本 ExtTextOut 扩展的TextOut,能对文本输出进行各种控 制 LineTo用画笔从当前位置至指定位置画直线段 第第9 9章章 Win32Win32编程编程 MoveToEx指定画笔的当前位置 PolyBezier画贝塞尔(Bezier)曲线 PolyLine画由一系列线段组成的折线(可封闭成多边形) Polygon画多边形,内部用画刷填充 Rectangle画矩形,内部用画刷填充 RoundRect画圆角矩形,内部用画刷填充 Ellipse画椭圆,内部用画刷填充 Ar

14、c画一段圆弧 Pie画一个扇形,内部用画刷填充 GetPixel取像素的颜色 第第9 9章章 Win32Win32编程编程 SetPixel设置像素颜色 CreatePen用指定的风格、宽度和颜色创建一画笔 CreateSolidBrush用纯色创建一个画刷 CreateHatchBrush创建带有图案的画刷 ExtFloodFill用当前画刷填充一个区域 FillRect用画刷填充一个矩形 CreateBitmap创建一幅位图 第第9 9章章 Win32Win32编程编程 LoadBitmap载入一幅位图 BitBlt在位图间传送一矩形区域内图像 StretchBlt伸缩一个位图 Creat

15、eCursor创建一个鼠标指针 LoadCursor载入一个鼠标指针 CreateIcon创建一个图标 LoadIcon载入一个图标 DrawIcon在指定位置画一个图标 第第9 9章章 Win32Win32编程编程 这些API功能大部分可以在BCB中利用画布(Canvas) 等对象的方法来完成,但也有一些是BCB对象所没有 的,如PolyBezier、Arc、ExtFloodFill等。此外,使用 API的效率可能会高一点。而对于非BCB窗体,API是 惟一的选择。 BCB在抽象的Canvas上进行绘图,但使用API时, 必须指定输出设备。Windows中用HDC表示输出设备 的句柄。若想在

16、窗口上绘图,则首先要用GetDC取得 窗口的设备句柄,然后将此句柄传给各个API绘图函数。 下面是一个简单例子。 第第9 9章章 Win32Win32编程编程 HDC hdc; hdc=GetDC (Form1-Handle); Rectangle (hdc,10,10,120,100); TextOut (hdc, 20 , 30, ABCDE, 5); 第第9 9章章 Win32Win32编程编程 4系统管理与服务类 这些函数提供Windows系统管理及有关服务与信息, 它们非常有用。常用Windows系统管理与服务API函数 如表9-4所示。 第第9 9章章 Win32Win32编程编程

17、 表9-4 常用Windows系统管理与服务API函数 API函数名称功 能 描 述 GetSystemInfo获取与底层硬件平台有关的信息 GetSystemPowerStat us 获取系统电源状态 (对便携机特别重要) GetLocalTime获取本地日期和时间 SetLocalTime设置日期和时间 GetUserName获取当前用户的名字 GetComputerName获取计算机名称 第第9 9章章 Win32Win32编程编程 WinExec运行外部应用程序 ExitWindowsEx退出Windows并关闭或重新启动系统等 SetWindowRgn创建形状各异的窗口 OpenCl

18、ipboard打开剪贴板 EmptyClipboard清除剪贴板上的数据 CloseClipboard关闭剪贴板 GetClipboardData获取剪贴板数据 SetClipboardData将数据放到剪贴板上 第第9 9章章 Win32Win32编程编程 首先介绍ExitWindowsEx的使用方法。该函数很强 大,可以退出Windows并且关机或重新启动等。它有 两个参数,第一个参数指定退出方式,可以使用以下 一个或多个(用“|”运算符合并)预定义值: EWX_REBOOT、EWX_FORCE、EWX_LOGOFF和 EWX_SHUTDOWN等,它们分别表示重新启动、强迫 中止没有响应的

19、进程、中止进程并注销用户和关闭系 统等。第二个参数一般可设为0。 第第9 9章章 Win32Win32编程编程 例如,执行“ExitWindowsEx (EWX_REBOOT, 0);” 可退出Windows并重新启动。实验时,应在Windows下 运行.exe可执行文件。 接下来再介绍一个SetLocalTime,它使用一个 SYSTEMTIME* 类型的参数,下面是一个例子。 第第9 9章章 Win32Win32编程编程 SYSTEMTIME *SLT; SLT = new SYSTEMTIME; SLT-wYear = 2003; SLT-wMonth = 10; SLT-wDay =

20、1; SLT-wHour = 0; SLT-wMinute = 0; SLT-wSecond = 10; SetLocalTime (SLT); delete (SLT); 第第9 9章章 Win32Win32编程编程 执行这一段代码后,系统的日期、时间改变为 2003/10/1,0: 0: 10。 表格中有几个与剪贴板(Clipboard) 有关的API函数也是很有用的,在本章第3节会介绍它 们的用法。 第第9 9章章 Win32Win32编程编程 5其它API函数 除了以上几个方面的API函数外,在下一节我们将 较详细地介绍与Windows 消息有关的几个API。其它方 面的API还有:多

21、媒体播放技术API、DDE、剪贴板、 注册表等操作的API、网络技术方面如Socket API、支 持访问OLE与COM对象的API、对特定的设备如打印 机或者CD-ROM 提供支持的API等,有兴趣的读者可 参考有关资料。我们的建议是尽可能通过BCB提供的 组件,使用属性、事件和方法解决问题,而将使用API 作为最后的选择。 第第9 9章章 Win32Win32编程编程 9.2 处理处理 Windows消息消息 9.2.1 Windows消息机制 在Windows中,单击鼠标、改变窗口尺寸、按下键 盘上的一个键都会使Windows发送一个消息给应用程 序。消息本身是作为一个记录传递给应用程序

22、的,这 个记录中包含了消息的类型以及其它信息。例如,对 于单击鼠标所产生的消息来说,这个记录中包含了单 击鼠标时的坐标。 第第9 9章章 Win32Win32编程编程 一个消息是由一个消息名称(UINT)和两个参数 (WPARAM,LPARAM)组成的。当用户进行了输入或 是窗口的状态发生改变时系统都会发送消息到某一个 窗口。例如,当某菜单项被选中之后会有 WM_COMMAND消息发送,该消息的WPARAM的高 字中(HIWORD(wParam)存放的是命令的ID号,就是 菜单ID。此外,用户也可以定义自己的消息,也可以 利用自定义消息来发送通知和传送数据。 第第9 9章章 Win32Win3

23、2编程编程 常用的消息有WM_COMMAND、WM_CLOSE、 WM_QUIT、WM_LBUTTONDOWN和 WM_SETFOCUS等。 消息的概念离不开窗口句柄,系统通过窗口句柄 在整个系统中惟一标识一个窗口,发送一个消息时必 须指定一个窗口句柄表明该消息由哪个窗口接收。而 每个窗口都会有自己的窗口过程,所以用户的输入就 会被正确的处理。例如,当前环境下有两个窗口,当 你在窗口一上按下鼠标时,Windows就会将消息通过 窗口一的句柄发送到窗口一的窗口过程进行处理,而 不会被窗口二处理。 第第9 9章章 Win32Win32编程编程 以下是三个与消息有关的常用API 函数: Broadc

24、astSystemMessage 它的作用是将消息广播 给所有的顶级窗口。 SendMessage 它的作用是发送一条消息给某窗口 并等待,直到消息处理完毕后返回。 PostMessage 它的作用是投递一条消息到某窗口, 并立即返回。 第第9 9章章 Win32Win32编程编程 【例9-1】 程序窗体中放入一个编辑框和一个按钮,按钮 的OnClick事件执行如下代码: void_fastcall TForm1:Button1Click (TObject *Sender) HWND hWnd ; if (hWnd = FindWindow (0, Edit1-Text.c_str ( ) P

25、ostMessage (hWnd, WM_CLOSE, 0, 0); else ShowMessage (Window not found); 第第9 9章章 Win32Win32编程编程 现在可以进行实验了。首先启动某个Windows应用 程序(比如是Windows的“计算器”),然后运行我们自 己的程序,在程序的编辑框中输入先前启动的那个程 序的标题(比如标题为“计算器”),然后点击程序中的 按钮。我们会发现先前启动的那个程序被关闭了。因 为该程序的窗口接收到一条WM_CLOSE消息,就关门 大吉了。 第第9 9章章 Win32Win32编程编程 本例中用到了PostMessage函数,该

26、函数的原型是: BOOL PostMessage(HWND hWnd,UINT Msg, WPARAM wParam, LPARAM lParam); 其中,hWnd是接受消息的窗口的句柄,Msg是一 个消息,wParam、lParam是该消息的附加信息(参数)。 对接收消息的程序来说,一般并不知道该消息来自 何方,往往以为这是Windows给它的指令。就像例子 中的“计算器”程序那样,莫名奇妙地被人家关闭了。 第第9 9章章 Win32Win32编程编程 9.2.2 消息与BCB 事件 熟悉Windows编程的读者可能知道,Windows的每 一个窗口都有一个自己的消息处理函数(窗口过程),

27、它 能接收到Windows传送给该窗口的每一个消息,然后 按照自己的逻辑去处理这些消息。如果没有BCB的组 件和应用程序框架(或其它类似框架),那么必须由程序 员自己写完整的窗口过程。 第第9 9章章 Win32Win32编程编程 消息是操作系统级的概念,而事件则是消息经过 面向对象封装的产物。BCB是一个Windows快速开发 工具,它鼓励程序员尽可能的使用经过面向对象思想 封装过的各组件来进行Windows编程,这样无论是从 可移植性、继承性方面,还是从可读性方面来说都有 利于软件的开发。在BCB编程环境下,编程者一般只 要处理相对比较容易理解的事件而避免直接与窗口过 程打交道。 第第9

28、9章章 Win32Win32编程编程 但是Borland公司不可能将所有的消息都封装成事件 供程序员使用,并且有些地方必须程序员自己动手去拦 截消息,才能开发出功能强大且有新意的程序。因此, 在BCB 程序中使用消息是对事件编程的一个补充。 在BCB程序中处理消息其实很容易,因为TForm类 具有虚拟方法WndProc可供应用程序重载。该方法有一 个参数可以接收Windows消息,它的的原型为 第第9 9章章 Win32Win32编程编程 WndProc (Messages:TMessage 我们只要在程序中重载该方法,就能拦截我们感 兴趣的特定消息进行处理,并且仍然可以使用事件处 理其它消息

29、。下面是一个例子。 第第9 9章章 Win32Win32编程编程 【例9-2】 本例非常简单,我们在Unit1.h头文件中 关于TForm1声明中插入方法WndProc的声明表示需要 重载该方法,然后在Unit1.cpp中给出该方法完整的定 义。下面列出这两个文件: 第第9 9章章 Win32Win32编程编程 /以下是在Unit1.h中需插入的语句 class TForm1 : public TForm _published:/ IDE-managed Components private: public:/ User declarations _fastcall TForm1(TCompo

30、nent* Owner); void_fastcall TForm1:WndProc(TMessage ; 第第9 9章章 Win32Win32编程编程 /- /以下在Unit1.cpp中编写消息处理代码 void_fastcall TForm1:WndProc (TMessage Msg.Result = true; return; 第第9 9章章 Win32Win32编程编程 case WM_SETFOCUS: /该消息表示窗口获得焦点 Caption = 窗口为聚焦状态!; Msg.Result = true; return; default: /对其它的消息由TForm1父类的WndP

31、roc过程进行处理 TForm:WndProc (Msg); 运行该程序,当程序窗口获得焦点(Focus)或失去焦点 时,窗口标题上会有相应的显示,如图9-1和图9-2所示。 第第9 9章章 Win32Win32编程编程 图9-1 窗口获得焦点 第第9 9章章 Win32Win32编程编程 图9-2 窗口失去焦点 第第9 9章章 Win32Win32编程编程 【评析】 (1) 本例中仅拦截并处理WM_SETFOCUS和 WM_KILLFOCUS两种消息,其余消息调用父类的 WndProc按缺省方式处理,这是非常巧妙的做法。这 样既满足了程序中特定的需求,又能继续享用BCB提 供的便利(如使用与

32、窗口焦点无关的事件等)。 (2) 在WndProc中处理消息与直接编写Windows窗 口函数仍有一定区别,如方法参数被定义为TMessage 类的引用,仍然被对象技术薄薄地包装了一下。这样 就比较好用,如可以用Msg.Result返回结果等。 第第9 9章章 Win32Win32编程编程 9.2.3 钩子程序 钩子(Hook)是Microsoft Windows消息处理机制中较 底层的一部分,通过钩子应用程序可以安装一个子程 序来监视系统中消息的往来,还能在消息到达目的窗 口过程之前处理某个类型的消息。 第第9 9章章 Win32Win32编程编程 钩子不仅能拦截送往某个窗口的消息,而且可以

33、拦 截所有的Windows消息。因此,钩子具有全局性。 Windows系统中含有多种不同类型的钩子,每个类型都 针对一种Windows消息的通路。例如,应用程序能够使 用WH_MOUSE钩子来监视鼠标的消息往来。由于消息 通路上可能存在由多个程序设置的不同钩子,因此 Windows系统为每一条通路管理了一个独立的钩子链。 第第9 9章章 Win32Win32编程编程 钩子链是一个指向特殊的称之为钩子过程的应用 程序定义的回调函数的指针列表。如果有与某种特定 类型的钩子相应的消息,那么Windows系统会把这条 消息一个接一个传给相应钩子链中的钩子过程。钩子 按照“后到者先干” 原理进行工作,即

34、最后安装的钩 子最早拦截到消息。使用钩子有可能减低系统的性能, 因为它们增加了系统为每一条消息进行处理的总量。 开发人员应该只在需要的时候才使用钩子,并在不用 时尽快删除掉钩子。 第第9 9章章 Win32Win32编程编程 在BCB中开发钩子程序主要用到 API函数 SetWindowsHookEx,该函数的原型为 HHOOK SetWindowsHookEx ( int idHook, / 要安装的钩子类型 HOOKPROC lpfn, / 钩子过程的地址 HINSTANCE hMod,/ 应用实例的句柄 DWORD dwThreadId / 需要安装该钩子的线程的ID 号 ); 下面是一

35、个钩子程序的实例,程序拦截到键盘消 息时的反应如图9-3所示。 第第9 9章章 Win32Win32编程编程 图9-3 钩子程序拦截到键盘消息 第第9 9章章 Win32Win32编程编程 【例9-3】 在Form中放入一个Label并设置其 Caption为“请按(Shift+S)键测试”;在Unit1中定义一 个回调函数CALLBACK KeyboardProc;再处理Form1 的 OnCreate和OnDestroy事件。 下面列出需要写入Unit1.h和Uint1.cpp中的代码: /在Unit1.h中插入 HHOOK hHook; LRESULT CALLBACK Keyboard

36、Proc (int, WPARAM, LPARAM); 第第9 9章章 Win32Win32编程编程 /以下是Unit1.cpp中的代码- - LRESULT CALLBACK KeyboardProc (int nCode, WPARAM wParam, LPARAM lParam) if (nCode0) return CallNextHookEx (hHook, nCode, wParam, lParam); else if (GetKeyState (VK_SHIFT) 第第9 9章章 Win32Win32编程编程 return CallNextHookEx (hHook, nCode

37、, wParam, lParam); /将控制转移到钩子链的下一环 /- - void_fastcall TForm1:FormCreate (TObject *Sender) hHook = SetWindowsHookEx (WH_KEYBOARD, (HOOKPROC) KeyboardProc, (HINSTANCE) NULL, GetCurrentThreadId ( ); 第第9 9章章 Win32Win32编程编程 /- - void_fastcall TForm1:FormDestroy (TObject *Sender) UnhookWindowsHookEx (hHook

38、); /将钩子释放 第第9 9章章 Win32Win32编程编程 【评析】 (1) API函数SetWindowsHookEx 用于设置钩子:第 一个参数WH_KEYBOARD指定钩子的类型为处理键盘 消息;第二个参数指定KeyboardProc函数为处理消息 的过程;第三个参数可控制消息的范围,取值为NULL 时只能截取送往单个线程的消息(在本章稍后我们会修 改本例,使能拦截送往任何线程的消息);最后一个参 数指定需拦截消息的线程为钩子程序本身的主线程(使 用GetCurrentThreadId 取得线程ID)。 第第9 9章章 Win32Win32编程编程 (2) 本例中KeyboardP

39、roc作为特定消息处理函数按 规定一定要声明为回调函数(大致上讲,回调函数是由 用户定义并且由操作系统在满足一定条件时进行调用 的函数),该函数参数的个数和类型是预先由Windows 规定好的(每种类型的钩子都有确定的函数原型,详细 可查Help)。 第第9 9章章 Win32Win32编程编程 (3) nCodeCopyToClipboard( );”以及“PasteFromClipboard ( );”。 CopyToClipboard和CutToClipboard方法的使用与控件中 被选中的内容有关,可用于确定被选内容的属性有 SelLength、SelStart、SelText等。 第

40、第9 9章章 Win32Win32编程编程 一般来说,使用控件的剪贴板方法是非常方便的。 为了使程序在对剪贴板的支持方面更完善、更专业, 我们还要注意以下几点: (1) 仅当输入焦点位于一个具有剪贴板方法的控件 中,并且该控件内有被选中的内容时菜单项“Cut”、 “Copy”为可用(Enabled为true)。 (2) 仅当输入焦点位于一个具有剪贴板方法的控件 中,并且此时在剪贴板上已存有可供粘贴的内容时, 菜单项“Paste”为可用。 (3) 如果剪贴板上的内容与当前控件使用的数据格 式不一致,则在可能的情况下应将其转换为可用格式 后进行粘贴。 第第9 9章章 Win32Win32编程编程

41、9.3.3 使用TClipboard类 BCB定义的TClipboard类,包装了与剪贴板操作相 关的API,使用时非常方便。为了能使用TClipboard类, 请在应用程序项目中包括Clipbrd.hpp。 下面讲讲TClipboard类的主要属性和方法。 1AsText属性 AsText属性为AnsiString数据类型,对其进行读操 作时可从剪贴板中取出文本格式的内容,写操作时可 将文本放到剪贴板上。 第第9 9章章 Win32Win32编程编程 2FormatCount属性 FormatCount属性返回当前可以使用的剪贴板格式 的数目,该属性为只读。 3Formats属性 Forma

42、ts属性为一个数组,保存了当前可以使用的 所有剪贴板格式。这些格式既可以是标准格式,也可 以是应用程序自定义的格式,总数应等于FormatCount 属性的值。 4Assign方法 Assign方法将指定的图形或图像复制到剪贴板上。 第第9 9章章 Win32Win32编程编程 5Clear方法 Clear方法将剪贴板上的内容全部清除。 6Close方法 Close方法关闭剪贴板。 7GetAsHandle方法 GetAsHandle方法取得剪贴板上指定格式数据的句 柄,该句柄可用于API调用。 第第9 9章章 Win32Win32编程编程 8GetComponent方法 GetCompone

43、nt方法从剪贴板上粘贴一个控件,剪贴 板上的控件一般是事先使用SetComponent方法放入的。 9GetTextBuf方法 GetTextBuf方法从剪贴板上复制文本到一个缓冲区。 10HasFormat方法 HasFormat方法检测当前剪贴板上是否有指定格式 的内容。 第第9 9章章 Win32Win32编程编程 11Open方法 Open方法打开剪贴板,随后即可向剪贴板写入一 系列的内容,处于打开状态的剪贴板上的内容不会被 其它程序的内容覆盖,打开的剪贴板应使用Close方法 关闭。 第第9 9章章 Win32Win32编程编程 12SetAsHandle方法 SetAsHandle

44、方法设置一个数据的句柄到剪贴板, 以此将数据置入剪贴板。 13SetComponent方法 SetComponent方法将一个控件复制到剪贴板。 14SetTextBuf方法 SetTextBuf方法将缓冲区内的文本复制到剪贴板。 第第9 9章章 Win32Win32编程编程 【例9-4】 建立一个应用程序项目,在Form1中放 入三个按钮,按钮的标签分别为“CF_TEXT”、 “CF_BITMAP”和“Open_Clipboard”。按下 “CF_TEXT”按钮时,程序将剪贴板上文本格式的数据 显示到窗体的标题栏;按下“CF_BITMAP”按钮时, 程序将剪贴板上位图格式的图像数据画到窗体的

45、画布 (Canvas)上显示;按下“Open_Clipboard”按钮时,打开 剪贴板,将一段文本数据和一幅图片中的位图数据同 时放入剪贴板。 第第9 9章章 Win32Win32编程编程 /在Uint1.h中加入 #include /以下为Unit1.cpp中三个按钮的OnClick事件代码 void_fastcall TForm1:Button1Click (TObject *Sender) if (Clipboard ( )-HasFormat (CF_TEXT) char* str1= (char *) malloc (100); /创建字符串str1并分配内存 第第9 9章章 Win

46、32Win32编程编程 Clipboard ( )-GetTextBuf (str1,100); /将剪贴板上文本格式数据存入str1 Form1-Caption = str1; free (str1); /释放str1 /- void_fastcall TForm1:Button2Click (TObject *Sender) if (Clipboard ( )-HasFormat (CF_BITMAP) 第第9 9章章 Win32Win32编程编程 TPicture *pic1 = new TPicture; pic1-Assign (Clipboard ( ); /将剪贴板上位图格式数据

47、存入pic1 Canvas-Draw (0, 0, pic1-Graphic); /将pic1画到Canvas delete pic1; /- void_fastcall TForm1:Button3Click (TObject *Sender) 第第9 9章章 Win32Win32编程编程 Clipboard ( )-Open ( ); /打开剪贴板 Clipboard ( )-SetTextBuf (Hello); /将文本放入剪贴板 TPicture *pic1 = new TPicture; pic1-LoadFromFile (building.bmp); /将图像文件读入pic1

48、Clipboard ( )-Assign (pic1); /将pic1内的图像放入剪贴板 Clipboard ( )-Close ( ); /关闭剪贴板 第第9 9章章 Win32Win32编程编程 图9-5 范例9-4运行时的画面 第第9 9章章 Win32Win32编程编程 【评析】 (1) GetTextBuf 方法的BCB声明为语句 “int_fastcall GetTextBuf (char * Buffer, int BufSize);” 其中,第一个参数为字符指针类型的缓冲区,它用于 存放剪贴板上的文本。第二个整型参数可限制存入到 缓冲区的字符个数,一般应等于缓冲区的长度。范例

49、中用 (char *) malloc (100) 为缓冲区指针str1动态分配内 存,并在结束使用后用free释放。 第第9 9章章 Win32Win32编程编程 (2) 使用Open方法,使得在执行Close方法之前存入 剪贴板的数据不会被覆盖。如果在运行范例9-4时按一 下“Open Clipboard”按钮,再通过“剪贴板查看程序” 进行观察,如图9-6所示,我们看到当前剪贴板内有文 本、位图、调色板等格式的数据。如果我们在程序中 不调用Open方法,则剪贴板上文本格式的数据会被图 像格式的数据覆盖掉。 (3) TClipboard 是非常特殊的类,它只有一个对象 实例。用户不能在程序中

50、生成该类的实例,而只能调 用由Clipboard ( ) 函数返回的那个惟一实例。 第第9 9章章 Win32Win32编程编程 图9-6 查看程序显示出剪贴板上存有多种格式的数据 第第9 9章章 Win32Win32编程编程 9.4 使使 用用 注注 册册 表表 9.4.1 注册表在Windows下的作用 早期的Win3.x主要采用.ini文件保存系统及应用程 序的有关信息,该方法有几个缺点:一个是文件为线 性结构,当信息数量增多时不便查找;另一个是.ini文 件的文本格式限制了数据的格式和长度;再一个是大 量的.ini文件易造成混乱,也难以对数据保密。从 Win95开始,Windows采用

51、注册表保存系统信息,但为 了兼容的目的仍保留了对.ini文件的支持。 第第9 9章章 Win32Win32编程编程 注册表本质上是一个系统数据库文件,它的内部 结构是分层次的。该数据库以特定格式保存各种配置 信息。除了Windows用注册表保存系统信息外,应用 程序也可以用注册表保存信息。注册表的文件保存在 Windows文件夹内,一般由SYSTEM.DAT、USER.DAT 等若干文件组成,这些文件为系统隐含文件。 Windows提供了一个“注册表编辑器”程序供用户观 察、修改注册表。该程序文件名为RegEdit.exe,通常 安装在Windows文件夹内。可以在“资源管理器”内 找到该文件

52、,双击其图标运行该程序。该程序运行时 的画面如图9-7所示。 第第9 9章章 Win32Win32编程编程 从图9-7可以看出,注册表的层次结构类似于 Windows文件系统的结构,“注册表编辑器”的界面 则与“资源管理器”很相似。习惯上将注册表中各个 层次的项目称为键(Key),位于顶层一级的 “HKEY_CLASSES_ROOT”、 “HKEY_CURRENT_USER”等六个键被称为根键 (RootKey),每个根键与某一类设置信息对应。键可以 包含子键及值,每个值由值名称和对应的数据组成。 “注册表编辑器”窗口左面部分用于显示各级的键与 子键,“+”、“-”按钮用于打开或折叠键。窗口右

53、面 部分用于显示当前键的各个值。从图9-7中我们看到名 称为“Class”的值具有数据“System”,值名称左侧的 图标指出其类型为字符串。 第第9 9章章 Win32Win32编程编程 图9-7 “注册表编辑器”程序运行时的画面 第第9 9章章 Win32Win32编程编程 9.4.2 TRegistry类 BCB中主要通过TRegistry类使用注册表,使用 TRegistry类的应用程序项目应包含Registry.hpp文件。 下面介绍TRegistry类的主要属性和方法。 1Access属性 Access属性用于在打开注册表的一个键时指定安 全级别。 2CurrentKey属性 Cu

54、rrentKey属性确定注册表中当前键。 第第9 9章章 Win32Win32编程编程 3CurrentPath属性 CurrentPath属性指出注册表中当前键的完整路径。 4RootKey属性 RootKey属性为TRegistry 对象指定根键,OpenKey 等操作都与该属性的设置有关。缺省的设置为 HKEY_CURRENT_USER。 5CloseKey方法 CloseKey方法关闭当前键。 6CreateKey方法 CreateKey方法创建一个新键。 第第9 9章章 Win32Win32编程编程 7DeleteKey方法 DeleteKey方法删除一个键。 8GetDataSiz

55、e方法 GetDataSize方法返回当前键值的长度,单位是字节。 9GetDataType方法 GetDataType方法返回当前键值的类型,返回值为 rdUnknown、rdString、rdExpand-String、rdInteger、 rdBinary之一。 第第9 9章章 Win32Win32编程编程 10GetKeyNames方法 GetKeyNames方法返回当前键所有子键(不包含值) 的键名,类型为字符串列表(TStrings)。 11GetValueNames方法 GetValueNames方法返回当前键所有值的名称,类 型为字符串列表(TStrings)。 12HasSu

56、bKeys方法 HasSubKeys方法是指当前键有子键(不包含值)时返 回值为true。 第第9 9章章 Win32Win32编程编程 13KeyExists方法 KeyExists方法是指某特定键(不包含值)存在时返回 值为true。 14OpenKey方法 OpenKey方法是指打开注册表的一个键。 15ReadInteger方法 ReadInteger方法是指从当前键读取一个指定值的整 型数据。 16ReadBool方法 ReadBool方法是指从当前键读取一个指定值的布 尔型数据。 第第9 9章章 Win32Win32编程编程 17ReadDate方法 ReadDate方法是指从当前

57、键读取一个指定值的日期型数据。 18ReadFloat方法 ReadFloat方法是指从当前键读取一个指定值的浮点型数据。 19ReadString方法 ReadString方法是指从当前键读取一个指定值的字符串型数据。 20ReadTime方法 ReadTime方法是指从当前键读取一个指定值的时间型数据。 第第9 9章章 Win32Win32编程编程 21WriteInteger方法 WriteInteger方法是指向当前键的指定值写入一个整型数据。 22WriteBool方法 WriteBool方法是指向当前键的指定值写入一个布尔型数据。 23WriteDate方法 WriteDate方法

58、是指向当前键的指定值写入一个日期型数据。 第第9 9章章 Win32Win32编程编程 24WriteFloat方法 WriteFloat方法是指向当前键的指定值写入一个浮点型数据。 25WriteString方法 WriteString方法是指向当前键的指定值写入一个字符串型数据。 26WriteTime方法 WriteTime方法是指向当前键的指定值写入一个时间型数据。 第第9 9章章 Win32Win32编程编程 9.4.3 访问Windows系统信息 许多Windows系统信息都保存在注册表内,通常它 们存放的位置是固定的。有许多技术资料和参考书介 绍注册表上保存的各种Windows信

59、息的意义。这些值 有的是只读的,也有的可以修改(一般可用“注册表编 辑器”编辑这些值)。应用程序有时需要读写这些值, 在BCB中可以利用TRegistry类做到这一点。 第第9 9章章 Win32Win32编程编程 下面我们介绍在程序中读取计算机用户和用户单位 名称的方法,应用程序与用户 对话时可能要用到该名称。该两项名称通常存放 在注册表中 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWin dowsCurrentVersion键(或HKEY_LOCAL_MACHINE SOFTWAREMicrosoftWindows NTCurrent Version 键)的名称

60、为RegisteredOwner和RegisteredOrganization 的两个值内。我们可以用下面的代码读取这两个值后 并把它们显示到窗体的标题上: 第第9 9章章 Win32Win32编程编程 TRegistry* Registry = new TRegistry; Registry-RootKey = HKEY_LOCAL_MACHINE; Registry-OpenKey (SOFTWAREMicrosoftWindowsCurrentVersion, TRUE); AnsiString astr; astr = Registry-ReadString (RegisteredOr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论