全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2545
推到 Plurk!
推到 Facebook!

如何判斷滑鼠游標是否進入TShape的範圍

答題得分者是:ccchen
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-11-14 10:07:36 IP:61.220.xxx.xxx 未訂閱
請教各位大大 : 如何判斷滑鼠游標是否進入TShape的範圍且在該TShape內按下滑鼠左鍵 因之前完全沒碰過該元件  可否告知如何下手   謝謝    < >< > 天行健 君子當自強不息~~@.@
------
天行健
君子當自強不息~~@.@
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-11-14 10:18:40 IP:147.8.xxx.xxx 未訂閱
Using the OnMouseUp event of the shape?
procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
    if Button=mbLeft then
        MessageDlg('Left mouse click!', mtWarning, [mbOK], 0);
end;
delphiwww
資深會員


發表:145
回覆:363
積分:368
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-11-14 10:29:48 IP:202.145.xxx.xxx 未訂閱
procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if ssLeft in Shift then StatusBar1.SimpleText:='mouse down'; end;
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-11-14 10:36:14 IP:61.219.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-11-14 13:59:00 IP:61.220.xxx.xxx 未訂閱
引言: 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)
...
非常感謝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 小弟才疏學淺 希望不吝指教 天行健 君子當自強不息~~@.@
------
天行健
君子當自強不息~~@.@
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-11-14 14:57:51 IP:61.219.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-11-14 15:53:31 IP:61.220.xxx.xxx 未訂閱
謝謝ccchen兄  最後再請教一下 1:如何將上述寫好的程式Register至元件盤 如何做    2:是不是以後要用到某元件須增加屬性或事件   就以此方式直接繼承去做即可    < >< > 天行健 君子當自強不息~~@.@ 發表人 - T.J.B 於 2002/11/14 15:54:41
------
天行健
君子當自強不息~~@.@
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-11-14 16:33:58 IP:61.219.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-11-14 17:09:56 IP:61.220.xxx.xxx 未訂閱
再次感謝william兄,delphiwww兄,及ccchen兄的指導 天行健 君子當自強不息~~@.@
------
天行健
君子當自強不息~~@.@
系統時間:2024-11-25 13:39:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!