• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        在Delphi中運用自定義光標

        在Delphi中運用自定義光標

        更新時間:2022-05-10 文章作者:未知 信息來源:網絡 閱讀次數:

        開發者都希望自己的程序有一個友好的界面,此時,一個生動活潑、有表現力的光標就必不可少了。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中調試通過。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 野花高清在线电影观看免费视频| 人妻在线日韩免费视频| 99久久这里只精品国产免费| 亚洲AV无码专区国产乱码电影 | 2022中文字字幕久亚洲| 婷婷亚洲综合一区二区| 日本免费电影一区| 深夜福利在线免费观看| 亚洲AV无码成H人在线观看| rh男男车车的车车免费网站| 国产AV无码专区亚洲AV手机麻豆| 无码人妻一区二区三区免费手机| 亚洲一区二区三区高清| 永久免费在线观看视频| 精品国产成人亚洲午夜福利| 日韩视频在线免费| 日本中文字幕免费看| 亚洲精品卡2卡3卡4卡5卡区| 免费女人高潮流视频在线观看 | 国产在线观看免费视频播放器| 亚洲色成人四虎在线观看| 吃奶摸下高潮60分钟免费视频| 国产亚洲视频在线观看| 亚洲精品无码mv在线观看网站| 99久热只有精品视频免费观看17| 亚洲毛片基地4455ww| 亚洲成a人在线看天堂无码| a在线视频免费观看| 亚洲成a人片在线观看精品| 国产人妖ts在线观看免费视频| 国产精品永久免费视频| 亚洲午夜视频在线观看| 免费毛片在线播放| 精品国产免费一区二区三区| 亚洲邪恶天堂影院在线观看| 女人张开腿等男人桶免费视频| a毛片成人免费全部播放| 久久久久亚洲av无码专区导航| 永久黄网站色视频免费直播| 在线观看免费无码视频| 日韩电影免费在线观看视频|