在DELPHI中使用自定义光标是非常容易的,只有用几个API
函数就可以搞定。
最常见的用法是使用LoadCursorFromFile函数从文件载入光标(当然也可从资源中载入),然后使用SetClassLong函数替换掉指定窗体的光标,具体程序如下:
var
hOldCur: HICON;
hNewCur: HICON;
begin
Application.Initialize;
hOldCur := 0;
try
hNewCur := LoadCursorFromFile('G:\\001.ani');
if hNewCur <> 0 then
hOldCur := SetClassLong(Handle, GCL_HCURSOR, hNewCur);
Application.CreateForm(TForm5, Form5);
Application.Run;
finally
if hOldCur <> 0 then
SetClassLong(Handle, GCL_HCURSOR, hOldCur);
end;
end.
另一种用法是用自定义的光标覆盖掉Screen对象的Curosrs数组,具体代码如下:
var
hOldCur: HICON;
hNewCur: HICON;
begin
Application.Initialize;
hOldCur := Screen.Cursors[-11];
hNewCur := LoadCursorFromFile('G:\\001.dll');
if hNewCur <> 0 then
Screen.Cursors[-11] := hNewCur;
Application.CreateForm(TForm5, Form5);
Application.Run;
Screen.Cursors[-11] := hOldCur;
end.
其中,crDefault、crArrow等常数在Controls单元中定义:
const
crDefault = TCursor(0);
crNone = TCursor(-1);
crArrow = TCursor(-2);
crCross = TCursor(-3);
crIBeam = TCursor(-4);
crSize = TCursor(-22);
crSizeNESW = TCursor(-6);
crSizeNS = TCursor(-7);
crSizeNWSE = TCursor(-8);
crSizeWE = TCursor(-9);
crUpArrow = TCursor(-10);
crHourGlass = TCursor(-11);
crDrag = TCursor(-12);
crNoDrop = TCursor(-13);
crHSplit = TCursor(-14);
crVSplit = TCursor(-15);
crMultiDrag = TCursor(-16);
crSQLWait = TCursor(-17);
crNo = TCursor(-18);
crAppStart = TCursor(-19);
crHelp = TCursor(-20);
crHandPoint = TCursor(-21);
crSizeAll = TCursor(-22);
可以直接用括号中的索引值替代常数名,上例就是如此。
上面两种只是普通的用法,某些时候,可能会发现上面两种方法都不能令光标改变,那就要用一些特殊点的手段了,就是设置全局光标。
设置全局光标,要用到两个API函数(包括LoadCursorFromFile是三个):
SetSystemCursor 和 SystemParametersinfo
SetSystemCursor一看就知道是用来设置光标的,与之相反,SystemParametersinfo就是用来恢复系统默认光标的了(这个函数功能太强大,还有其它很多用途)。使用这种方法设置的光标是全局有效的(也就是离开自已程序的窗体还有效),而前面两种方法都做不到这一点。好了,还是看程序代码吧,非常简单的一段代码:
try
if FileExists('busy.dll') then
hCur := LoadCursorFromFile('busy.dll');
if hCur <> 0 then
SetSystemCursor(hCur, OCR_NORMAL);
//------------------------------------------
//做一些耗时的工作
//------------------------------------------
finally
SystemParametersinfo(SPI_SETCURSORS, 0, nil, SPIF_SENDCHANGE);
end;