PDA

View Full Version : یافتن مکان نشانگر TextBox به صورت X و Y



mr.sina.kh
جمعه 16 اردیبهشت 1390, 17:57 عصر
سلام. میخواستم بدونم چطور میشه مکان نشانگر TextBox رو به صورت X و Y به دست آورد ؟ مثلا نشانگر در متن Sina بین i و n هست. چجوری موقعیّت نشانگر در Form یا TextBox رو به صورت X و Y بدونم ؟

barbodsoft.com
جمعه 16 اردیبهشت 1390, 19:09 عصر
معمولا موقیت مکان نما در textbox رو به صورت مکان کارکتر (چندمین کارکتر textbox) به دست می یارن. ببین این بدردت می خوره. این کد مکان کارکتر textbox1 به صورت عدد در textbox2 نمایش می ده.


Private Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
TextBox2.Text = TextBox1.SelectionStart
End Sub

mr.sina.kh
شنبه 17 اردیبهشت 1390, 14:52 عصر
ممنون. امّا من به X و Y نیاز دارم نه مکان در متن.

شاید اگه بشه کاری کرد که نشانگر موس روی نشانگر TextBox بره, بشه از X و Y نشانگر موس استفاده کرد ! امّا چطوری؟

alimanam
شنبه 17 اردیبهشت 1390, 21:04 عصر
با سلام

خوب خیلی ساده است : :افسرده:

Private Sub TextBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseMove
Me.Text = "X = " & e.X & " Y = " & e.Y
End Sub

موفق باشید ./

barbodsoft.com
شنبه 17 اردیبهشت 1390, 21:13 عصر
با سلام

خوب خیلی ساده است : :افسرده:

Private Sub TextBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseMove
Me.Text = "X = " & e.X & " Y = " & e.Y
End Sub

موفق باشید ./

دوست عزیز جناب alimanam منظور این نبود.
به مطالب بالا یک کم بیشتر توجه کنید متوجه می شید. برای خودم هم سوال شده. چطور باید موقعیت مکان نما رو به صورت x , y در حال تایپ مشخص کرد.

alimanam
شنبه 17 اردیبهشت 1390, 21:53 عصر
دوست عزیز با همون روش هم میشد من سوال شما رو درست متوجه شدم خوب وقتی روی کاراکتر خاصی میرین ( کلیک میکنین ) عملاً کرسر به محلی رفته درسته ؟ خوب محل X و Y اون رو بدست میاری دیگه . اگه بازم متوجه نشدی از این کد پیچیده تر استفاده کن :


Imports System.Runtime.InteropServices
Public Class Form1

Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
ByVal hwnd As IntPtr, _
ByVal wMsg As Integer, _
ByVal wParam As Integer, _
ByVal lParam As Integer) As Integer

Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
ByVal hwnd As IntPtr, _
ByVal wMsg As Integer, _
ByVal wParam As Integer, _
ByVal lParam As IntPtr) As Integer

Public Const EM_LINEINDEX = &HBB
Public Const EM_POSFROMCHAR = &HD6
Public Const EM_CHARFROMPOS = &HD7

Public Declare Function CreateCaret Lib "user32" ( _
ByVal hWnd As Integer, _
ByVal hBitmap As Integer, _
ByVal nWidth As Integer, _
ByVal nHeight As Integer) As Integer

Public Declare Function ShowCaret Lib "user32" ( _
ByVal hWnd As Integer) As Integer

Public Declare Function SetCaretBlinkTime Lib "user32" ( _
ByVal wMSeconds As Integer) As Integer
Public Declare Function GetCaretBlinkTime Lib "user32" () As Integer

Public Structure POINTAPI
Public X As Integer
Public Y As Integer
End Structure

Function GetCharFromPos(ByVal txt As TextBoxBase, ByVal pt As Point) As Integer
Dim xy As Integer = (pt.X And &HFFFF) + ((pt.Y And &HFFFF) << 16)

Dim res As Integer
If TypeOf (txt) Is RichTextBox Then
Dim p As POINTAPI
p.X = pt.X
p.Y = pt.Y
Dim lp As IntPtr = IntPtr.Zero
lp = Marshal.AllocCoTaskMem(Marshal.SizeOf(p))
Marshal.StructureToPtr(p, lp, False)
res = SendMessage(txt.Handle, EM_CHARFROMPOS, 0, lp)
Marshal.FreeCoTaskMem(lp)
Else
res = SendMessage(txt.Handle, EM_CHARFROMPOS, 0, xy)
End If

Dim lineNumber As Integer = ((res And &HFFFF) >> 16)
Dim charIndex As Integer = (res And &HFFFF)
Dim lineStartIndex As Integer = SendMessage(txt.Handle, EM_LINEINDEX, lineNumber, 0)
Return lineStartIndex + charIndex
End Function

Private Sub TextBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseUp
Try
Dim pt As Point
Dim ret As Integer
pt = New Point(Cursor.Position.X, Cursor.Position.Y)
ret = GetCharFromPos(TextBox1, pt)
Me.Text = "Character Pos at (Y=" & pt.X & ",Y=" & pt.Y & ") is [" & ret & "]"
Catch ex As Exception

End Try
End Sub

End Class

موفق باشید ./

barbodsoft.com
یک شنبه 18 اردیبهشت 1390, 00:20 صبح
دوست من اون کدی که اول هم گذاشتی درست بود این هم درسته. منتها هدف این بود که در حال تایپ کردن برنامه تشخیص بده که موقعیت x , y چطور هست نه با موس.

Sina_Od
دوشنبه 30 خرداد 1390, 15:22 عصر
سلام. من همون Mr.Sina.Kh هستم که به دلیل این که به هیچ وجه و بدون دلیل مشخّصی قادر به ورود نبودم پروفایل جدیدی برای خودم ساختم.
منظور من دقیقا حرف barbod عزیز بود.
شاید اگه بیش تر توضیح بدم دوستان بیش تر متوجّه بشن : میخوام برنامه یک TextBox رو با هر تغییر در متنش زیر نظر داشته باشه تا اگه توش :-) دید جاش علامت لبخند و اگه :-( دید علامت ناراحتی رو بذاره ! در ضمن TextBox هم Scroll میشه که کار رو مشکل تر میکنه و بهترین راه برای این کار از نظر من اینه :
1. نشانگر رو پشت حروف :-) یا :-( ببریم. ( با استفاده از همون کدی که اوّل از همه barbod گفت. )
2. موس رو روی نشانگر ببریم. ( مشکل دقیقا همینه چون موس ممکنه هر جایی باشه )
3. در مکان موس تصویر مربوط به حروف رو قرار بدیم. ( باید مکان موس رو با کدی که علی جان گفت پیدا کنیم و left و top تصویر کنیمش. )
اگه راه دیگه ای پیدا کنین ممنون میشم.

ویرایش : اصلا مستقیم نمیشه مکان نشانگر رو فهمید ؟ :متفکر: درست مثل نشانگر موس !

Hossis
دوشنبه 30 خرداد 1390, 23:45 عصر
البته من یک پیشنهاد دارم نمی دونم مفیده یا نه
به جای تکست باکس از RichTextBox استفاده کنید و اگه کاربر :(( رو مثلا تایپ کرد اون رو با تصویر یک شکلک جایگزین کنید (با کپی و پیست این کار ممکنه)
ببینید اگه این راه خوبه، روی اون کار بشه

Sina_Od
سه شنبه 31 خرداد 1390, 00:27 صبح
البته من یک پیشنهاد دارم نمی دونم مفیده یا نه
به جای تکست باکس از RichTextBox استفاده کنید و اگه کاربر :(( رو مثلا تایپ کرد اون رو با تصویر یک شکلک جایگزین کنید (با کپی و پیست این کار ممکنه)
ببینید اگه این راه خوبه، روی اون کار بشه

ببخشید دقیقا منظورتون از کپی پیست چیه ؟ متوجّه نمیشم ! :متفکر:

Hossis
جمعه 03 تیر 1390, 16:09 عصر
Clipboard.SetDataObject(PictureBox1.Image, True, 1000, 1500)
RichTextBox1.Paste()

Felony
یک شنبه 05 تیر 1390, 12:44 عصر
باید از تابع GetCaretPos (http://www.pinvoke.net/default.aspx/user32.getcaretpos) استفاده کنید ... !