با سلام
من می خوام با کلیک بر روی هر نقطه از فرم مختصات X اون رو بدست بیارم ( برای انجام این کار مشکلی ندارم )اما در قسمتهایی که روی فرم کنترلی وجود داشته باشه این کار انجام نمی شه .
آیا این کار اصلا شدنی است ؟
آیا روش دیگه ای هم وجود داره ؟
متشکرم
با سلام
من می خوام با کلیک بر روی هر نقطه از فرم مختصات X اون رو بدست بیارم ( برای انجام این کار مشکلی ندارم )اما در قسمتهایی که روی فرم کنترلی وجود داشته باشه این کار انجام نمی شه .
آیا این کار اصلا شدنی است ؟
آیا روش دیگه ای هم وجود داره ؟
متشکرم
باید توی رویداد کلیک کنترل هم کد بزنی مثل
PrivateSubButton1_MouseClick(ByValsenderAsObject, ByValeAsSystem.Windows.Forms.MouseEventArgs) HandlesButton1.MouseClick
MessageBox.Show(e.Location.X)
MessageBox.Show(e.Location.Y)
EndSub
به خاطر پاسخگویی متشکرم
اما اگه کنترل مورد نظر از نوع ShockwaveFlash Object بود چی ؟
چطوری میشه فهمید که کجای اون کنترل کلیک شده ؟
متشکرم
فرق نداره توی رویداد کلیک هرچی میخوای بنویسید
سلام
در ویژوال بیسیک هنگامی که شما روی کنترلی کلیک می کنید،
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)
چرا اینقدر دردهسر!؟
وقتی میشه توی یه رویداد با 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 که نوشتم، مختصات ماوس در کل صفحه نمایش رو بر می گردونه، حتی اگه خارج از فرم شما باشه. پس به دست آورن مختصات ماوس رو فرم، به عهده خود برنامه نویسه.
ئوست عزیز برای تمام 20 کنترل هم می توان یک تابع نوشتتازه این یه قسمت مشکل هست. فرض کنید روی فرم شما بیش از 20 تا کنترل متفاوت ریخته. شما باید برای روال mouse move تمام کنترلهات این رو تعریف کنی. حالا مهم نیست به چه روشی تعریف میکنی، اما باید این رو تو کت سیستم بکنی که چه کاری رو انجام بدی
با دستور Control.MousePosition می توانید در هرجا از برنامه موقعیت موس را بدست اوری حتی اگر موس بیرون باشداما با استفاده از توابع api این مشکل رو دیگه نداری. کافیه هر جای برنامه که می خوای، حالا توی روال کلیک باشه یا توی یه تایمر، مختصات ماوس رو بر می گردونی. اینجوری کد نویسی کمتری می خواد.
البته این توضیح رو هم بدم که api که نوشتم، مختصات ماوس در کل صفحه نمایش رو بر می گردونه، حتی اگه خارج از فرم شما باشه. پس به دست آورن مختصات ماوس رو فرم، به عهده خود برنامه نویسه.
سلام غفوری جان. من هم عرض کردم، "مهم نیست به چه روشی تعریف می کنی."
روشی control.mouseposition رو هم فکر می کنم که توی framework 2 اضافه شده باشه؟ ممنونم. این رو من بلد نبودم.
سلام دوستان
حالا که دارم این پست رو می زنم، خونه هستم، 2003 ندارم. مثالی که واستون می زنم با 2005 هست.
اما همین رو توی اداره با 2003 نوشتم. کار می کنه. فعلا هم توی یکی از برنامه هام استفاده می شه.
این هم نمونه:
کدی که ازش توی برنامه استفاده کردم:
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
با سلام
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
فقط این کد یک مشکل کوچیکی که داره اینه که در تمام صفحه ی کاری ویندوز کار میکنه که با کمی تغییر میشه اون رو درست کرد