PDA

View Full Version : حرفه ای: سوال- بدست آوردن مختصات یک شیع روی فرم



arman_Delta2002
چهارشنبه 29 آذر 1391, 11:24 صبح
سلام میخواستم بدونم ایا راحی هست که بشه مختصات قرار گیری یک شیع روی فرم رو بدست آورد
مختصات جایی که شیع در صفحه نمایش قرار داره نه جایی که روی فرمه!!!

مثلا top دکمه روی فرم برابر 40 ولی همین دکمه top اش در صفحه نمایش چنده؟
حالا یکم پیچیدش کنیم
فرمه یک فرم فرزنده و دارای پدر
حالا مختصات دکمه چنده؟

حالا موضوع رو پیچیده تر کنیم

این دکمه در داخل سلول های یک گرید تکرار شده!!! مختصات جاری اون در صفحه نمایش چیه؟

و یکم پیچیده تر یک پیکچر باکس داریم که داخل یک لایه در اکسترا گریده حالا مختصات اون چیه تو صفحه نمایش :قهقهه:
فکر کنم در آوردن این 2 عدد top وleft اون کار حضرت فیلم نیست :شیطان:

من که توش موندم :قهقهه: :گیج:

96915

مهرداد صفا
چهارشنبه 29 آذر 1391, 13:31 عصر
سلام
با استفاده از تابع GetWindowRect میتوانید مختصات کنترل را نسبت به صفحه به دست بیاورید.
یک متغیر از نوع Rect تعریف کنید، سپس هندل کنترل و متغیر را به تابع GetWindowRect بدهید تا بعد از اجرای تابع اندازه و مکان کنترل در متغیر ریخته شود:


'in the name of god

'صل الله عی محمد و آله


Public Class Form1

Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Integer, ByRef lpRect As RECT) As Integer

Structure RECT
Public Left As Integer
Public Top As Integer
Public Right As Integer
Public Bottom As Integer
End Structure

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Dim Button1Rectangle As RECT
GetWindowRect(Button1.Handle, Button1Rectangle)
MsgBox(Button1Rectangle.Left & "," & Button1Rectangle.Top)
End Sub
End Class

arman_Delta2002
چهارشنبه 29 آذر 1391, 15:31 عصر
سلام
با استفاده از تابع GetWindowRect میتوانید مختصات کنترل را نسبت به صفحه به دست بیاورید.
یک متغیر از نوع Rect تعریف کنید، سپس هندل کنترل و متغیر را به تابع GetWindowRect بدهید تا بعد از اجرای تابع اندازه و مکان کنترل در متغیر ریخته شود:


'in the name of god

'صل الله عی محمد و آله


Public Class Form1

Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Integer, ByRef lpRect As RECT) As Integer

Structure RECT
Public Left As Integer
Public Top As Integer
Public Right As Integer
Public Bottom As Integer
End Structure

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Dim Button1Rectangle As RECT
GetWindowRect(Button1.Handle, Button1Rectangle)
MsgBox(Button1Rectangle.Left & "," & Button1Rectangle.Top)
End Sub
End Class


مرسی ولی این روش واسه اشیاء ساده که هندل . system.IntPtr برمیگردونه کاربرد داره نه واسه اشیاءی که به صورت آرایه ای هستن و اصلا هندل ردیف دارن نه .Handle system.IntPtr

Saman_12
چهارشنبه 29 آذر 1391, 20:01 عصر
Dim ObjPFS As Point = Obj.PointToScreen(Point.Empty)

مهرداد صفا
چهارشنبه 29 آذر 1391, 22:26 عصر
مرسی ولی این روش واسه اشیاء ساده که هندل . system.IntPtr برمیگردونه کاربرد داره نه واسه اشیاءی که به صورت آرایه ای هستن و اصلا هندل ردیف دارن نه .Handle system.IntPtr



راهای زیادی برای این کار وجود دارد که یکی از ساده ترین و قوی ترین آنها به روش زیر می باشد:


'in the name of god
'صل الله علی محمد و آله

Public Class Form1

Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
For I = 0 To 9
For j = 0 To 9
DataGridView1(I, j).Value = DataGridView1.AccessibilityObject.GetChild(I).GetC hild(j).Bounds.Top & "," & DataGridView1.AccessibilityObject.GetChild(I).GetC hild(j).Bounds.Left
Next

Next
End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
DataGridView1.RowCount = 10
DataGridView1.Location = Point.Empty
DataGridView1.ColumnCount = 10
DataGridView1.Size = Me.Size
End Sub

Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
On Error Resume Next
Form1_Activated(sender, Nothing)
End Sub

End Class

یک dataGridView 10 در 10 را با مختصات خانه هایش در رویداد Form_Activated مقدار دهید کردی.
فرم را حرکت دهید تا مختصات هر سلول در صفحه را ببینید.
فراموش نکنید کتابخانه accessibility را به پروژه اضافه کنید.

arman_Delta2002
پنج شنبه 30 آذر 1391, 10:01 صبح
راهای زیادی برای این کار وجود دارد که یکی از ساده ترین و قوی ترین آنها به روش زیر می باشد:


'in the name of god
'صل الله علی محمد و آله

Public Class Form1

Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
For I = 0 To 9
For j = 0 To 9
DataGridView1(I, j).Value = DataGridView1.AccessibilityObject.GetChild(I).GetC hild(j).Bounds.Top & "," & DataGridView1.AccessibilityObject.GetChild(I).GetC hild(j).Bounds.Left
Next

Next
End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
DataGridView1.RowCount = 10
DataGridView1.Location = Point.Empty
DataGridView1.ColumnCount = 10
DataGridView1.Size = Me.Size
End Sub

Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
On Error Resume Next
Form1_Activated(sender, Nothing)
End Sub

End Class

یک dataGridView 10 در 10 را با مختصات خانه هایش در رویداد Form_Activated مقدار دهید کردی.
فرم را حرکت دهید تا مختصات هر سلول در صفحه را ببینید.
فراموش نکنید کتابخانه accessibility را به پروژه اضافه کنید.
توجه کرده باشید در عکس فوق یک گرید ویو نیست یک لایوت ویو هست که از dev نشعت گرفته شده ولی باز هم متشکرم