Texte en gras dans MessageBox

Comment puis-je afficher le texte en gras dans la boîte de dialogue affichée par MessageBox.Show, en utilisant C#?

25
demandé sur FishBasketGordo 2010-02-13 23:56:51

4 réponses

il est possible, une boîte de message est une fenêtre normale qui peut être modifiée comme n'importe quelle autre. Le code pour le faire est cependant un peu graveleux. Ajouter une nouvelle classe à votre projet et collez ce code:

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

Et l'utiliser comme ceci:

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

il y a un défaut dans cette approche. Après avoir fait le caractère gras, le texte doit toujours s'insérer dans la commande statique que la zone de message réservée pour le texte. Qui m'a obligé de faire la police de caractères plus petits. Vous pourriez avoir à modifier cette valeur.

27
répondu Hans Passant 2010-06-11 12:09:35

Vous ne pouvez pas. Ceci est un wrapper pour l'API MessageBoxEx.

créez votre propre boîte de messagerie personnalisée pour le faire.


Vous pouvez suivre tutoriel, comme exemple d'implémentation.

L'essentiel des étapes de la création d'une telle forme:

  1. Créer un nouveau formulaire
  2. Ajouter une étiquette et deux boutons
  3. Réglez la police de caractères en gras
  4. ajouter handler aux deux boutons, fermeture de la forme et mise en place d'une propriété pour laquelle le bouton a été pressé.
5
répondu Amirshk 2010-02-13 21:09:53

Pas faire. Vous devrez construire votre propre boîte. Je suppose que C'est WinForms, si c'est ASP.NET Je ne suis pas qualifié pour répondre.

0
répondu bmargulies 2010-02-13 21:02:35

Extended MessageBox. net Assembly XMSG. net page web: more info, download

ajuste à la volée une grande variété de paramètres visuels MessageBox.

les traits réglables incluent la police de message et la couleur, les légendes de bouton, les polices et les tooltips, l'arrière-plan de dialogue, la position de dialogue, l'icône de dialogue, le timeout et plus. En fonction de la police de message sélectionnée, la fenêtre de dialogue se redimensionne automatiquement pour accommoder message.

commandes supplémentaires pouvant être affichées en option: case à cocher, entrée de texte, Lien web, jusqu'à 3 boutons supplémentaires.

dans votre. NET code vous appelez encore MessageBox normal.Montrer. Étendue MessageBox n'est pas un dialogue. Il s'agit toujours de MessageBox régulier avec des fonctionnalités étendues ajoutées.

OS pris en charge: XP, 2000, 2003, 2008 Vista, Win7 -- 32 ou 64-bit.

les téléchargements comprennent la version d'essai entièrement fonctionnelle, et la version régulière avec complète du code source C#.

0
répondu Anatoliy Mogylevets 2010-05-17 23:50:28