it-swarm.com.de

Fetter Text in MessageBox

Wie kann ich den Text in dem von MessageBox.Show angezeigten Dialog mit C # fett hervorheben?

26
Karthick

Es ist möglich, dass ein Meldungsfeld ein normales Fenster ist, mit dem Sie wie jedes andere nur einen Fehler machen können. Der Code dafür ist jedoch etwas grob. Fügen Sie Ihrem Projekt eine neue Klasse hinzu und fügen Sie diesen Code ein:

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

Und benutze es so:

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

Bei diesem Ansatz gibt es einen Fehler. Nachdem die Schriftart fett dargestellt wurde, muss der Text immer noch in das statische Steuerelement passen, das das Meldungsfeld für den Text reserviert hat. Dafür musste ich die Schrift verkleinern. Möglicherweise müssen Sie diesen Wert anpassen.

28
Hans Passant

Du kannst nicht Dies ist ein Wrapper für die API MessageBoxEx .

Erstellen Sie dazu Ihr eigenes benutzerdefiniertes Meldungsfeld.


Sie können das Tutorial " this " als Beispiel für die Implementierung eines solchen folgen.

Die grundlegenden Schritte zum Erstellen eines solchen Formulars:

  1. Erstellen Sie ein neues Formular
  2. Fügen Sie eine Beschriftung und zwei Schaltflächen hinzu
  3. Legen Sie die Beschriftungsschriftart auf Fett fest
  4. fügen Sie beiden Schaltflächen einen Handler hinzu, schließen Sie das Formular und legen Sie eine Eigenschaft fest, für die die Schaltfläche gedrückt wurde.
5
Amirshk

Geht nicht. Sie müssen Ihre eigene Box bauen. Ich gehe davon aus, dass dies WinForms ist. Wenn es sich um ASP.NET handelt, kann ich nicht antworten.

0
bmargulies

Erweiterte MessageBox .NET-Assembly XMSG .NET-Webseite: Weitere Informationen, Download

Passt eine Vielzahl von MessageBox-Einstellungen an.

Zu den anpassbaren Funktionen gehören Nachrichtenschriftart und -farbe, Schaltflächenbeschriftungen, Schriftarten und QuickInfos, Hintergrund des Dialogs, Position des Dialogfelds, Dialogfeldsymbol, Timeout und mehr. Abhängig von der ausgewählten Nachrichtenschriftart ändert sich die Größe des Dialogfensters automatisch, um die Nachricht aufzunehmen.

Zusätzliche Steuerelemente, die optional angezeigt werden können: Kontrollkästchen, Texteingabe, Weblink, bis zu 3 zusätzliche Schaltflächen.

In Ihrem .NET-Code rufen Sie noch normale MessageBox.Show auf. Extended MessageBox ist kein benutzerdefiniertes Dialogfeld. Dies ist immer noch normale MessageBox mit erweiterten Funktionen.

Unterstützte Betriebssysteme: XP, 2000, 2003, 2008 Vista, Win7 - 32 oder 64-Bit.

Die Downloads umfassen eine voll funktionsfähige Testversion und eine reguläre Version mit vollständigem C # -Quellcode.

0