線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2649
推到 Plurk!
推到 Facebook!

如何滑鼠偵測重疊的元件

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


發表:2
回覆:4
積分:1
註冊:2008-01-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-08-06 17:35:15 IP:220.133.xxx.xxx 訂閱
 請問,在畫面中會有很多的paintbox元件,但paintbox元件會重疊在一起
有辦法在滑鼠點選後的x,y座標找出有n個元件,並且執行該n個元件的mouse event嗎?

ttnnrsseb
中階會員


發表:31
回覆:77
積分:51
註冊:2004-11-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-08-09 18:33:23 IP:220.229.xxx.xxx 訂閱
 Hi,
用迴圈判斷每一個PaintBox,
x有無在這個範圍 PaintBox ->Left PaintBox ->Width
y有無在這個範圍 PaintBox ->Top PaintBox ->Height
都有就表示被點中了。

也許有更聰明的方式…
chen412
一般會員


發表:2
回覆:4
積分:1
註冊:2008-01-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-08-15 08:54:45 IP:220.133.xxx.xxx 訂閱
我知道的方式也只有這個,但不知道各位高手是否有其他的方式可以做偵測重疊元件
jow
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-08-15 10:49:44 IP:175.181.xxx.xxx 未訂閱

[code delphi]
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
OnMouseDown := ___TEST;
for I := 0 to ControlCount-1 do
begin
if not (Controls[I] is TPaintBox) then Continue;
TPaintBox(Controls[I]).OnMouseDown := ___TEST;
end;
end;

procedure TForm1.___TEST(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
I: Integer;
pt: TPoint;
L: TStringList;
begin
L := TStringList.Create;
try
GetCursorPos(pt);
pt := Self.ScreenToClient(pt);
for I := 0 to ControlCount-1 do
begin
if not (Controls[I] is TPaintBox) then Continue;
if not PtInRect(Controls[I].BoundsRect,pt) then Continue;
L.Add(Controls[I].Name);
end;
ListBox1.Items.Text := L.Text;
finally
FreeAndNil(L);
end;
end;


[/code]

編輯記錄
jow 重新編輯於 2012-08-14 20:51:47, 註解 無‧
jow 重新編輯於 2012-08-14 21:08:36, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-08-15 12:49:20 IP:114.32.xxx.xxx 訂閱
jow前輩出手便知有沒有,借花獻佛將jow前輩的方式改成BCB版本 ^^

.h
class TForm1 : public TForm
{
__published: // User declarations
void __fastcall TForm1::___TEST(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};

.cpp
void __fastcall TForm1::FormCreate(TObject *Sender)
{
onMouseDown = ___TEST;
for (int I=0; I
if (!Controls[I]->ClassNameIs("TPaintBox")){
continue;
}
((TPaintBox*)Controls[I])->onMouseDown = ___TEST;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::___TEST(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
int I;
TPoint pt;
TStringList *L = new TStringList;
GetCursorPos(&pt);
pt = this->ScreenToClient(pt);
for (I=0; I
if (!Controls[I]->ClassNameIs("TPaintBox")){
continue;
}
if (!PtInRect(Controls[I]->BoundsRect, pt)){
continue;
}
L->Add(Controls[I]->Name);
}
ListBox1->Items->Text = L->Text;
delete L;
}
編輯記錄
taishyang 重新編輯於 2012-08-15 19:55:43, 註解 無‧
chen412
一般會員


發表:2
回覆:4
積分:1
註冊:2008-01-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-08-16 09:04:53 IP:220.133.xxx.xxx 訂閱
不好意思,請問FormCreate中的這兩行我編不過,要怎麼使用呢?
forbidden = ___TEST;
((TPaintBox*)Controls[I])->forbidden = ___TEST;

我用您的code再依 jow大的delphi的寫法改成OnMouseDown 就可以了!

void __fastcall TForm2::Button1Click(TObject *Sender)
{
if (!Controls[I]->ClassNameIs("TPaintBox")){
}
}
}
編輯記錄
chen412 重新編輯於 2012-08-15 19:06:06, 註解 無‧
chen412 重新編輯於 2012-08-15 19:07:00, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2012-08-16 09:56:59 IP:114.32.xxx.xxx 訂閱
因為網站本身的關係 onMouseDown會變成 OnMouseDown的字樣
chen412
一般會員


發表:2
回覆:4
積分:1
註冊:2008-01-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2012-08-16 10:19:38 IP:220.133.xxx.xxx 訂閱
原來如此,感謝兩位前輩!
===================引 用 taishyang 文 章===================
因為網站本身的關係 onMouseDown會變成 OnMouseDown的字樣

系統時間:2024-04-19 19:11:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!