TextBoxのテキストを(中央に配置せずに)位置揃えすることは可能ですか?気がついた
txt.TextAlign = HorizontalAlignment.Left;
たとえば、しかしそれを左と右に正当化することは可能ですか?
これは滑りやすい坂道であり、すでに示したように、カスタムコントロールが本当に必要です。ただし、あなたが私のようで、[バージョン情報]やその他のダイアログなど、テキストボックスのデータを揃えて表示したい場合は、実際のテキストボックスを非表示にしたまま、PictureBoxを使用してレンダリングすることで実行できます。間隔のピクセル幅を示すために、スペースを特別なコードに置き換える必要があります。何十ものプリンタードライバーのベトランであるため、これは私にとって古い帽子です。これを行うためのコードを以下に示しますが、このWebページでどれだけうまくレンダリングされるかはわかりません。たぶん彼らはそれを再フォーマットすることができます、あるいは彼らが頼んだら、私は彼らにストレートコードを送ります。私はアセンブラーおよびC/C ++開発者ですが、VB.NETに夢中になり、VBで作成しました(C ++で2週間かかっていたものを2時間で作成できます)。
JustifyTextBox()メソッドとJustifyText_Paint()イベントで構成されるこのコードを使用するには、目的のTextBoxを単純に配置し、必要な場所にフォーマットします。次に、JustifyTextBox(Me.MyTextBox)などのTextBoxを指定してJustifyTextBox()メソッドを呼び出すと、rwacesに移動します。すべてのPictureBoxオブジェクトの作成とペイントの雑用を処理します。これは、必要な数のTextBoxに適用できます。それは1つのオブジェクトに結び付けられていません(それは多くの場合、オブジェクト指向のパダイムを打ち負かします)。
必要な2つの方法は次のとおりです。
'*******************************************************************************
' Method Name : JustifyTextBox
' Copyright (c) David Ross GOben March 10, 2013. All rights reserved.
'
' Purpose : Reformat spacing in a textbox to allow for variable spacing, exactly
' : as a printer driver will process spacing for justification.
' : Having written many dozens of printer drivers over the years, this
' : is old hat. By the way, though you can do this with a RichTextBox,
' : you really should consider interpreting the RTF code to properly
' : render everything else, otherwise, if you were to simply replace
' : the TextBox casting to a RichTextBox, it would only process the
' : data from its Text property, so pretty text and coloring and font
' : typeface, size, and enhancements will not display in the PictureBox.
'*******************************************************************************
' Set up your code to use the JustifyTextBox() method and the JustifyText_Paint() event like this:
'
' JustifyTextBox(TextBoxObjectToJustify) 'create a PictureBox control to justify the text, and hide this TextBox
' 'This will also link the created PictureBox's Paint() event to JustifyText_Paint
'-------------------------------------------------------------------------------
' NOTE: You can duplicate the above code for as many text boxes as you require.
' Also, there is no need to render them ReadOnly, because the user will not
' be able to access them through the user itnerface.
'*******************************************************************************
Private Sub JustifyTextBox(ByRef TxtBox As TextBox)
Dim picImage As PictureBox = New PictureBox 'create a PictureBox object (The textBox data will be painted to this)
With picImage
.Location = TxtBox.Location 'locate the PictureBox to the provided TextBox control
.Size = TxtBox.Size 'size it to the textbox boundaries
.Tag = TxtBox 'save a reference to the textbox for use during printing
.Parent = TxtBox.Parent 'set parent so it will display when the parent is displayed
AddHandler picImage.Paint, AddressOf JustifyText_Paint 'attach an event handler to the picture box's paint event
TxtBox.Visible = False 'render the associated textbox invisible
End With
'=======================================================================
With TxtBox
Dim TextSize As Size = TextRenderer.MeasureText("W y", .Font) 'get pixel width of "W y"
Dim Yinc As Int32 = TextSize.Height 'get vertical spacing to increment lines
Dim SpcSize As Int32 = TextSize.Width 'save measurement (we will adust the Space Size variable property in a second)
TextSize = TextRenderer.MeasureText("Wy", .Font) 'get pixel width of "Wy", without the space
SpcSize = SpcSize - TextSize.Width - 1 'compute the width of a space (drop 1 more for proper rendering)
Dim SpcInit As Int32 = 128 + SpcSize 'initial size of space and ecoding of space codes (spacing size + 128)
Dim CurlineIdx, NxtLineIdx, cAsc As Int32 'used variables
Dim LastLine As Int32 = .GetLineFromCharIndex(Len(.Text)) 'get the last line index of the TextBox, offset from zero
Dim Result As String = Nothing 'init encoded result
Dim Txt As String = Nothing 'string to hold each line of text in the TextBox
Dim Tmptext As String 'copy of Txt that is altered
For Idx As Int32 = 0 To LastLine 'process each line (offset from 0)
CurlineIdx = .GetFirstCharIndexFromLine(Idx) 'get start of the indicated line number line
If Idx = LastLine Then 'at the last line of text data in the TextBox (if so, we do not need to justify it?
Txt = RTrim(.Text.Substring(CurlineIdx)) 'yes, so simply grab the text of the line from the start character index to the end of the text data
Tmptext = Txt 'make a copy to TmpText
Else 'otherwise... grab the current line of text from the TextBox
NxtLineIdx = .GetFirstCharIndexFromLine(Idx + 1) 'not the last line, so get the index to the start of the next line
Txt = RTrim(.Text.Substring(CurlineIdx, NxtLineIdx - CurlineIdx)) 'grab the text of the current line. Also remove any trailing spaces
If Len(Txt) <> 0 AndAlso VB.Right(Txt, 2) = vbCrLf Then 'does the current line end with CR/LF?
Tmptext = RTrim(VB.Left(Txt, Len(Txt) - 2)) 'yes, so strip CR/LF and strip any spaced leading them. There is no need to justify this line
ElseIf Len(Txt) = 0 Then 'otherwise, if the text notains NO data...
Tmptext = Nothing 'then simply make the line blank and do nothing else
Else 'otherwise... we have to encode the line to justify it
Tmptext = Txt 'get a copy of this string, which we will use to encode
TextSize = TextRenderer.MeasureText(Tmptext, .Font) 'get its current size
Dim SpcNeeded As Int32 = .Width - TextSize.Width 'compute number of pixels to add
If SpcNeeded > 0 Then 'do we need to add spacing? (allow for negative result)
Tmptext = Join(Split(Tmptext, " "), Chr(SpcInit)) 'yes, so first replace spaces with special code for point-size spacing
Dim Idy As Int32 = 1 'init column start index (used to skip over leading spaces)
Do While Asc(Mid(Tmptext, Idy, 1)) > 127
Idy += 1 'skip past leading spaces (indent)
Loop
'---------------------------------------------------
Dim AddedSpacing As Boolean = False 'set up a flag to deterct if we added any spacing to the line
Do While SpcNeeded <> 0 'now loop through and add a pixel to each space in the text until there are none left to add
For Idz As Int32 = Idy To Len(Tmptext) 'scan through line data
cAsc = Asc(Mid(Tmptext, Idz, 1)) 'get code
If cAsc > 127 Then 'special space character?
cAsc += 1 'add 1 pixel to its size
Mid(Tmptext, Idz, 1) = Chr(cAsc) 'stuff result back
AddedSpacing = True
SpcNeeded -= 1 'drop 1 from count of spacing needed
If SpcNeeded = 0 Then 'have we added all the spaces we need?
Exit For 'yes, so do not add any more
End If
End If
Next
If Not AddedSpacing Then 'if we could not add any space...
Exit Do 'then exit the loop
End If
AddedSpacing = False
'-----------------------------------------------
Loop 'loop through the line again to add additional spacing
End If
End If
End If
'---------------------------------------------------------------
Result &= vbCrLf & Tmptext 'add TmpText data, manipulated or not, to the Result accumulator string
Next 'process the next line of code
.Text = Mid(Result, 3) 'stuff the result back to the TextBox for storage, less the leading CR+LF
End With
End Sub
'*******************************************************************************
' Method Name : JustifyText_Paint
' Purpose : Draw text from a textbox onto a PictureBox control (created in the
' : setup code), using special spacing codes inserted by JustifyTextBox().
' :
' NOTE : A reference to the associated Textbox is stored in the PictureBox's Tag property
'*******************************************************************************
' NOTE: You may notice that we seem to add 1 pixel to the width of the space character,
' below, but we subtracted 1 pixel in the the JustifyTextBox() method. This is
' originally subtracting 1. It also allows the right margin to reamin at its
' straightest. I realize that this actually has to do something with the margins
' applied in the TextRender.MeasureText() process, and even though I have tried to
' set theTextFormatFlags to NoPadding and in various other ways, and even none
' at all (as it is now), it dors not make one bit of difference, at all. However,
' on average, with or without using the TextFormatFlags, if we subtract a pixel from
' the space size and subtract 6 (typical margin of 3 pixels on either side) from
' measuring each word, the alignment is about perfect. However, a side effect is
' that some long words seem to almost butt up against a fllowing word. A hack around
' that is to simply manually insert an extra space between these words in the textbox.
'*******************************************************************************
Private Sub JustifyText_Paint(sender As Object, e As PaintEventArgs)
With DirectCast(DirectCast(sender, PictureBox).Tag, TextBox)
Dim TextSize As Size = TextRenderer.MeasureText("X y", .Font) 'get size of sample text
Dim Yinc As Single = CSng(TextSize.Height) 'keep height for adding lines in the picturebox
Dim SpcSize As Single = CSng(TextSize.Width) 'save the length result
TextSize = TextRenderer.MeasureText("Xy", .Font) 'grab the same text, but without the space (drop 1 more for proper rendering)
SpcSize = SpcSize - CSng(TextSize.Width + 1) 'compute space width (we are actually subtracting an addtional pixel)
Dim txtMargin As Single = CSng(.Margin.Left + .Margin.Right) 'compute the margin allowance (MeasureText adds this to the width)
Dim PosnX As Single = CSng(e.ClipRectangle.Left) 'start postion to draw text in the picturebox
Dim PosnY As Single = CSng(e.ClipRectangle.Top)
Dim Tmptxt As String = Nothing 'init temporary text holder
Dim Brsh As New SolidBrush(.ForeColor) 'get the brush for the text color to use from the textbox
For Idx As Int32 = 1 To Len(.Text) 'scan each character in the master text
Dim iChar As Int32 = Asc(Mid(.Text, Idx, 1)) 'grab the cascii code for the currently indexed character
Select Case iChar
Case Is > 127 'special spacing character?
If Len(Tmptxt) <> 0 Then 'yes, so dump the temp text if it has accumulated data
TextSize = TextRenderer.MeasureText(Tmptxt, .Font) 'first grab the size of the text
e.Graphics.DrawString(Tmptxt, .Font, Brsh, PosnX, PosnY) 'then draw it
PosnX += CSng(TextSize.Width - txtMargin) 'then bump the x offset, less the margin allowance
Tmptxt = Nothing 'clear the temp text buffer
End If
PosnX += CSng((iChar And 127)) 'finally, bump the x offset by the spaceing code (pixel count + 128)
Case 13 'vbCr?
If Len(Tmptxt) <> 0 Then 'yes, so dump the temp text if it has accumulated data
e.Graphics.DrawString(Tmptxt, .Font, Brsh, PosnX, PosnY) 'then draw it
Tmptxt = Nothing 'clear the temp text buffer
End If
PosnX = CSng(e.ClipRectangle.Left) 'reset the X offset to the left side
PosnY += Yinc 'bump the line index to the next line position
Case 32 'Space?
If Len(Tmptxt) <> 0 Then 'yes, so dump the temp text if it has accumulated data
TextSize = TextRenderer.MeasureText(Tmptxt, .Font) 'first grab the size of the text
e.Graphics.DrawString(Tmptxt, .Font, Brsh, PosnX, PosnY) 'then draw it
PosnX += CSng(TextSize.Width - txtMargin) 'then bump the x offset, less the margin allowance
Tmptxt = Nothing 'clear the temp text buffer
End If
PosnX += SpcSize 'bump index by a space size
Case 10 'vbLf? If so, ignore it
Case Else 'normal character
Tmptxt &= Chr(iChar) 'add the character to the temp text buffer
End Select
Next
If Len(Tmptxt) <> 0 Then 'dump the temp text if it has accumulated data
e.Graphics.DrawString(Tmptxt, .Font, Brsh, PosnX, PosnY) 'then draw it
End If
Brsh.Dispose() 'finally, dispose of the used brush resource
End With
End Sub
OPが目指しているのはこれだと思いますhttp://en.wikipedia.org/wiki/Justification_(typesetting ) 次に、この見出しの下を見てください
両端揃え (左右を揃える)
これを行う簡単な方法はないのではないかと心配しています。Damith が提案したようにカスタム コントロールを作成する必要がありますが、それも簡単ではありません。文字を入力するたびに、テキストの間隔が狭くなり、見た目がおかしくなるからです。読み取り専用のテキストボックスを作成したい場合は可能ですが、ユーザーにテキストを追加してもらいたい場合は...これを実装するのに時間がかかるのは本当に正当な理由が必要だと思います.
配置は、左と右に揃えるように中央に指定できます
textBox1.TextAlign = HorizontalAlignment.Center;