如何判斷滑鼠游標是否進入TShape的範圍 |
答題得分者是:ccchen
|
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
delphiwww
資深會員 發表:145 回覆:363 積分:368 註冊:2002-03-13 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
1. 判斷按下滑鼠左鍵
可用Mouseup或mousedown Event 2. 判斷游標是否在TShape的範圍
可用MouseMove 3. 判斷游標進入TShape及離開可攔截CM_MOUSEENTER,CM_MOUSELEAVE
type TShape=class(ExtCtrls.TShape) procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; end; TForm1 = class(TForm) ... |
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
引言: 1. 判斷按下滑鼠左鍵 可用Mouseup或mousedown Event 2. 判斷游標是否在TShape的範圍 可用MouseMove 3. 判斷游標進入TShape及離開可攔截CM_MOUSEENTER,CM_MOUSELEAVE非常感謝william兄,delphiwww兄,及ccchen兄的指導 再請教: ccchen兄所提到的第2點及第3點 判斷游標是否在TShape的範圍可用MouseMove 判斷游標進入TShape及離開可攔截CM_MOUSEENTER,CM_MOUSELEAVE 請問 1: 當MouseMove 要move出TShape的範圍或move進TShape的範圍 那個臨界判斷點的程式碼要如何寫(並不按下滑鼠左鍵 直接移進或移出) 是否跟x,y 參數有關 如是 該如何寫 如不是該如何寫 2;如何攔截CM_MOUSEENTER,CM_MOUSELEAVE 小弟才疏學淺 希望不吝指教 天行健 君子當自強不息~~@.@type TShape=class(ExtCtrls.TShape) procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; end; TForm1 = class(TForm) ...
------
天行健 君子當自強不息~~@.@ |
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
1. 你可先直接試試這個(須 uses ExtCtrls)
在你的Form上type之後加上
type TShape=class(ExtCtrls.TShape) //直接繼承修改, 不須安裝新元件 procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; end; //Enter之臨界判斷點 procedure TShape.CMMouseEnter(var Message: TMessage); begin Screen.Cursor:=crHandPoint; end; procedure TShape.CMMouseLeave(var Message: TMessage); begin Screen.Cursor:=crDefault; end;如此你就可看到此兩Event之功能了 2. 若要Create新元件供以後用可如下 type TMyShape=class(ExtCtrls.TShape) //直接繼承修改, 不須安裝新元件 private FonMouseEnter:TNotifyEvent; FonMouseLeave:TNotifyEvent; protected procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; published property OnMouseEnter:TNotifyEvent read FonMouseEnter write FonMouseEnter; property OnMouseLeave:TNotifyEvent read FonMouseLeave write FonMouseLeave; end; procedure TMyShape.CMMouseEnter(var Message: TMessage); begin if Assigned(FOnMouseEnter) then FOnMouseEnter(self); end; procedure TMyShape.CMMouseLeave(var Message: TMessage); begin if Assigned(FOnMouseLeave) then FOnMouseLeave(self); end;如此將此元件Register至元件盤, 用此元件時就多了兩個Event |
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
1:如何將上述寫好的程式Register至元件盤如何做
寫在單獨一個Unit中, 並加入procedure Register
unit xxx;
type
...// type之定義 procedure Register; //加此行 implementation procedure Register;
begin
RegisterComponents('Samples',[TmyShape]);//第一參數為那一page,第二參數為你元件之classname
end; 然後由Menu上Component|Install component 加入此unit 2:是不是以後要用到某元件須增加屬性或事件就以此方式直接繼承去做即可
大致上沒問題,一般想要什麼屬性或事件就往Source Code看, 若在protected就直接宣告繼承就可用 method或Event也應先在protected 區看看是否有現成可override 以上均不行時要攔截message必須考慮是否會破壞原功能 另外還可用windowproc (Search 可找到Sample, 試試看, 有機會再談)
|
T.J.B
版主 發表:29 回覆:532 積分:497 註冊:2002-08-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |