using System; using System.Drawing; using System.Linq; using System.Windows.Forms; namespace DiffComparison { public partial class MainForm : Form { public MainForm() { InitializeComponent(); panelOverview.Paint += PanelOverview_Paint; rtbLeft.SelectionChanged += RtbLeft_SelectionChanged; rtbRight.SelectionChanged += RtbRight_SelectionChanged; } private void btnCompare_Click(object sender, EventArgs e) { CompareTexts(); } private void CompareTexts() { string[] leftLines = rtbLeft.Lines; string[] rightLines = rtbRight.Lines; rtbLeft.Clear(); rtbRight.Clear(); for (int i = 0; i < Math.Max(leftLines.Length, rightLines.Length); i++) { if (i < leftLines.Length) { rtbLeft.AppendText(leftLines[i] + Environment.NewLine); if (i < rightLines.Length && leftLines[i] != rightLines[i]) { rtbLeft.SelectionStart = rtbLeft.GetFirstCharIndexFromLine(i); rtbLeft.SelectionLength = leftLines[i].Length; rtbLeft.SelectionBackColor = Color.Pink; } } if (i < rightLines.Length) { rtbRight.AppendText(rightLines[i] + Environment.NewLine); if (i < leftLines.Length && leftLines[i] != rightLines[i]) { rtbRight.SelectionStart = rtbRight.GetFirstCharIndexFromLine(i); rtbRight.SelectionLength = rightLines[i].Length; rtbRight.SelectionBackColor = Color.Pink; } } } panelOverview.Invalidate(); // 重新繪製概覽面板 } private void PanelOverview_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; int lineHeight = rtbLeft.Font.Height; int leftLineCount = rtbLeft.Lines.Length; int rightLineCount = rtbRight.Lines.Length; int maxLines = Math.Max(leftLineCount, rightLineCount); for (int i = 0; i < maxLines; i++) { if (i < leftLineCount && i < rightLineCount && rtbLeft.Lines[i] != rtbRight.Lines[i]) { int y = i * lineHeight; g.FillRectangle(Brushes.Red, new Rectangle(0, y, panelOverview.Width, lineHeight)); } } } private void RtbLeft_SelectionChanged(object sender, EventArgs e) { ScrollToCorrespondingLine(rtbLeft); } private void RtbRight_SelectionChanged(object sender, EventArgs e) { ScrollToCorrespondingLine(rtbRight); } private void ScrollToCorrespondingLine(RichTextBox rtb) { int lineIndex = rtb.GetLineFromCharIndex(rtb.SelectionStart); rtb.ScrollToCaret(); // 滾動到當前選擇行 panelOverview.Invalidate(); // 重新繪製概覽面板 } } }