2011-09-08 86 views
1

我想要在WinForms文本框中的80個字符處繪製邊緣線。下面是我嘗試過,在我的文本框的子類:如何在TextBox中自定義繪製邊距?

protected override void WndProc(ref Message m) 
{ 
    base.WndProc(ref m); 

    const int WM_PAINT = 0x00F; 
    if (m.Msg == WM_PAINT) { 
     DrawMargin(); 
    } 
} 

void DrawMargin() 
{ 
    using (Pen pen = new Pen(Color.Gray, 1)) { 
     using (Graphics graphics = CreateGraphics()) { 
      float charWidth = graphics.MeasureString("M", Font).Width; 
      graphics.DrawLine(pen, charWidth * 80, 0, charWidth * 80, Height); 
     } 
    } 
} 

至少有三個問題是:

  1. 當用戶輸入一些文字,該行的一部分被削除(變白)。
  2. 當用戶用鼠標選擇一些文本時,上述情況再次發生。
  3. 當TextBox滾動時,線條閃爍。

我注意到TED記事本(使用Win32 EDIT控件)能夠畫出一個沒有任何問題的邊距,所以看起來有可能做我想做的事情。任何人都可以告訴我如何?

+0

很大的把戲。編輯繪製時不使用WM_PAINT,Windows 2必須在386SUX處理器上運行時犯下的犯罪。在這個過程中擦掉你的線。你必須問Ted他是如何做到的。 –

+0

謝謝,我會試着問他/她。 – Tom

回答

0

至於我可以告訴大家,這樣做的最好的方法是簡單地放置在WinForms.Panel文本框:

class FooTextBox : TextBox 
{ 
    public FooTextBox() 
    { 
     margin = new Panel(); 

     margin.Enabled = false; 
     margin.BackColor = Color.LightGray; 
     margin.Top  = 0; 
     margin.Height = ClientSize.Height; 
     margin.Left  = <whatever>; 
     margin.Width  = 1; 

     Controls.Add(margin); 
    } 

    Panel margin; 
} 

由於面板沒有啓用,它並不需要鼠標輸入。

1

我不確定這種方法。但你可以考慮的一件事是在文本框中插入一個圖像。圖片當然是您的保證金,文字會在圖片後自動開始。要在文本框中包含圖片,請參閱How can I insert an image into a RichTextBox?

編輯:我也發現這篇文章http://www.codedblog.com/2007/09/17/owner-drawing-a-windowsforms-textbox/這似乎有助於在文本框的背景中繪畫。這裏描述的方法似乎讓你走向你所需要的很長一段路。

希望這會有所幫助。

+0

這似乎是關於RichTextBox控件,而我正在使用TextBox。 – Tom