【发布时间】:2010-02-13 20:56:51
【问题描述】:
如何使用 C# 在MessageBox.Show 显示的对话框中以粗体显示文本?
【问题讨论】:
-
我知道这已经有一段时间了,但是对于当前的问题和后代问题一样多,请务必选择一个答案 - 也是一种向那些花时间做出回应的人致敬的方式。
标签: c# winforms messagebox
如何使用 C# 在MessageBox.Show 显示的对话框中以粗体显示文本?
【问题讨论】:
标签: c# winforms messagebox
有可能,消息框是一个普通的窗口,可以像任何其他窗口一样被弄乱。然而,这样做的代码有点粗糙。向您的项目添加一个新类并粘贴此代码:
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");
}
}
这种方法有一个缺陷。使字体加粗后,文本必须仍然适合消息框为文本保留的静态控件。这需要我把字体变小。您可能需要调整此值。
【讨论】:
你不能。这是 API MessageBoxEx 的包装器。
创建您自己的自定义消息框来执行此操作。
您可以按照this 教程,作为如何实现的示例。
创建此类表单的基本步骤:
【讨论】:
没有办法。你必须建立自己的盒子。我假设这是WinForms,如果是ASP.NET我没有资格回答。
【讨论】:
扩展 MessageBox .NET 程序集 XMSG .NET web page: more info, download
动态调整各种 MessageBox 视觉设置。
可调整的功能包括消息字体和颜色、按钮标题、字体和工具提示、对话框背景、对话框位置、对话框图标、超时等。根据选择的消息字体,对话窗口会自动调整大小以适应消息。
可以选择显示的其他控件:复选框、文本输入、网络链接、最多 3 个额外按钮。
在您的 .NET 代码中,您仍然调用常规 MessageBox.Show。 Extended MessageBox 不是定制的对话框。这仍然是添加了扩展功能的常规 MessageBox。
支持的操作系统:XP、2000、2003、2008 Vista、Win7 -- 32 或 64 位。
下载包括全功能试用版和带有完整 C# 源代码的普通版。
【讨论】: