Жирный текст в MessageBox

Как я могу показать текст жирным шрифтом в диалоговом окне, отображаемом MessageBox.Show, с помощью С#?


person Karthick    schedule 13.02.2010    source источник
comment
Я знаю, что это было давно, но так как SO предназначен как для текущих проблем, так и для потомков, пожалуйста, выберите ответ — также как способ почтить тех, кто нашел время, чтобы ответить.   -  person Dav    schedule 20.04.2019


Ответы (4)


Возможно, окно сообщения — это обычное окно, с которым можно повозиться, как и с любым другим. Однако код для этого немного грубоват. Добавьте новый класс в свой проект и вставьте этот код:

using System;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

class BoldMessageBox : IDisposable {
  private int mTries = 0;
  private Form mOwner;
  private Font mFont;

  public BoldMessageBox(Form owner) {
    mOwner = owner;
    owner.BeginInvoke(new MethodInvoker(findDialog));
  }

  private void findDialog() {
    // Enumerate windows to find the message box
    if (mTries < 0) return;
    EnumThreadWndProc callback = new EnumThreadWndProc(checkWindow);
    if (EnumThreadWindows(GetCurrentThreadId(), callback, IntPtr.Zero)) {
      if (++mTries < 10) mOwner.BeginInvoke(new MethodInvoker(findDialog));
    }
  }
  private bool checkWindow(IntPtr hWnd, IntPtr lp) {
    // Checks if <hWnd> is a dialog
    StringBuilder sb = new StringBuilder(260);
    GetClassName(hWnd, sb, sb.Capacity);
    if (sb.ToString() != "#32770") return true;
    // Got it, get the STATIC control that displays the text
    IntPtr hText = GetDlgItem(hWnd, 0xffff);
    if (hText != IntPtr.Zero) {
      // Get the current font
      IntPtr hFont = SendMessage(hText, WM_GETFONT, IntPtr.Zero, IntPtr.Zero);
      Font font = Font.FromHfont(hFont);
      // And make it bold (note the size change to keep enough space!!)
      mFont = new Font(font.FontFamily, font.SizeInPoints - 1f, FontStyle.Bold);
      SendMessage(hText, WM_SETFONT, mFont.ToHfont(), (IntPtr)1);
    }
    // Done
    return false;
  }
  public void Dispose() {
    mTries = -1;
    mOwner = null;
    if (mFont != null) mFont.Dispose();
  }

  // P/Invoke declarations
  private const int WM_SETFONT = 0x30;
  private const int WM_GETFONT = 0x31;
  private delegate bool EnumThreadWndProc(IntPtr hWnd, IntPtr lp);
  [DllImport("user32.dll")]
  private static extern bool EnumThreadWindows(int tid, EnumThreadWndProc callback, IntPtr lp);
  [DllImport("kernel32.dll")]
  private static extern int GetCurrentThreadId();
  [DllImport("user32.dll")]
  private static extern int GetClassName(IntPtr hWnd, StringBuilder buffer, int buflen);
  [DllImport("user32.dll")]
  private static extern IntPtr GetDlgItem(IntPtr hWnd, int item);
  [DllImport("user32.dll")]
  private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
}

И используйте это так:

private void button1_Click(object sender, EventArgs e) {
  using (new BoldMessageBox(this)) {
    MessageBox.Show("Nobugz waz here");
  }
}

В этом подходе есть один недостаток. После выделения шрифта полужирным текст должен по-прежнему помещаться в статическом элементе управления, который окно сообщения зарезервировало для текста. Это потребовало от меня уменьшения шрифта. Возможно, вам придется настроить это значение.

person Hans Passant    schedule 13.02.2010

Вы не можете. Это оболочка для API MessageBoxEx.

Создайте свой собственный ящик сообщений, чтобы сделать это.


Вы можете следовать этому руководству, чтобы посмотреть, как его реализовать.

Основные этапы создания такой формы:

  1. Создать новую форму
  2. Добавьте метку и две кнопки
  3. Установите шрифт метки на жирный
  4. добавить обработчик к обеим кнопкам, закрывающий форму и устанавливающий какое-то свойство, для которого была нажата кнопка.
person Amirshk    schedule 13.02.2010
comment
Спасибо, не могли бы вы предложить какие-то шаги для этого? - person Karthick; 14.02.2010
comment
да, даже добавил несколько основных шагов в качестве ориентира. - person Amirshk; 14.02.2010
comment
MessageBox — это форма, обертывающая MessageBoxEx. Если присмотреться, это либо модальное, либо немодальное диалоговое окно, основанное на форме. Вы можете создать свой собственный класс самостоятельно, чтобы эмулировать такое же поведение - person ; 14.02.2010

Нет не могу. Вам придется построить свою собственную коробку. Я предполагаю, что это WinForms, если это ASP.NET, я не имею права отвечать.

person bmargulies    schedule 13.02.2010

Расширенная сборка MessageBox .NET Веб-страница XMSG .NET: дополнительная информация, скачать

Настраивает на лету множество визуальных настроек MessageBox.

Настраиваемые функции включают шрифт и цвет сообщения, заголовки кнопок, шрифты и всплывающие подсказки, фон диалогового окна, положение диалогового окна, значок диалогового окна, время ожидания и многое другое. В зависимости от выбранного шрифта сообщения размер диалогового окна автоматически изменяется, чтобы вместить сообщение.

Дополнительные элементы управления, которые могут отображаться по желанию: флажок, ввод текста, веб-ссылка, до 3 дополнительных кнопок.

В вашем коде .NET вы по-прежнему вызываете обычный MessageBox.Show. Расширенный MessageBox не является настраиваемым диалоговым окном. Это по-прежнему обычный MessageBox с добавленными расширенными функциями.

Поддерживаемые ОС: XP, 2000, 2003, 2008 Vista, Win7 — 32- или 64-разрядная.

Загрузки включают полнофункциональную пробную версию и обычную версию с полным исходным кодом C#.

person Anatoliy Mogylevets    schedule 17.05.2010