2017-03-02 5 views
0

저는 VS2013의 VB.NET 4.5 프로젝트에서 작업하고 있습니다.RichTextBox에서 문자열의 모든 인스턴스에 대한 글꼴 스타일 변경

양식에 richtextbox가 있고 단추를 클릭하면 richtextbox에서 발견 된 특정 문자열의 모든 인스턴스에서 굵게 설정을 전환해야합니다.

this question을 기반으로 몇 가지 코드를 작성했습니다.

Private Sub ToggleBold() 

    rtxtOutputText.SelectionStart = rtxtOutputText.Find("@#$%", RichTextBoxFinds.None) 

    rtxtOutputText.SelectionFont = New Font(rtxtOutputText.Font, FontStyle.Bold) 
End Sub 

토글 굵게 버튼을 클릭하면 "@ # $ %"문자열의 첫 번째 인스턴스 만 굵게 표시됩니다.

어떻게 문자열의 모든 인스턴스를 굵게 설정할 수 있습니까? 함께 묶인 것도 여러 가지가있을 수 있으므로 ("@ # $ % @ # $ % @ # $ %"), 각각의 속성을 굵게 표시해야합니다.

답변

3

그냥

는 (... 지금 난 그냥 제대로 작동 모든 인스턴스에 굵게 얻으려고, 나는 굵게 전환 언급 알아,하지만 나중에 토글 부분을 설정합니다) 루프를 추가하고 RichTextBox.Find(String, Int32, RichTextBoxFinds) overload을 사용하여 찾고자하는 곳을 지정하십시오. 현재 인덱스 + 1을보고 다시 같은 값을 반환하지 않습니다.

또한

당신은 당신이 대담은 현재 인스턴스 주위에만 아닌 텍스트에 적용 확신 때문에 실제로 뿐만 아니라에게 단어를 선택해야한다.

Private Sub ToggleBold() 
    'Stop the control from redrawing itself while we process it. 
    rtxtOutputText.SuspendLayout() 

    Dim LookFor As String = "@#$%" 
    Dim PreviousPosition As Integer = rtxtOutputText.SelectionStart 
    Dim PreviousSelection As Integer = rtxtOutputText.SelectionLength 
    Dim SelectionIndex As Integer = -1 

    Using BoldFont As New Font(rtxtOutputText.Font, FontStyle.Bold) 
     While True 
      SelectionIndex = rtxtOutputText.Find(LookFor, SelectionIndex + 1, RichTextBoxFinds.None) 

      If SelectionIndex < 0 Then Exit While 'No more matches found. 

      rtxtOutputText.SelectionStart = SelectionIndex 
      rtxtOutputText.SelectionLength = LookFor.Length 

      rtxtOutputText.SelectionFont = BoldFont 
     End While 
    End Using 

    'Allow the control to redraw itself again. 
    rtxtOutputText.ResumeLayout() 

    'Restore the previous selection. 
    rtxtOutputText.SelectionStart = PreviousPosition 
    rtxtOutputText.SelectionLength = PreviousSelection 
End Sub 

글꼴을 처분하라는 뜻으로 Plutonix에게 기탁합니다.

+1

강조/선택/특수 Font * once *를 정의하고 동일한 인스턴스를 다시 사용하는 것이 좋습니다. 폰트는 IDisposable입니다. – Plutonix

+0

@Plutonix : 당신은 그것에 대해 확실히 옳습니다! 나는 그렇게 생각했지만 마음이 바뀌었다 :). 또한 새로운 글꼴 객체를 컨트롤에 영향을 미치지 않고 안전하게 여기에 배치 할 수 있습니까? 아니면 문자열 인스턴스처럼 한번 정의해야합니까? –

+0

당신은'Using' 블럭에 넣을 수 있습니다,하지만 왜 처음부터 새로운 폰트를 반복해서 만들어야합니까? – Plutonix