Delphi 更换鼠标图标

DELPHI中使用自定义光标
在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;

你可能感兴趣的:(delphi,技术经验总结,delphi,api,工作)