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

如何將滑鼠的觸發區域加大?

答題得分者是:jow
harktrip
一般會員


發表:30
回覆:30
積分:12
註冊:2007-04-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-12-13 08:30:06 IP:61.221.xxx.xxx 訂閱
各位兄弟,問題是這樣的.

例如我有一個TImage元件
大小是 100x50
但我希望滑鼠click和move的感應區域
變成 104x54,但TImgae的大小不變


也就是上下左右 各往外移兩個點
這可以辦的到嗎?

(要做這功能是因為 常常因為上下有兩個TImage重疊,要點到上面TImage的邊緣不好點
常會點到下面那個TImage)



jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-12-13 09:49:39 IP:210.66.xxx.xxx 訂閱
試試小動作...

[code delphi]
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
P: TPoint;
r: TRect;
begin

r := Image1.BoundsRect;
InflateRect(r, 5, 5);

Canvas.Brush.Style := bsClear;
Canvas.Rectangle(r);

GetCursorPos(P);
if PtInRect(r, ScreenToClient(P)) then
Label1.Caption := 'PtInRect'
else Label1.Caption := '--------';


end;

[/code]
harktrip
一般會員


發表:30
回覆:30
積分:12
註冊:2007-04-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-12-14 08:33:00 IP:61.221.xxx.xxx 訂閱
jow大,
可是我的TImage物件是動態產生的.

每一個TImage的MouseMove事件是對應到同一個副程式

所以jow大,你的範例我試了一下,應用在 TImage的MouseMove事件裡並不合用

我要如何去寫在Form1的MouseMove裡,然後去對應到我的副程式?
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-12-14 09:33:55 IP:210.66.xxx.xxx 訂閱
Mouse 動作發生在TImage BoundsRerct 以外的區域
應該何者來處理比較洽當?! 即使改寫 TImage 中, 與Mouse
相關的Method, 上述的考量點也無法避免吧?!

隨文貼附的程式碼,
只是建議一個思考的方向而已...

[code delphi]
unit fMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
private
FActiveImage: TImage;
procedure SetActiveImage(const Value: TImage);
public
property ActiveImage: TImage read FActiveImage write SetActiveImage;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
I: Integer;
P: TPoint;
r: TRect;
O: TImage;
begin

GetCursorPos(P);
P := ScreenToClient(P);

O := nil;
for I := 0 to ControlCount-1 do
if Controls[I] is TImage then
begin
r := Controls[I].BoundsRect;
InflateRect(r, 5, 5);
if PtInRect(r, P) then
begin
O := TImage(Controls[I]);
Break;
end;
end;

ActiveImage := O;

end;

procedure TForm1.SetActiveImage(const Value: TImage);
var
r: TRect;
begin
if Value <> FActiveImage then
begin
FActiveImage := Value;

Repaint;
if Assigned(FActiveImage) then
begin
r := FActiveImage.BoundsRect;
InflateRect(r, 5, 5);
Canvas.DrawFocusRect(r);
end;


end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
r: TRect;
I, col, row, w, h: Integer;
begin
Width := 320;
Height := 350;

w := 100;
h := 100;
for I := 0 to 8 do
begin
with TImage.Create(Self) do
begin
Tag := I;
col := I mod 3;
row := I div 3;
r := Rect(w*col, h*row, w*(col 1), h*(row 1));
InflateRect(r, -6, -6);
BoundsRect := r;
Parent := Self;
OnMouseMove := FormMouseMove;
end;
end;

end;
[/code]
編輯記錄
jow 重新編輯於 2007-12-14 09:55:07, 註解 無‧
系統時間:2024-04-26 22:39:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!