PDA

View Full Version : نوشتن یا داشتن یه RichTextBox قدرتمند (شبیه Word)



Chabok
یک شنبه 09 بهمن 1384, 17:32 عصر
با عرض سلام خدمت دوستان گرامی
ببخشید . کسی از دوستان یه مثال خوب از RichTextBox نداره .
آخه نوشتنش یکم دردسر داره . :اشتباه:
خودم سعی کردم بنوسیم . ولی مشکل دارم . :لبخند:
خودتون امتحان کنید ببینید (مثلا هنگامی که میخواهیم متنی که هر تیکه اش دارای یه ظاهری است را Bold کنیم بقیه خواص از بین می روند :قهقهه: ) .
چون کل اون قسمت Style جدید میگیره .
این یه نمونه از مشکلاتشه .

در ضمن یه ColorPicker هم میخوام . برای تغییر رنگ متن و پس زمینه .
ممنونم راهنمایی کنید .

habedijoo
یک شنبه 09 بهمن 1384, 17:54 عصر
سلام
اینو ببین . اگر کاملتر گیرم اومد برات آپلود میکنم . ( با 2003 )

Chabok
یک شنبه 09 بهمن 1384, 18:37 عصر
خیلی خوب بود .
فقط Toolbar نداره (بالاخره یه ضعفه) .

آخه چرا این همه Editor برای برنامه های تحت وب هست
مثلا FreeTextBox , ...

ولی برای برنامه های تحت ویندوز کم گیر میاد (یا اصلا نیست)

بابک زواری
یک شنبه 09 بهمن 1384, 21:02 عصر
اینم یک کلاس برای syntax highlighting



Public Class SyntaxRTB
Inherits System.Windows.Forms.RichTextBox
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

Private Declare Function LockWindowUpdate Lib "user32" (ByVal hWnd As Integer) As Integer
Private _SyntaxHighlight_CaseSensitive As Boolean = False
Private Words As New DataTable
'Contains Windows Messages for the SendMessage API call
Private Enum EditMessages
LineIndex = 187
LineFromChar = 201
GetFirstVisibleLine = 206
CharFromPos = 215
PosFromChar = 1062
End Enum
Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
ColorVisibleLines()
End Sub
Public Sub ColorRtb()
Dim FirstVisibleChar As Integer
Dim i As Integer = 0
While i < Me.Lines.Length
FirstVisibleChar = GetCharFromLineIndex(i)
ColorLineNumber(i, FirstVisibleChar)
i += 1
End While
End Sub
Public Sub ColorVisibleLines()
Dim FirstLine As Integer = FirstVisibleLine()
Dim LastLine As Integer = LastVisibleLine()
Dim FirstVisibleChar As Integer
If (FirstLine = 0) And (LastLine = 0) Then
'If there is no text it will error, so exit the sub
Exit Sub
Else
While FirstLine < LastLine
FirstVisibleChar = GetCharFromLineIndex(FirstLine)
ColorLineNumber(FirstLine, FirstVisibleChar)
FirstLine += 1
End While
End If
End Sub
Public Sub ColorLineNumber(ByVal LineIndex As Integer, ByVal lStart As Integer)
Dim i As Integer = 0
Dim Instance As Integer
Dim LeadingChar, TrailingChar As String
Dim SelectionAt As Integer = Me.SelectionStart
Dim MyRow As DataRow
Dim Line() As String, MyI As Integer, MyStr As String
' Lock the update
LockWindowUpdate(Me.Handle.ToInt32)
MyI = lStart
If CaseSensitive Then
Line = Split(Me.Lines(LineIndex).ToString, " ")
Else
Line = Split(Me.Lines(LineIndex).ToLower, " ")
End If
For Each MyStr In Line
Me.SelectionStart = MyI
Me.SelectionLength = MyStr.Length
If Words.Rows.Contains(MyStr) Then
MyRow = Words.Rows.Find(MyStr)
If (Not CaseSensitive) Or (CaseSensitive And MyRow("Word") = MyStr) Then
Me.SelectionColor = Color.FromName(MyRow("Color"))
End If
Else
Me.SelectionColor = Color.Black
End If
MyI += MyStr.Length + 1
Next
' Restore the selectionstart
Me.SelectionStart = SelectionAt
Me.SelectionLength = 0
Me.SelectionColor = Color.Black
' Unlock the update
LockWindowUpdate(0)
End Sub
Public Function GetCharFromLineIndex(ByVal LineIndex As Integer) As Integer
Return SendMessage(Me.Handle, EditMessages.LineIndex, LineIndex, 0)
End Function
Public Function FirstVisibleLine() As Integer
Return SendMessage(Me.Handle, EditMessages.GetFirstVisibleLine, 0, 0)
End Function
Public Function LastVisibleLine() As Integer
Dim LastLine As Integer = FirstVisibleLine() + (Me.Height / Me.Font.Height)
If LastLine > Me.Lines.Length Or LastLine = 0 Then
LastLine = Me.Lines.Length
End If
Return LastLine
End Function
Public Sub New()
Dim MyRow As DataRow
Dim arrKeyWords() As String, strKW As String
Me.AcceptsTab = True
''Load all the keywords and the colors to make them
Words.Columns.Add("Word")
Words.PrimaryKey = New DataColumn() {Words.Columns(0)}
Words.Columns.Add("Color")
arrKeyWords = New String() {"select", "insert", "delete", _
"truncate", "from", "where", "into", "inner", "update", _
"outer", "on", "is", "declare", "set", "use", "values", "as", _
"order", "by", "drop", "view", "go", "trigger", "cube", _
"binary", "varbinary", "image", "char", "varchar", "text", _
"datetime", "smalldatetime", "decimal", "numeric", "float", _
"real", "bigint", "int", "smallint", "tinyint", "money", _
"smallmoney", "bit", "cursor", "timestamp", "uniqueidentifier", _
"sql_variant", "table", "nchar", "nvarchar", "ntext", "left", _
"right", "like","and","all","in","null","join","not","or"}
For Each strKW In arrKeyWords
MyRow = Words.NewRow()
MyRow("Word") = strKW
MyRow("Color") = Color.LightCoral.Name
Words.Rows.Add(MyRow)
Next
End Sub

Public Property CaseSensitive() As Boolean
Get
Return _SyntaxHighlight_CaseSensitive
End Get
Set(ByVal Value As Boolean)
_SyntaxHighlight_CaseSensitive = Value
End Set
End Property

End Class

niloufar
دوشنبه 10 بهمن 1384, 15:12 عصر
سلام
آقا بابک میشه یه کم توضیح یا یه مثال استفاده از کلاستونم داشته باشیم؟

با تشکر

بابک زواری
سه شنبه 11 بهمن 1384, 10:46 صبح
اینم چند تا نمونه با چند مثال

Chabok
سه شنبه 11 بهمن 1384, 14:04 عصر
آقای زواری . ممنون

این تصویر رو ببینید (مربوط به Word 2003 است .)

من میخوام ادیتوری داشته باشم که این گزینه ها را داشته باشه (دورشون قرمزه)

از نظر ابزار یه چیزی شبیه ادیتورهایی که تحت وب استفاده میشه (مثلا FreeTextBox)

ولی تحت ویندوز و این دفعه با RichTextBox . ممنونم .

Chabok
سه شنبه 11 بهمن 1384, 19:36 عصر
راستش خودمم میتونم درست کنم .

ولی مشکلی که دارم اینه که چون برای هر بار تغییر فونت باید یه استایل جدید
تعریف کنم استایل قبلی از بین میرود .
هر چند که خاصیت های جدید را به خاصیت های قبلی اضافه میکنم ولی برای مثال
اگه بخوام متنی رو که هم یه تیکه ی Bold دارد و هم یه تیکه ی UnderLine دارد را بهش
خاصیت Italic هم اضافه کنم باید به کل متن یه استایل جدید بدم و اون تفاوتها از بین میره

ممنونم که دوستان کمک کنند .

بابک زواری
سه شنبه 11 بهمن 1384, 19:46 عصر
قبل دانلود هماهنگی کنیم که برای مسائل فول کردن و . . .
http://www.textcontrol.com/products/dotnet/

Chabok
سه شنبه 11 بهمن 1384, 22:54 عصر
ببخشید.
این که لینکشو دادین خیلی توپه . یعنی محشره

ولی مثل اینکه مجانی نیست (فقط ورژن Trial داره)
شما لینکی ازش دارین ؟

خیلی ممنون

بابک زواری
چهارشنبه 12 بهمن 1384, 15:35 عصر
محسن جان الگوریتمش اینه
اول Trial رو بگیر
دوم یک مدت صبر کن
سوم دنبال کرکش در سایتهای دیگه بگرد
اگر پیدا نکردی برو قدم دوم
اگر پیدا کردی استفاده کن آنگاه به ما هم یک ندا بده

niloufar
پنج شنبه 13 بهمن 1384, 14:04 عصر
محسن جان الگوریتمش اینه
اول Trial رو بگیر
دوم یک مدت صبر کن
سوم دنبال کرکش در سایتهای دیگه بگرد
اگر پیدا نکردی برو قدم دوم
اگر پیدا کردی استفاده کن آنگاه به ما هم یک ندا بده
--------------------------------------------------
D-:
--------------------------------------------------

بابک زواری
جمعه 14 بهمن 1384, 18:27 عصر
اینم بد نیست
pinEdit - DHTML/ActiveX/.NET/Java - V4.1

بابک زواری
جمعه 14 بهمن 1384, 18:32 عصر
در ضمن منم دنبالش هستم اگر برای VS2005 گیرم اومد بهتون اطلاع میدم