说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在Delphi中使用自定义光标

HTML文档下载 WORD文档下载 PDF文档下载
在Delphi中使用自定义光标

开发者都希望自己的程序有一个友好的界面,此时,一个生动活泼、有表现力的光标就必不可少了。Windows 缺省提供22种标准光标供在程序中调用,但对一个求新求变的程序员来说,标准光标就不能满足要求了,需要使用自己的光标,那么,在程序中怎样使用自己的光标呢?

●光标资源的获得

要使用自定义光标,必须先得到这些光标。光标文件有两种:静态光标(.cur)和动态光标(.ani)。你可以使用现成的光标文件,比如Delphi 自带的一组光标文件(在C:Program FilesBorlandDelphi 3ImagesCursors目录中),如果你安装了Windows98的桌面主题,则可在Windowsplus! 目录下找到许多光标文件。你也可以自己创建光标文件,比如使用Delphi自带的Image Editor 就可创建静态光标文件

(.cur),但Image Editor不能创建彩色光标,要创建彩色光标,必须使用其它工具,如Vc++ 的资源编辑器。动态光标则必须使用专门的工具软件制作,使用动态光标可达到光标的动画效果,动态光标文件的文件结构与AVI文件结构相似,由文字描述区、信息区、时间控制区、数据区四部分构成。Windows通过按文件时间控制区中指定的时间一帧帧播放文件数据区中包含的光标或图标图像来实现动画效果。

其实,分析文件结构可以发现,静态光标文件(.cur)与图标文件(.ico)结构非常类似,两种文件的主要差别仅在于文件头的文件识别码和是否存在跟踪点(Hot Spot)。文件识别码放在文件的头三个字节,图标文件为00 00 01,光标文件为00 00 02;图标文件没有跟踪点,光标文件的跟踪点信息放在文件的00 0A-00 0D 四个字节中,00 0A - 00 0B记录跟踪点的X 坐标,00 0C-00 0D 记录Y 坐标,记录顺序都是高位

在前,低位在后,图标文件的00 0A-00 0D 为保留位。知道了两者的差异,你就可以通过手工或编一个小程序来实现图标文件到光标文件的转换。相对于光标文件来说,图标文件要好找得多,颜色上也更丰富。

除了光标文件外,你也可以创建资源文件(.res )

在资源文件中包含光标资源

Delphi 同样可在程序中调用。可使用Image Editor 或Microsoft的资源编辑器创建资源文件(推荐使用Vc++的资源编辑器)。Delphi 缺省为每一个项目创建一个与项目名同名的资源文件,如你的项目名为test.dpr ,则资源文件名为test.res。但你如果把光标放在这个文件中,在程序中是无法调用的,必须创建自己的资源文件。在给光标资源命名时注意不要与已有的资源重名,创建好后,再在程序中使用编译指令$R将资源文件加在程序中,如资源文件为my.res

则在主窗体的Implementation下加上一行{$R my.res} 就可以了。

●自定义光标在程序中的使用

Delphi 使用自定义光标是通过调用Windows的API函数实现的。Delphi的Screen对象定义有一个Cursors 属性,属性声明为Property Cursors[Index:Interger]:Hcursor;Cursors属性实际记录了应用程序中使用的全部光标资源的句柄,Index 为每项资源的索引号。Delphi缺省提供的22种光标资源也在其中,Index值为-21~0。要使用自己的光标,首先可调用API函数 Loadcursorfromfile(对于光标文件)或使用Loadcursor(对于资源文件)获得相应光标的句柄,这两个函数都定义在Windows单元中,函数声明为:

Function LoadCursorFromFile(lpFileName:PAnsiChar):HCURSOR;stdcall;

//lpFilename为光标文件名。(两种光标都适用,只需具体指定光标文件名就可以

了。)

Function LoadCursor(hInstance: HINST; lpCursorName: PAnsiChar): HCURSOR;

stdcall;

//hInstance为应用程序的句柄,lpCursorName为光标资源的名字。在资源文件中只能包含静态光标资源,资源文件不支持动态光标这种格式的资源。两个函数的详细说明可参考Delphi的Win32帮助。

得到光标的句柄后,将这个句柄值添加到Cursors数组中,注意Index不要与已有的索引号重复,否则将覆盖已有的光标。要使用这个光标时,只要将该光标的Index赋值给元件的Cursor属性就可以了,Delphi根据这个索引号查找Cursors数组,找到该光标的句柄,并用Setcursor函数将这个句柄赋给元件。需要指出的是,程序结束时,不必调用Deletecursor函数释放光标资源,Delphi会自动释放它们。

●程序示例

unit Unit1;

interface

uses

Windows

Messages

SysUtils

Classes

Graphics

Controls

Forms

Dialogs;

type

TForm1 = class(TForm)

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

{$R my.res}//加载资源文件my.res

procedure TForm1.FormCreate(Sender: TObject);

const

crmy1=1;

crmy2=2;

crmy3=3;

var

result1

result2

result3:integer;

begin

result1:=loadcursorfromfile(′my.cur′);

if result1<>0 then //如果返回值为0,则调用失败!

screen.cursors[crmy1]:=result1

else

showmessage(′加载静态光标文件出错!′);

result2:=loadcursorfromfile(′my.ani′);

if result2<>0 then

screen.cursors[crmy2]:=result2

else

showmessage(′加载动态光标文件错误!′);

result3:=loadcursor(Hinstance

′mycursor′);

Hinstance为定义在System单元中的一个长整变量,其值为应用程序的句柄,由Delphi自己维护。

在加载资源文件的光标资源时,如果光标的名字为整数(Vc++的资源编辑器给资源的缺省名就为整数),就必须使用API函数Makeintresource将整数转换为PansiChar类型,再传递给Loadcursor函数。

例如:result:=Loadcursor(Hinstance

Makeintresource(101))}

if result3<>0 then

screen.cursors[crmy3]:=result3

else

showmessage(′加载资源文件中的光标资源出错!′);

//使用加载的光标,cursors[]数组为全局变量,可在程序的任何地方调用;

if result1<>0 then

screen.cursor:=crmy1;

if result2<>0 then

form1.cursor:=crmy2;

if result3<>0 then

screen.cursor:=crmy3;

end;

end.

程序在Windows95

Delphi3.0中调试通过。

VB用API播放 .wav 声音文件 VB用MCI指令进行多媒体编程 用VB5.0编写自己的MP3播放器 用VB6.0编写电脑抽奖程序 用VB6的双通道技术获得影碟片断 用VBScript制作活动主页 用VB编写DirectX7.0游戏(下) 用VB编写FLASH动画播放器 用VB设计VCD播放器 用VB实现队列播放MP3 用VB实现屏幕滚屏保护效果 用VB制作下雪的特技景象 用VB自制屏幕保护程序 用Visual Basic实现多画面播放功能 雨滴式的显示图片 -VB资料 在VB5.0中制作多媒体界面 在VB5中将英文字母及阿拉伯数字旋转任意角度 在VB5中如何使机箱内的小喇叭发出不同的声音? 在VB6.0中播放GIF动画 在VB应用程序中恰当的使用声音 在VB应用软件中实现动画效果 在VB中播放AVI文件 在VB中建立司旋转的文本特效 在VB中如何创建闪烁(标语)屏 在VB中显示动画鼠标图标 在VB中用PictureClip控件实现动画 在Visual Basic 6.0中实现自动播放VCD VB怎样在VB中播放Flash动画。 VB制作TopMost窗口 VB制作带有动画和声音的屏幕保护程序 VB制作自己的MP3播放器 急问FLash 高分求教:一个DataGrid显示双DataTable!走过路过都有份! 怎样代码控制servers中excel的合并单元格?? google能找到我了,散分咯 急问Flash. ADOCE怎样访问excel数据表格? 请 ccmoon(IzuaL) 和 cloudchen(陈系上) 进来领分, 我该怎么做? 关于将输入字母转换为大写的问题! 谁给我解释这个sql语句! 怎么将sql server 6.x 的备份文件,恢复到sql server 7上 请教pb中有没有模式窗口和非模式窗口的概念?? 设备内容句柄在Delphi中有这个类吗?如何表示? hxzhappy(冰雨)快来接分 请问在contexMenu控件中show方法如何写 请问用VC,如何在WIN2000下连接一个SQL数据源? 入参与出参 关于国外发布的软件,可以使注册用户在线或取注册码! win2000下怎样建立代理服务器 有关DBGrid的问题。 在其他版看到一个很有意思的贴子“如果是你招聘人,你会不会招和自己技术,资历差不多的,甚至超过自己水平的?”欢迎大家讨论。 急!关于innerhtml的错误? hxzhappy(冰雨)快来接分 在线求助,急 请教各位,我的sybase的数据库的log设备(即syslogs表)最近增长很快,每天增长40多兆,如何解决??? 想做一个网络代理上网 c语言中三维数组的问题??? 求助:word文件加密后忘记密码如何打开原文件? 请教 : photoshop 中--highlight shadow midtone 提问,非高手勿入,打印的问题,100分,不够另加 关于oracle预留字作字段名的问题。 ● 求助,2000 Professional一登录就自动注销,怎么解决? 一个很棘手的问题? 谁给我解释这个JS函数 請高手幫改寫一段datagrid程序. (100分相送) (2)菜鸟问题!!容易拿分呀!! 如何在SQL SERVER上实现ORACLE中的package的功能 对windows编程,如何控制鼠标箭头阿 在2000下,希望不同的账号登陆,文件的可见属性不一样,能做到吗? 页面元素隐藏的问题 急 读文本出现乱码??? 高分求演示制作软件一个,以前知道lotus123可以做,可是找不到下载!!! 如何使窗口最大化? 请问:怎样使jar包里的类能读取同在此jar包中的一个xml文件 关于table 如何远程执行ORACLE上的存储过程? 有关toolbutton的用法 公布我公司的MS 2000技术支持客户号,呵呵! 关于使用组件是出现“没有注册类别” 高分求数据库操作类(查询、更新、事务等),共同提高。分不够可载开贴! error C2065: 'CMyPointDoc' : undeclared identifier 请帮解决! 把一个圆柱体的侧面展开,得到一个长31.4厘米,宽10厘米的长方形,这个圆柱体的侧面积是( )平方厘米,表面积是( )平方厘米. 如果想学室内设计..什么书做启蒙比较好 世界上为什么有人啊求大神帮助 世界上为什么有我们求大神帮助啊是大三的 阿萨德是阿杜 海水能吃吗 宁夏水利工程局用英文怎么念? 海水可以吃吗? 小鲸鱼吃奶的时候海水会不会吃下去?都是液体,如果一起吃下去了那乳汁岂不是稀释了 这个巫毒娃娃有什么含义这个巫毒娃娃叫什么,代表什么含义? 每个人对生命都有不同的诠释,或语言,或思想,或行动,我们该如何面对死亡的思考呢? f(x)=|2x+1|-|2x-1|的奇偶性? 美民调:58%民众支持大麻合法化 比澳大利亚11岁男孩因纵火被关“虚拟软美国首条高铁动工 48公里长穿越加州美国被曝监听意大利民众通讯 意政府或以情报部长质疑伊朗谈判诚意 呼吁美国津巴布韦官员:中对非实行新殖民主义属美称在叙利亚西方记者有遭绑架危险 应飓风“雷蒙德”威力减弱 有望周三远离日本上传视频宣传争议领土主权 韩政府美国首条高铁动工 48公里长穿越加州津巴布韦官员:中对非实行新殖民主义属铁人三项赛落幕我国首部硅藻泥行业标准出台“万人同书中国梦”书法巡展百件作品送看晨报抢仙女山门票代金券跟着新尚旅游赏金秋麦好木my home肖家冲桥洞有辆僵尸车 占用通道一年多远东HAPPY购卡更名“购开心卡”美极焗阿根廷红虾龙湖别墅又火了硅藻泥 这样选
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘