2009-10-27 13 views
0

L'un des contrôles de mon application limite la possibilité pour un utilisateur de modifier uniquement le style de police (B, I, U) et la couleur du texte. J'ai créé un contrôle personnalisé qui hérite de RichTextBox à cet effet. Je suis capable d'intercepter CTRL-V, et définir la police du texte collé à SystemFonts.DefaultFont. Le problème auquel je suis actuellement confronté est que si le texte collé contient, par exemple, un demi-style demi-gras normal - le gras est perdu.Comment définir le RichFextBox.SelectionFont FontFamily sans modifier le style?

I.e. "Foo Bar" sera simplement coller comme "Foo Bar".

Ma seule idée est actuellement de passer par le texte caractère par caractère (très lent), et faire quelque chose comme:

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(); 
} 

}

Quelqu'un peut-il penser à un produit de nettoyage (et plus rapide) Solution?

Répondre

0

« nobugz » sur les forums MSDN répondu pour moi (je avais besoin d'une réponse rapide, donc après presque une journée de Tumbleweed de SO, je devais aller voir ailleurs - ne me jugez pas!):

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

pour ceux qui veulent une réponse Delphi, un extrait pour vous donner l'idée de base:

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;