delphi自訂游標

來源:互聯網
上載者:User

開發人員都希望自己的程式有一個友好的介面,此時,一個生動活潑、有表現力的游標就必不可少了。Windows 預設提供22種標準游標供在程式中調用,但對一個求新求變的程式員來說,標準游標就不能滿足要求了,需要使用自己的游標,那麼,在程式中怎樣使用自己的游標呢?   ●游標資源的獲得   要使用自訂游標,必須先得到這些游標。游標檔案有兩種:靜態游標(.cur)和動態游標(.ani)。你可以使用現成的游標檔案,比如Delphi 內建的一組游標檔案(在C:/Program Files/Borland/Delphi 3/Images/Cursors目錄中),如果你安裝了Windows98的桌面主題,則可在/Windows/plus! 目錄下找到許多游標檔案。你也可以自己建立游標檔案,比如使用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中調試通過。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.