Измените шрифт в RichTextBox без изменения предыдущих настроек форматирования - C # [duplicate]

вот один, который я не вижу в качестве опции. он похож на использование ajax, но явно отличается.

сначала устанавливает источник скрипта непосредственно в файл PHP.

<script type="text/javascript" src="url_to_your_php_file.php" /></script>

вы даже можете передать переменную обратно в PHP файл, такой как этот пример:

<script type="text/javascript" src="url_to_your_php_file.php?var1=value1" /></script>

, затем в «your_php_file.php»:

<?php
// THIS IS A SIMPLE EXAMPLE
// it demonstrates one method of using the src attribute to link
// to a PHP file which can generate javascripts dynamically
// and share data between PHP and javascript
// you may take this learning example and develop it further
// relying on your own coding skills for validating data
// and avoiding errors, of course
header( 'content-type: text/javascript' );

// if you pass a $_GET variable from the javascript
// you should add code to validate your $_GET variable(s)

// you can add code to query a database
// using $_GET['var1'] or some other criteria

// you can add simple variable assignments
$value = 'some value';

// for the OP's needs (assumes the class object has been defined)
$val = $myService->getValue();

?>
function name() {
    // pay attention because you need to use quotes properly
    // and account for possible quotes in the variable strings
    // to avoid both php and javascript errors
    // example assumes $val has been returned as a string
    // validate $val as needed using your method of choice
    var example1 = '<?php echo '"' . $val . '"'; ?>';
    var example2 = '<?php echo '"' . $value . '"'; ?>';
    var example3 = '<?php echo '"some other data"'; ?>';
    alert( example1 + ' / ' + example2 );
}
<?php
// you may even want to include additional files (.php or .js, etc)
@include 'local_path_to_some_other_js_file.js';
@include 'local_path_to_some_other_php_file.php';

exit;
?>
4
задан Jerry 30 April 2013 в 19:07
поделиться

4 ответа

Это RichTextBox, который я использовал в прошлом. Он объединен с кодом, найденным здесь в Stack Overflow и в Интернете в целом:

public class RichBox : RichTextBox {
  private const UInt32 CFM_BOLD = 0x00000001;
  private const UInt32 CFM_ITALIC = 0x00000002;
  private const UInt32 CFM_UNDERLINE = 0x00000004;
  private const UInt32 CFM_STRIKE = 0x00000008;
  private const UInt32 CFM_FACE = 0x20000000;
  private const UInt32 CFM_SIZE = 0x80000000;

  private const int WM_PAINT = 0xF;
  private const int WM_SETREDRAW = 0xB;
  private const int WM_USER = 0x400;

  private const int EM_SETCHARFORMAT = (WM_USER + 68);
  private const int SCF_SELECTION = 0x0001;
  private const int EM_GETEVENTMASK = WM_USER + 59;
  private const int EM_SETEVENTMASK = WM_USER + 69;
  private const int EM_GETSCROLLPOS = WM_USER + 221;
  private const int EM_SETSCROLLPOS = WM_USER + 222;

  [StructLayout(LayoutKind.Sequential)]
  private struct CHARFORMAT {
    public int cbSize;
    public uint dwMask;
    public uint dwEffects;
    public int yHeight;
    public int yOffset;
    public int crTextColor;
    public byte bCharSet;
    public byte bPitchAndFamily;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
    public char[] szFaceName;
    public short wWeight;
    public short sSpacing;
    public int crBackColor;
    public int LCID;
    public uint dwReserved;
    public short sStyle;
    public short wKerning;
    public byte bUnderlineType;
    public byte bAnimation;
    public byte bRevAuthor;
  }

  [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  private static extern IntPtr LoadLibrary(string lpFileName);

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

  [DllImport("user32.dll")]
  private static extern IntPtr SendMessage(IntPtr hWnd, Int32 wMsg, Int32 wParam, ref Point lParam);

  [DllImport("user32.dll")]
  private static extern IntPtr SendMessage(IntPtr hWnd, Int32 wMsg, Int32 wParam, IntPtr lParam);

  private bool frozen = false;
  private Point lastScroll = Point.Empty;
  private IntPtr lastEvent = IntPtr.Zero;
  private int lastIndex = 0;
  private int lastWidth = 0;

  protected override CreateParams CreateParams {
    get {
      var cp = base.CreateParams;
      if (LoadLibrary("msftedit.dll") != IntPtr.Zero) {
        cp.ClassName = "RICHEDIT50W";
      }
      return cp;
    }
  }

  [Browsable(false)]
  [DefaultValue(typeof(bool), "False")]
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  public bool FreezeDrawing {
    get { return frozen; }
    set {
      if (value != frozen) {
        frozen = value;
        if (frozen) {
          this.SuspendLayout();
          SendMessage(this.Handle, WM_SETREDRAW, 0, IntPtr.Zero);
          SendMessage(this.Handle, EM_GETSCROLLPOS, 0, ref lastScroll);
          lastEvent = SendMessage(this.Handle, EM_GETEVENTMASK, 0, IntPtr.Zero);
          lastIndex = this.SelectionStart;
          lastWidth = this.SelectionLength;
        } else {
          this.Select(lastIndex, lastWidth);
          SendMessage(this.Handle, EM_SETEVENTMASK, 0, lastEvent);
          SendMessage(this.Handle, EM_SETSCROLLPOS, 0, ref lastScroll);
          SendMessage(this.Handle, WM_SETREDRAW, 1, IntPtr.Zero);
          this.Invalidate();
          this.ResumeLayout();
        }
      }
    }
  }

  [Browsable(false)]
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  public Font CurrentFont {
    get {
      Font result = this.Font;
      if (this.SelectionLength == 0) {
        result = SelectionFont;
      } else {
        using (RichBox rb = new RichBox()) {
          rb.FreezeDrawing = true;
          rb.SelectAll();
          rb.SelectedRtf = this.SelectedRtf;
          rb.Select(0, 1);
          result = rb.SelectionFont;
        }
      }
      return result;
    }
  }

  [Browsable(false)]
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  public string SelectionFontName {
    get { return CurrentFont.FontFamily.Name; }
    set {
      CHARFORMAT cf = new CHARFORMAT();
      cf.cbSize = Marshal.SizeOf(cf);
      cf.szFaceName = new char[32];
      cf.dwMask = CFM_FACE;
      value.CopyTo(0, cf.szFaceName, 0, Math.Min(31, value.Length));
      IntPtr lParam = Marshal.AllocCoTaskMem(Marshal.SizeOf(cf));
      Marshal.StructureToPtr(cf, lParam, false);
      SendMessage(this.Handle, EM_SETCHARFORMAT, SCF_SELECTION, lParam);
    }
  }

  [Browsable(false)]
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  public float SelectionFontSize {
    get { return CurrentFont.Size; }
    set {
      CHARFORMAT cf = new CHARFORMAT();
      cf.cbSize = Marshal.SizeOf(cf);
      cf.dwMask = CFM_SIZE;
      cf.yHeight = Convert.ToInt32(value * 20);
      IntPtr lParam = Marshal.AllocCoTaskMem(Marshal.SizeOf(cf));
      Marshal.StructureToPtr(cf, lParam, false);
      SendMessage(this.Handle, EM_SETCHARFORMAT, SCF_SELECTION, lParam);
    }
  }

  [Browsable(false)]
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  public bool SelectionBold {
    get { return CurrentFont.Bold; }
    set {
      CHARFORMAT cf = new CHARFORMAT();
      cf.cbSize = Marshal.SizeOf(cf);
      cf.dwMask = CFM_BOLD;
      cf.dwEffects = value ? CFM_BOLD : 0;
      IntPtr lParam = Marshal.AllocCoTaskMem(Marshal.SizeOf(cf));
      Marshal.StructureToPtr(cf, lParam, false);
      SendMessage(this.Handle, EM_SETCHARFORMAT, SCF_SELECTION, lParam);
    }
  }

  [Browsable(false)]
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  public bool SelectionItalic {
    get { return CurrentFont.Italic; }
    set {
      CHARFORMAT cf = new CHARFORMAT();
      cf.cbSize = Marshal.SizeOf(cf);
      cf.dwMask = CFM_ITALIC;
      cf.dwEffects = value ? CFM_ITALIC : 0;
      IntPtr lParam = Marshal.AllocCoTaskMem(Marshal.SizeOf(cf));
      Marshal.StructureToPtr(cf, lParam, false);
      SendMessage(this.Handle, EM_SETCHARFORMAT, SCF_SELECTION, lParam);
    }
  }

  [Browsable(false)]
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  public bool SelectionStrikeout {
    get { return CurrentFont.Strikeout; }
    set {
      CHARFORMAT cf = new CHARFORMAT();
      cf.cbSize = Marshal.SizeOf(cf);
      cf.dwMask = CFM_STRIKE;
      cf.dwEffects = value ? CFM_STRIKE : 0;
      IntPtr lParam = Marshal.AllocCoTaskMem(Marshal.SizeOf(cf));
      Marshal.StructureToPtr(cf, lParam, false);
      SendMessage(this.Handle, EM_SETCHARFORMAT, SCF_SELECTION, lParam);
    }
  }

  [Browsable(false)]
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  public bool SelectionUnderline {
    get { return CurrentFont.Underline; }
    set {
      CHARFORMAT cf = new CHARFORMAT();
      cf.cbSize = Marshal.SizeOf(cf);
      cf.dwMask = CFM_UNDERLINE;
      cf.dwEffects = value ? CFM_UNDERLINE : 0;
      IntPtr lParam = Marshal.AllocCoTaskMem(Marshal.SizeOf(cf));
      Marshal.StructureToPtr(cf, lParam, false);
      SendMessage(this.Handle, EM_SETCHARFORMAT, SCF_SELECTION, lParam);
    }
  }
}

Он добавляет новые свойства, такие как SelectionBold, SelectionItalic и т. Д., Где вы можете применить этот атрибут и не потерять другое форматирование текста.

6
ответ дан LarsTech 21 August 2018 в 01:08
поделиться
  • 1
    Отлично! благодаря – Jerry 30 April 2013 в 21:20
  • 2
    Привет, LarsTech. Иногда, когда я изменяю шрифт для большого выделения, содержащего полужирный шрифт, смелое значение теряется. Когда я нажимаю Ctrl + Z один раз, полужирный объект восстанавливается. У вас есть идея, почему это может произойти? благодаря – Jerry 11 June 2013 в 22:49
  • 3
    @Jerry Если вы меняете свойство SelectionFont, то да, вы говорите документу, чтобы заменить все атрибуты шрифта новым шрифтом. Чтобы изменить шрифт, но сохраните атрибуты, попробуйте использовать свойства SelectionFontName или SelectionFontSize. Кроме того, Ctrl-Z - это функция отмены. – LarsTech 17 June 2013 в 14:25
  • 4
    Спасибо, это была проблема. Я забыл обновить одну функцию, чтобы использовать SelectionFontName вместо SelectionFont. – Jerry 17 June 2013 в 20:56
  • 5
    @AlexJolig AutoScaleMode - это свойство формы, а не свойство RichTextBox. Удалите строку. – LarsTech 30 August 2015 в 13:48
Private Sub changeFont(ByVal fontz As FontStyle, getStr As RichTextBox)
   Dim currentFont As System.Drawing.Font = txt.SelectionFont
   Dim newFontStyle As System.Drawing.FontStyle
   newFontStyle = fontz
   getStr.SelectionFont = New Font(currentFont.FontFamily, currentFont.Size, newFontStyle)
End Sub

Это изменит свойство шрифта выделенного текста. Образец:

changeFont(FontStyle.Italic, [textbox_name])
0
ответ дан croxy 21 August 2018 в 01:08
поделиться

Вы можете передать новое имя шрифта, сохранив другие значения, используя существующие свойства шрифта richtextbox. Для изменения только имени шрифта выделенного текста вам нужно выполнить:

if (rtb.SelectionFont !=null)
    rtb.SelectionFont = new Font(fontName, rtb.SelectionFont.Size, rtb.SelectionFont.Style);

Обратите внимание, что приведенный выше код будет работать, только если весь выделенный текст имеет одинаковое форматирование (размер шрифта, стиль и т. Д.). Это обнаружено, сначала проверив свойство SelectionFont, оно будет равно null, если выбор содержит сочетание стилей.

Теперь, чтобы изменить имя шрифта для всего содержимого richtextbox при сохранении другого форматирования, вам нужно для прокрутки всех символов richtextbox и применения имени шрифта один за другим.

for (int i = 0; i < rtb.TextLength; i++)
{
    rtb.Select(i, 1);
    rtb.SelectionFont = new Font(fontName, rtb.SelectionFont.Size, rtb.SelectionFont.Style);
}
2
ответ дан ePandit 21 August 2018 в 01:08
поделиться

Вы можете передать новые значения для любого параметра, который вы хотите, и использовать свойства rtb для сохранения других значений. Например, если вы хотите изменить font family, но хотите сохранить font size, это то, что вы бы сделали:

rtb.SelectionFont = new Font(fontName, rtb.Font.Size);

Это изменит семейство SelectionFont на fontName, но сохраняет размер шрифта. Вы можете использовать один и тот же шаблон для других перегрузок.

0
ответ дан PoweredByOrange 21 August 2018 в 01:08
поделиться
  • 1
    Но если существуют разные размеры шрифта, это не сработает. – Jerry 30 April 2013 в 19:15
  • 2
    что вы имеете в виду разные размеры шрифта? Объясните, что именно вы пытаетесь достичь, а затем, возможно, мы сможем понять это. – PoweredByOrange 30 April 2013 в 19:18
  • 3
Другие вопросы по тегам:

Похожие вопросы: