web-dev-qa-db-fra.com

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 #?

26
Karthick

C'est possible, une boîte de message est une fenêtre normale qui peut être gâchée comme une autre. Le code pour le faire est cependant un peu rocailleux. Ajoutez 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 utilisez-le comme ceci:

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

Il y a une faille dans cette approche. Après avoir mis la police en gras, le texte doit toujours tenir dans le contrôle statique réservé à la boîte de message pour le texte. Cela m'a obligé à réduire la taille de la police. Vous devrez peut-être modifier cette valeur.

28
Hans Passant

Tu ne peux pas. Ceci est un wrapper pour l'API MessageBoxEx .

Créez votre propre boîte de message personnalisée pour le faire.


Vous pouvez suivre this tutorial, à titre d'exemple pour en implémenter un.

Les étapes de base de la création d'un tel formulaire:

  1. Créer un nouveau formulaire
  2. Ajouter une étiquette et deux boutons
  3. Définissez la police de l'étiquette sur Gras
  4. ajoute un gestionnaire aux deux boutons, ferme le formulaire et définit une propriété pour laquelle le bouton a été enfoncé.
5
Amirshk

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

0
bmargulies

Extended MessageBox .NET AssemblyPage Web XMSG .NET: pour plus d'informations, téléchargez

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

Les fonctions ajustables incluent la police et la couleur du message, les légendes des boutons, les polices et les info-bulles, l’arrière-plan de la boîte de dialogue, la position de la boîte de dialogue, l’icône de la boîte de dialogue, le délai d’expiration, etc. Selon la police de message sélectionnée, la fenêtre de dialogue se redimensionne automatiquement pour accueillir le message.

Commandes supplémentaires pouvant être éventuellement affichées: case à cocher, saisie de texte, lien Web, jusqu'à 3 boutons supplémentaires.

Dans votre code .NET, vous appelez toujours MessageBox.Show standard. Extended MessageBox n'est pas une boîte de dialogue personnalisée. Ceci est encore normal MessageBox avec des fonctionnalités étendues ajoutées.

Système d'exploitation pris en charge: XP, 2000, 2003, 2008 Vista, Win7 - 32 ou 64 bits.

Les téléchargements comprennent une version d'évaluation entièrement fonctionnelle et une version standard avec code source complet C #.

0