PDA

View Full Version : مختصات کلیک بر روی فرم



mehdi58
سه شنبه 02 مرداد 1386, 13:55 عصر
با سلام
من می خوام با کلیک بر روی هر نقطه از فرم مختصات X اون رو بدست بیارم ( برای انجام این کار مشکلی ندارم )اما در قسمتهایی که روی فرم کنترلی وجود داشته باشه این کار انجام نمی شه .
آیا این کار اصلا شدنی است ؟
آیا روش دیگه ای هم وجود داره ؟
متشکرم

Business Analyst
سه شنبه 02 مرداد 1386, 14:11 عصر
باید توی رویداد کلیک کنترل هم کد بزنی مثل

PrivateSubButton1_MouseClick(ByValsenderAsObject, ByValeAsSystem.Windows.Forms.MouseEventArgs) HandlesButton1.MouseClick
MessageBox.Show(e.Location.X)
MessageBox.Show(e.Location.Y)
EndSub

mehdi58
سه شنبه 02 مرداد 1386, 22:00 عصر
به خاطر پاسخگویی متشکرم
اما اگه کنترل مورد نظر از نوع ShockwaveFlash Object بود چی ؟
چطوری میشه فهمید که کجای اون کنترل کلیک شده ؟
متشکرم

Business Analyst
سه شنبه 02 مرداد 1386, 23:52 عصر
فرق نداره توی رویداد کلیک هرچی میخوای بنویسید

saeed_rezaei
چهارشنبه 03 مرداد 1386, 21:48 عصر
باید توی رویداد کلیک کنترل هم کد بزنی مثل

PrivateSubButton1_MouseClick(ByValsenderAsObject, ByValeAsSystem.Windows.Forms.MouseEventArgs) HandlesButton1.MouseClick
MessageBox.Show(e.Location.X)
MessageBox.Show(e.Location.Y)
EndSub


سلام
در ویژوال بیسیک هنگامی که شما روی کنترلی کلیک می کنید،
ByVal e As System.EventArgs
ارسال می شه که اطلاعاتی در مورد مختصات بهتون نمی ده.
البته تاجایی که من یاد گرفتم. حالا شاید یه جورایی بشه این کار رو کرد نمی دونم.

اما برای به دست آوردن مختصات ماوس، باید از توابع api استفاده کنید.


DeclareFunction GetCursorPos Lib"user32" (ByRef lpPonit As POINTAPI) As Int32


شما باید یه ورودی که به صورت زیر تعریف می شه بهش بدید.



Structure POINTAPI
Dim x As Int32
Dim y As Int32
EndStructure



حالا هر جایی که می خواید مختصات رو به دست بیارید، حتی اگه خارج از محدوده فرمتون باشه از کد زیر بهره بگیرید


Dim pp As POINTAPI
GetCursorPos(pp)
MsgBox(pp.x)
MsgBox(pp.y)

Business Analyst
چهارشنبه 03 مرداد 1386, 22:22 عصر
چرا اینقدر دردهسر!؟
وقتی میشه توی یه رویداد با 2 خط کد حلش کرد لزومی نداره
البته بستگی داره جسارت نباشه
ممنون

saeed_rezaei
پنج شنبه 04 مرداد 1386, 15:34 عصر
چرا اینقدر دردهسر!؟
وقتی میشه توی یه رویداد با 2 خط کد حلش کرد لزومی نداره
البته بستگی داره جسارت نباشه
ممنون

دوست من، نمی دونم شما به ورژنی از وی بی کار می کنید. اما توی 2003 و 2005 ، هنگامی که شما رویداد کلیک رو تعریف می کنید به صورت زیر هست.



PrivateSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


دقت کنید، نوع پارامتر e به صورت System.EventArgs تعریف می شه. که در این صورت هیچ گونه اطلاعاتی در مورد محل و مختصات ماوس به این تابع ارسال نمی شه. در عوض در mousempve شما پارامتر ورودی رو به صورت
ByVal e As System.Windows.Forms.MouseEventArgs
دریافت میکنید. شما در روال mousemove می تونید مختصات ماوس رو دریافت کنید.
تازه این یه قسمت مشکل هست. فرض کنید روی فرم شما بیش از 20 تا کنترل متفاوت ریخته. شما باید برای روال mouse move تمام کنترلهات این رو تعریف کنی. حالا مهم نیست به چه روشی تعریف میکنی، اما باید این رو تو کت سیستم بکنی که چه کاری رو انجام بدی
اما با استفاده از توابع api این مشکل رو دیگه نداری. کافیه هر جای برنامه که می خوای، حالا توی روال کلیک باشه یا توی یه تایمر، مختصات ماوس رو بر می گردونی. اینجوری کد نویسی کمتری می خواد.
البته این توضیح رو هم بدم که api که نوشتم، مختصات ماوس در کل صفحه نمایش رو بر می گردونه، حتی اگه خارج از فرم شما باشه. پس به دست آورن مختصات ماوس رو فرم، به عهده خود برنامه نویسه.

ghafoori
پنج شنبه 04 مرداد 1386, 18:30 عصر
تازه این یه قسمت مشکل هست. فرض کنید روی فرم شما بیش از 20 تا کنترل متفاوت ریخته. شما باید برای روال mouse move تمام کنترلهات این رو تعریف کنی. حالا مهم نیست به چه روشی تعریف میکنی، اما باید این رو تو کت سیستم بکنی که چه کاری رو انجام بدی
ئوست عزیز برای تمام 20 کنترل هم می توان یک تابع نوشت


اما با استفاده از توابع api این مشکل رو دیگه نداری. کافیه هر جای برنامه که می خوای، حالا توی روال کلیک باشه یا توی یه تایمر، مختصات ماوس رو بر می گردونی. اینجوری کد نویسی کمتری می خواد.
البته این توضیح رو هم بدم که api که نوشتم، مختصات ماوس در کل صفحه نمایش رو بر می گردونه، حتی اگه خارج از فرم شما باشه. پس به دست آورن مختصات ماوس رو فرم، به عهده خود برنامه نویسه.
با دستور Control.MousePosition می توانید در هرجا از برنامه موقعیت موس را بدست اوری حتی اگر موس بیرون باشد

saeed_rezaei
پنج شنبه 04 مرداد 1386, 21:50 عصر
سلام غفوری جان. من هم عرض کردم، "مهم نیست به چه روشی تعریف می کنی."
روشی control.mouseposition رو هم فکر می کنم که توی framework 2 اضافه شده باشه؟ ممنونم. این رو من بلد نبودم.

mehdi58
جمعه 05 مرداد 1386, 20:04 عصر
چرا اینقدر دردهسر!؟
وقتی میشه توی یه رویداد با 2 خط کد حلش کرد لزومی نداره
البته بستگی داره جسارت نباشه
ممنون


دوست عزیز کنترل ShockwaveFlash Object رویدادی برای این کار نداره !!!

mehdi58
جمعه 05 مرداد 1386, 20:08 عصر
با دستور Control.MousePosition می توانید در هرجا از برنامه موقعیت موس را بدست اوری حتی اگر موس بیرون باشد
دوست عزیز این دستور توی VB.NET 2003 و کلیک روی برخی از کنترلها مثل ShockwaveFlash Object جواب نمی ده .

mehdi58
جمعه 05 مرداد 1386, 20:14 عصر
سلام
در ویژوال بیسیک هنگامی که شما روی کنترلی کلیک می کنید،
ByVal e As System.EventArgs
ارسال می شه که اطلاعاتی در مورد مختصات بهتون نمی ده.
البته تاجایی که من یاد گرفتم. حالا شاید یه جورایی بشه این کار رو کرد نمی دونم.

اما برای به دست آوردن مختصات ماوس، باید از توابع api استفاده کنید.


DeclareFunction GetCursorPos Lib"user32" (ByRef lpPonit As POINTAPI) As Int32


شما باید یه ورودی که به صورت زیر تعریف می شه بهش بدید.



Structure POINTAPI
Dim x As Int32
Dim y As Int32
EndStructure



حالا هر جایی که می خواید مختصات رو به دست بیارید، حتی اگه خارج از محدوده فرمتون باشه از کد زیر بهره بگیرید


Dim pp As POINTAPI
GetCursorPos(pp)
MsgBox(pp.x)
MsgBox(pp.y)


دوست عزیز به خاطر پاسخگویی متشکرم اما من نتونستم از روش شما استفاده کنم .
امکانش هست که نمونه ای رو ضمیمه کنین ( البته توی VB.NET 2003 )

Business Analyst
جمعه 05 مرداد 1386, 20:55 عصر
ئوست عزیز برای تمام 20 کنترل هم می توان یک تابع نوشت


با دستور Control.MousePosition می توانید در هرجا از برنامه موقعیت موس را بدست اوری حتی اگر موس بیرون باشد
اقای غفوری این کد روی شوکویو فلش کار نمیکنه!

Business Analyst
جمعه 05 مرداد 1386, 20:59 عصر
سلام
در ویژوال بیسیک هنگامی که شما روی کنترلی کلیک می کنید،
ByVal e As System.EventArgs
ارسال می شه که اطلاعاتی در مورد مختصات بهتون نمی ده.
البته تاجایی که من یاد گرفتم. حالا شاید یه جورایی بشه این کار رو کرد نمی دونم.

اما برای به دست آوردن مختصات ماوس، باید از توابع api استفاده کنید.


DeclareFunction GetCursorPos Lib"user32" (ByRef lpPonit As POINTAPI) As Int32


شما باید یه ورودی که به صورت زیر تعریف می شه بهش بدید.



Structure POINTAPI
Dim x As Int32
Dim y As Int32
EndStructure



حالا هر جایی که می خواید مختصات رو به دست بیارید، حتی اگه خارج از محدوده فرمتون باشه از کد زیر بهره بگیرید


Dim pp As POINTAPI
GetCursorPos(pp)
MsgBox(pp.x)
MsgBox(pp.y)

دوست عزیز کد شما هم مثل بنده و جناب غفوری برای شوکویو کار نمیکنه!

Business Analyst
جمعه 05 مرداد 1386, 21:01 عصر
سلام
در ویژوال بیسیک هنگامی که شما روی کنترلی کلیک می کنید،
ByVal e As System.EventArgs
ارسال می شه که اطلاعاتی در مورد مختصات بهتون نمی ده.
البته تاجایی که من یاد گرفتم. حالا شاید یه جورایی بشه این کار رو کرد نمی دونم.

اما برای به دست آوردن مختصات ماوس، باید از توابع api استفاده کنید.


DeclareFunction GetCursorPos Lib"user32" (ByRef lpPonit As POINTAPI) As Int32


شما باید یه ورودی که به صورت زیر تعریف می شه بهش بدید.



Structure POINTAPI
Dim x As Int32
Dim y As Int32
EndStructure



حالا هر جایی که می خواید مختصات رو به دست بیارید، حتی اگه خارج از محدوده فرمتون باشه از کد زیر بهره بگیرید


Dim pp As POINTAPI
GetCursorPos(pp)
MsgBox(pp.x)
MsgBox(pp.y)

این کد هم مثل مال بندخ و ]قای غفوری کار نمیکنه

saeed_rezaei
جمعه 05 مرداد 1386, 21:19 عصر
سلام دوستان
حالا که دارم این پست رو می زنم، خونه هستم، 2003 ندارم. مثالی که واستون می زنم با 2005 هست.
اما همین رو توی اداره با 2003 نوشتم. کار می کنه. فعلا هم توی یکی از برنامه هام استفاده می شه.
این هم نمونه:

saeed_rezaei
جمعه 05 مرداد 1386, 21:21 عصر
کدی که ازش توی برنامه استفاده کردم:


PublicClass Form1

Structure POINTAPI
Dim x As Int32
Dim y As Int32
EndStructure

DeclareFunction GetCursorPos Lib"user32" (ByRef lpPonit As POINTAPI) As Int32

PrivateSub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim pp As POINTAPI
GetCursorPos(pp)
txt_x.Text = pp.x
txt_y.Text = pp.y
EndSub
EndClass

amirsajjadi
شنبه 17 آذر 1386, 07:26 صبح
با سلام

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Timer1.Interval = 50
Timer1.Start()
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If MouseButtons = Windows.Forms.MouseButtons.Left Then
Me.Text = MousePosition.ToString
End If
End Sub


فقط این کد یک مشکل کوچیکی که داره اینه که در تمام صفحه ی کاری ویندوز کار میکنه که با کمی تغییر میشه اون رو درست کرد