2009-10-27 94 views
0

我的应用程序中的控件之一限制了用户只能更改文本的字体样式(B,I,U)和颜色。为此,我创建了一个从RichTextBox继承的自定义控件。我可以拦截CTRL-V,并将粘贴文本的字体设置为SystemFonts.DefaultFont。我目前面临的问题是,如果粘贴的文本包含例如半大胆的半正规风格 - 大胆丢失。如何在不更改样式的情况下设置RichTextBox.SelectionFont FontFamily?

I.e. “Foo Bar”只会粘贴为“Foo Bar”。

我唯一的想法目前是由字符(非常慢)要经过的文本字符,并且这样做:

public class MyRichTextBox : RichTextBox 
{ 

private RichTextBox hiddenBuffer = new RichTextBox(); 

/// <summary> 
/// This paste will strip the font size, family and alignment from the text being pasted. 
/// </summary> 
public void PasteUnformatted() 
{ 
    this.hiddenBuffer.Clear(); 
    this.hiddenBuffer.Paste(); 

    for (int x = 0; x < this.hiddenBuffer.TextLength; x++) 
    { 
     // select the next character 
     this.hiddenBuffer.Select(x, 1); 

     // Set the font family and size to default 
     this.hiddenBuffer.SelectionFont = new Font(SystemFonts.DefaultFont.FontFamily, SystemFonts.DefaultFont.Size, this.hiddenBuffer.SelectionFont.Style); 
    } 

    // Reset the alignment 
    this.hiddenBuffer.SelectionAlignment = HorizontalAlignment.Left; 

    base.SelectedRtf = this.hiddenBuffer.SelectedRtf; 
    this.hiddenBuffer.Clear(); 
} 

}

谁能想到一个更清洁的(快)解决方案?

回答

0

“nobugz”过在MSDN论坛上回答了这个对我来说(我需要快速的答案,几乎是从SO风滚草的日子,所以,我不得不寻找其他地方 - 不要审判我!):

using System.Runtime.InteropServices; 
... 
     public static bool SetRtbFace(RichTextBox rtb, Font font, bool selectionOnly) { 
      CHARFORMATW fmt = new CHARFORMATW(); 
      fmt.cbSize = Marshal.SizeOf(fmt); 
      fmt.szFaceName = font.FontFamily.Name; 
      fmt.dwMask = 0x20000000; // CFM_FACE 
      return IntPtr.Zero != SendMessage(rtb.Handle, 0x444, (IntPtr)(selectionOnly ? 1 : 4), fmt); 
     } 
     [StructLayout(LayoutKind.Sequential, Pack = 4)] 
     private class CHARFORMATW { 
      public int cbSize; 
      public int dwMask; 
      public int dwEffects; 
      public int yHeight; 
      public int yOffset; 
      public int crTextColor; 
      public byte bCharSet; 
      public byte bPitchAndFamily; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x40)] 
      public string szFaceName; 
     } 

     [DllImport("user32.dll", CharSet = CharSet.Auto)] 
     private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, CHARFORMATW lParam); 
0

对于那些想要一个Delphi的答案,提取物,给你的基本思想:

using RichEdit; //reqd. for the constants and types 

var 
    chformat : TCharFormat2; 
    fontname : string; 

begin 
    FillChar(chformat,sizeof(chformat),0); 
    chformat.cbSize := sizeof(chformat); 
    //only modify the szFaceName field, height etc. left alone 
    chformat.dwMask := CFM_FACE; 
    //get the fontname set by the user 
    fontname := AdvFontSelector1.Text; 
    strpcopy(chformat.szFaceName,fontname); 
    RichEdit1.Perform(EM_SETCHARFORMAT, SCF_SELECTION, lparam(@chformat)); 
end;