2014-10-09 3 views
1

저는 직렬 하드웨어를 통해 내 외부 하드웨어 장치와 PC 간의 통신 인터페이스로 실행되는 winforms 응용 프로그램에서 rtf 상자로 잠시 작업했습니다. 내가 가지고있는 문제는 어떤 텍스트의 색깔을 바꾸어 놓았을 때 내 외부 장치로부터의 에코 백 (echo back back)이 텍스트의 선택 (즉, 실제의 명령보다 먼저 보내지는)을 위해 색 변경의 예를 사용할 때이다.WinForm RichTextBox 텍스트 색상이 너무 많이 변경되었습니다.

기호 ';'보내기 나는 에코를 되찾고 내 장치의 응답은 모두 텍스트로 표시됩니다.

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
    { 
     //fking threading 
     string rxString = serialPort1.ReadExisting(); // running on worker thread 

     this.Invoke((MethodInvoker)delegate 
     { 
      textLog.AppendText(rxString); // runs on UI thread 
     }); 
    } 

내가 내 응용 프로그램에서 작업을 진행하게 (많은 다른 사람의 사이에서 나는 또한 시도) 아래의 예를 사용하여 화면에 쓸 수 :

;;[UART+ERROR] 

내를 받게되며 이벤트 핸들러는 표준입니다. 내가 뭘 잘못하고 있는지 확신 할 수 없다.

private void AppendTextColor(RichTextBox box, Color color, string text) 
    { 
     int start = box.TextLength; 
     box.AppendText(text); 
     int end = box.TextLength; 

     // Textbox may transform chars, so (end-start) != text.Length 
     box.Select(start, end - start); 
     { 
      box.SelectionColor = color; 
      // could set box.SelectionBackColor, box.SelectionFont too. 
     } 
     box.SelectionLength = 0; // clear 
    } 
+0

명령과 응답을 컬러로 구분하고 명령 텍스트의 색이 검정 (기본값)이고 응답이 빨간색이지만 RichTextBox에 응답을 추가하면 명령 텍스트도 빨간색이됩니다. – kennyzx

+0

바로 그거야! 그렇게하면 쉽게 읽을 수 있습니다! – Larry

+1

'AppendTextColor'를 호출하여 명령과 응답을 표시 할 수 있습니다. 응답을 표시하기 위해 단지'AppendText'를 호출한다면, 색깔은 기본 색상이 아니고 대신 명령 색상으로 설정됩니다. MS WORD에 대해 생각해보십시오. 선택 영역의 스타일을 지정하고 그 선택 영역 뒤에 내용을 입력하면 새 내용의 선택 영역이 스타일과 동일합니다. – kennyzx

답변

2

당신의 선택() 호출 대신 텍스트의 끝의 첨부 된 텍스트의 시작에서 지정한 selectionStart 속성을 떠난다. 당신이 SelectionLength을 위해했던 것처럼 당신은 그것을 복원 할 수 있지만 그것을 할 수있는 간단한 방법은 다음과 같습니다 사용자가 텍스트를 편집 할 수없는 경우

private static void AppendTextColor(RichTextBox box, Color color, string text) { 
     box.SelectionStart = box.Text.Length; // Optional 
     var oldcolor = box.SelectionColor; 
     box.SelectionColor = color; 
     box.AppendText(text); 
     box.SelectionColor = oldcolor; 
    } 

참고 // 선택적 주석이, 그것은 필요하지 않습니다.

코드에 심각한 화재 호스 문제가 있음을 유의하십시오. 매우 높은 속도로 Invoke()를 호출하면 UI 스레드가 상자가 가득 차기 시작할 때 100 % 핵심 코어를 시작하게됩니다. 그렇게되면 쉽게 알 수 있으며 더 이상 업데이트를 볼 수 없으며 프로그램이 입력에 응답하지 않습니다. ReadReisting() 대신 ReadLine()을 사용하면 DataReceived 이벤트 핸들러에서 버퍼링하는 것이 필요합니다. 대신 BeginInvoke()를 사용하십시오. Invoke()는 입니다.은 SerialPort.Close() 호출이 교착 상태를 일으킬 수 있습니다.

1

당신은 RTB의 일반 텍스트 색으로 색상을 다시 설정해야합니다

box.SelectionStart = box.Text.Length; // clear.. 
box.SelectionLength = 0; // clear  // ..selection 
box.SelectionColor = box.ForeColor; // reset color 
관련 문제