<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    如鵬網(wǎng) 大學生計算機學習社區(qū)

    CowNew開源團隊

    http://www.cownew.com 郵件請聯(lián)系 about521 at 163.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks
    ?

    三、開關控件TlincoSwitch

    用過Delphi1(好古老的東東呀!)的人相信都記得這個開關控件 r_delphicomdev3-1.jpg,不知道當初Borland為什么把這么一個在開發(fā)普通應用程序中應用不到的工控控件放到Delphi中,而且在Delphi2及其以后的版本中再也沒有見過它的身影。讓我們懷著懷舊的心情把這位“開國元老”請出來吧!

    1、建立位圖資源文件:

    Image Editor建立一個Res文件,并在文件中分別建立下面兩個位圖r_delphicomdev3-1.jpgr_delphicomdev3-2.jpg,并分別命名為SWITCHONSWITCHOFF。保存此Res到控件單元所在目錄下。

    2、寫控件代碼。

    unit LincoSwitch;

    interface

    uses

    ? SysUtils, Classes, Controls, Graphics, Windows;

    ?

    type

    ? TLincoSwitch = class(TCustomControl)

    ? private

    ??? FIsOn: Boolean;

    ??? FPicOn: Graphics.TBitmap;

    ??? FPicOff: Graphics.TBitmap;

    ??? procedure FSetIsOn(AValue: Boolean);

    ? protected

    ??? procedure Click;override;

    ??? procedure Paint;override;

    ? public

    ??? constructor Create(AOwner: TComponent);override;

    ??? destructor Destroy;override;

    ? published

    ??? property IsOn: Boolean read FIsOn write FSetIsOn;

    ??? property OnClick;

    ??? property OnKeyDown;

    ??? property OnKeyPress;

    ??? property OnKeyUp;

    ??? property OnCanResize;

    ??? property OnDblClick;

    ??? property OnMouseDown;

    ??? property OnMouseMove;

    ??? property OnMouseUp;

    ??? property OnMouseWheel;

    ??? property OnResize;

    ? end;

    ?

    procedure Register;

    implementation

    {$R *.res}

    procedure LoadBitmapFromRes(ABitmapId: string; ABitmap: Graphics.TBitmap);

    begin

    ? ABitmap.LoadFromResourceName(hInstance, ABitmapId);//從資源文件中讀取位圖

    end;

    ?

    constructor TLincoSwitch.Create(AOwner: TComponent);

    begin

    ? inherited Create(AOwner);

    ? FPicOn := Graphics.TBitmap.Create;

    ? FPicOff := Graphics.TBitmap.Create;

    ? LoadBitmapFromRes('SWITCHON', FPicOn);

    ? LoadBitmapFromRes('SWITCHOFF', FPicOff);

    ? Invalidate;

    end;

    ?

    destructor TLincoSwitch.Destroy;

    begin

    ? FPicOn.Free;

    ? FPicOff.Free;

    ? inherited;

    end;

    ?

    procedure TLincoSwitch.Click;

    begin

    ? IsOn := not IsOn;//改變按鈕的狀態(tài)

    ? Invalidate;

    ? inherited;

    end;

    ?

    procedure TLincoSwitch.Paint;

    begin

    //畫開關圖案?

    if IsOn then

    ???

    ????? StretchBlt(Canvas.Handle, 0, 0, self.Width, self.Height, FPicOn.Canvas.Handle,

    ???????????? 0, 0, FPicOn.Width, FPicOn.Height,SRCCOPY)

    ? else

    ????? StretchBlt(Canvas.Handle, 0, 0, self.Width, self.Height, FPicOff.Canvas.Handle,

    ???????????? 0, 0, FPicOff.Width, FPicOff.Height,SRCCOPY);

    end;

    ?

    ?

    procedure TLincoSwitch.FSetIsOn(AValue: Boolean);

    begin

    ? FIson := AValue;

    ? Invalidate;

    end;

    ?

    procedure Register;

    begin

    ? RegisterComponents('Linco', [TLincoSwitch]);

    end;

    end.

    3、代碼分析

    ? 1)、因為我們要在控件表面上將按鈕的圖案畫出來,所以我們選擇TcustomControl做為父類控件,因為它有個Canvas屬性,我們可以利用Canvas在控件表面作圖。不選用Tcontrol的原因是因為它有很多我們不需要的屬性。

    2)、ABitmap.LoadFromResourceName(hInstance, ABitmapId);是從資源文件中讀取IdAbitmapId的位圖,關于資源文件的使用請參考其他相關資料。注意代碼中的“{$R *.res}”,它的作用是將資源文件編譯到程序文件中,如果沒有這個預編譯條件,程序將會出現(xiàn)錯誤。

    3)、StretchBlt是將位圖畫到畫板上,使用方法請參考MSDN

    4)、我們?yōu)榭丶黾恿?/SPAN>IsOn屬性。這個布爾屬性用來表示開關的狀態(tài)(開/關)。

    property IsOn: Boolean read FIsOn write FSetIsOn;我們可以看出這個屬性是個可讀可寫的屬性。當讀這個屬性時會將FisOn的值返回給調用者,而寫屬性時則會調用FsetIsOn方法,并將賦給屬性的值做為參數(shù)傳遞給FsetIsOn。在FsetIsOn方法中,有如下實現(xiàn)代碼:

    ? FIson := AValue;

    ? Invalidate;

    首先將Fison設置為參數(shù)傳遞來的值,然后調用? Invalidate;要求重畫控件,以告訴用戶控件的狀態(tài)已經(jīng)改變,這一點是使用寫字段無法做到的。

    5???

    ??? FPicOn: Graphics.TBitmap;

    FPicOff: Graphics.TBitmap;

    是聲明兩個.Tbitmap類型變量以保存控件的開關兩種狀態(tài)的圖案。

    6

    ??? procedure Click;override;

    procedure Paint;override;

    分別是覆蓋父類中相應的調度方法。當控件被鼠標單擊時,Click方法會被調用,我們將在Click中改變控件的開關狀態(tài);Paint方法則在用戶調用? Invalidate方法或控件發(fā)生重畫時調用,我們一般在這個方法繪制控件的圖案。

    7)、TcustomControl中又很多事件處理句柄。比如OnClickOnKeyDown等,但是它把他們聲明成了Protected保護級別,所以我們在Object Inspector中看不到他們,如果我們要他們可以在Object Inspector中被用戶編輯的話,只要在Published中重新聲明他們即可,不用寫他們的讀寫方法,只要使用:Property? 屬性名;

    這樣的方法就可以。比如這個例子中的:Property Onclick;

    思考題:

    1、??????? 做一個有特效的按鈕控件,當鼠標按下時按鈕是一個紅色邊框的空心圓,當鼠標松開時按鈕是一個淡綠色邊框的空心圓。

    2、??????? 對于父類控件中為protected的屬性,如果想將它在子類控件中公布,應該怎么做?請思考Delphi為什么要將一些屬性設為protected級別?

    posted on 2005-10-21 23:29 CowNew開源團隊 閱讀(2461) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 麻豆视频免费播放| 亚洲偷自拍另类图片二区| www国产亚洲精品久久久| 国产成人精品免费视频大| 国内精品99亚洲免费高清| 怡红院亚洲红怡院在线观看| 激情综合亚洲色婷婷五月APP| 亚洲成a人片在线观看无码专区| 免费又黄又爽又猛的毛片| 成人毛片免费观看| 最近中文字幕mv免费高清在线| 丁香花在线观看免费观看图片| jzzijzzij在线观看亚洲熟妇| 亚洲人成综合网站7777香蕉| 亚洲黄色三级视频| 亚洲av日韩av不卡在线观看| 久久精品国产亚洲Aⅴ香蕉| 国产成人啪精品视频免费网| 成人性生交大片免费看无遮挡| 222www免费视频| 1a级毛片免费观看| 最近的中文字幕大全免费8| 久久精品国产这里是免费| 国产中文字幕在线免费观看| 亚洲免费视频一区二区三区| 一级美国片免费看| 一级特黄录像免费播放中文版| 国产亚洲精品欧洲在线观看| 国产免费看JIZZ视频| 一级毛片**不卡免费播| 久久午夜免费鲁丝片| 国产精品偷伦视频观看免费| 成在线人免费无码高潮喷水| 中国一级特黄的片子免费 | 朝桐光亚洲专区在线中文字幕| 一本色道久久88亚洲精品综合| 亚洲一区AV无码少妇电影| 亚洲爆乳大丰满无码专区| 看Aⅴ免费毛片手机播放| 特黄aa级毛片免费视频播放| sss在线观看免费高清|