【问题标题】:Highlight text in messagebox突出显示消息框中的文本
【发布时间】:2010-10-20 14:09:59
【问题描述】:

我需要显示一个消息框,但用户需要能够突出显示和复制消息框中的文本。我将如何实现这一目标?仅供参考,在 C# 中。

【问题讨论】:

    标签: c# text message highlight


    【解决方案1】:

    这是我用来创建自定义 MessageBox 的一些代码。下面是MessageBox类:

    '  A custom MessageBox class
    '  Written to allow custom button text, specifically to allow for bilingual messageboxes
    '
    Public Class CustomMessageBox
    
      'Variables
      Private _btn1Return As DialogResult
      Private _btn2Return As DialogResult
      Private _btn3Return As DialogResult
    
      'Enumerate system icons
      Enum SystemIcons
        ErrorIcon = 1
        WarningIcon = 2
        QuestionIcon = 3
        InformationIcon = 4
      End Enum
    
      'Enumerate possible button combinations
      Enum ButtonTypes
        YesNo = 1
        YesNoCancel = 2
        Ok = 3
        OkCancel = 4
      End Enum
    
      'Enumerate possible default buttons
      Enum DefaultButton
        Button1 = 1
        Button2 = 2
        Button3 = 3
      End Enum
    
    
    #Region "Constructor"
      'Constructor
      Public Sub New(ByVal text As String, ByVal caption As String, ByVal buttons As ButtonTypes, ByVal icon As SystemIcons, ByVal defaultButton As DefaultButton)
        InitializeComponent()
        Me.Text = caption
        Me.msgBoxText.Text = text
        SetupIcon(icon)
        SetupButtons(buttons, defaultButton)
      End Sub
    #End Region
    
    #Region "Functions"
      'Set text and return values of all buttons.  Also set focus to default button.
      Private Sub SetupButtons(ByVal buttons As Integer, ByVal defaultButton As Integer)
        Select Case buttons
          Case 1
            msgBoxButton1.Text = My.Resources.Caption_Yes
            _btn1Return = Windows.Forms.DialogResult.Yes
            msgBoxButton2.Text = My.Resources.Caption_No
            _btn2Return = Windows.Forms.DialogResult.No
            msgBoxButton3.Visible = False
          Case 2
            msgBoxButton1.Text = My.Resources.Caption_Yes
            _btn1Return = Windows.Forms.DialogResult.Yes
            msgBoxButton2.Text = My.Resources.Caption_No
            _btn2Return = Windows.Forms.DialogResult.No
            msgBoxButton3.Text = My.Resources.Caption_Cancel
            _btn3Return = Windows.Forms.DialogResult.Cancel
          Case 3
            msgBoxButton1.Text = My.Resources.Caption_OK
            _btn1Return = Windows.Forms.DialogResult.OK
            msgBoxButton2.Visible = False
            msgBoxButton3.Visible = False
          Case 4
            msgBoxButton1.Text = My.Resources.Caption_OK
            _btn1Return = Windows.Forms.DialogResult.OK
            msgBoxButton2.Text = My.Resources.Caption_Cancel
            _btn2Return = Windows.Forms.DialogResult.Cancel
            msgBoxButton3.Visible = False
        End Select
    
        'Set focus to specified default button
        Select Case defaultButton
          Case 1
            msgBoxButton1.Focus()
          Case 2
            msgBoxButton2.Focus()
          Case 3
            msgBoxButton3.Focus()
        End Select
    
      End Sub
    
      'Display specified icon
      Private Sub SetupIcon(ByVal iconValue As Integer)
        Dim icon As Icon = Nothing
        Select Case iconValue
          Case 1
            icon = System.Drawing.SystemIcons.Error
          Case 2
            icon = System.Drawing.SystemIcons.Warning
          Case 3
            icon = System.Drawing.SystemIcons.Question
          Case 4
            icon = System.Drawing.SystemIcons.Information
        End Select
    
        Me.msgBoxIcon.Image = icon.ToBitmap
      End Sub
    #End Region
    
    #Region "Events"
      'Set return value when button is clicked.
      Private Sub msgBoxButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles msgBoxButton1.Click
        Me.DialogResult = _btn1Return
        Me.Close()
      End Sub
    
      'Set return value when button is clicked.
      Private Sub msgBoxButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles msgBoxButton2.Click
        Me.DialogResult = _btn2Return
        Me.Close()
      End Sub
    
      'Set return value when button is clicked.
      Private Sub msgBoxButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles msgBoxButton3.Click
        Me.DialogResult = _btn3Return
        Me.Close()
      End Sub
    #End Region
    
    End Class
    

    这里是与之相关的设计器代码:

    <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    Partial Class CustomMessageBox
        Inherits System.Windows.Forms.Form
    
        'Form overrides dispose to clean up the component list.
        <System.Diagnostics.DebuggerNonUserCode()> _
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            Try
                If disposing AndAlso components IsNot Nothing Then
                    components.Dispose()
                End If
            Finally
                MyBase.Dispose(disposing)
            End Try
        End Sub
    
        'Required by the Windows Form Designer
        Private components As System.ComponentModel.IContainer
    
        'NOTE: The following procedure is required by the Windows Form Designer
        'It can be modified using the Windows Form Designer.  
        'Do not modify it using the code editor.
        <System.Diagnostics.DebuggerStepThrough()> _
        Private Sub InitializeComponent()
        Me.msgBoxText = New System.Windows.Forms.Label
        Me.msgBoxIcon = New System.Windows.Forms.PictureBox
        Me.TableLayoutPanel1 = New System.Windows.Forms.TableLayoutPanel
        Me.msgBoxButton1 = New System.Windows.Forms.Button
        Me.msgBoxButton3 = New System.Windows.Forms.Button
        Me.msgBoxButton2 = New System.Windows.Forms.Button
        CType(Me.msgBoxIcon, System.ComponentModel.ISupportInitialize).BeginInit()
        Me.TableLayoutPanel1.SuspendLayout()
        Me.SuspendLayout()
        '
        'msgBoxText
        '
        Me.msgBoxText.AutoSize = True
        Me.msgBoxText.Cursor = System.Windows.Forms.Cursors.Cross
        Me.msgBoxText.Dock = System.Windows.Forms.DockStyle.Fill
        Me.msgBoxText.FlatStyle = System.Windows.Forms.FlatStyle.Flat
        Me.msgBoxText.Location = New System.Drawing.Point(59, 0)
        Me.msgBoxText.MaximumSize = New System.Drawing.Size(245, 0)
        Me.msgBoxText.Name = "msgBoxText"
        Me.msgBoxText.Padding = New System.Windows.Forms.Padding(0, 10, 0, 10)
        Me.msgBoxText.Size = New System.Drawing.Size(39, 33)
        Me.msgBoxText.TabIndex = 6
        Me.msgBoxText.Text = "Label1"
        '
        'msgBoxIcon
        '
        Me.msgBoxIcon.Dock = System.Windows.Forms.DockStyle.Left
        Me.msgBoxIcon.Location = New System.Drawing.Point(0, 0)
        Me.msgBoxIcon.Name = "msgBoxIcon"
        Me.msgBoxIcon.Padding = New System.Windows.Forms.Padding(15, 10, 0, 0)
        Me.msgBoxIcon.Size = New System.Drawing.Size(59, 53)
        Me.msgBoxIcon.TabIndex = 4
        Me.msgBoxIcon.TabStop = False
        '
        'TableLayoutPanel1
        '
        Me.TableLayoutPanel1.AutoSize = True
        Me.TableLayoutPanel1.ColumnCount = 5
        Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
        Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle)
        Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle)
        Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle)
        Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
        Me.TableLayoutPanel1.Controls.Add(Me.msgBoxButton1, 1, 0)
        Me.TableLayoutPanel1.Controls.Add(Me.msgBoxButton3, 3, 0)
        Me.TableLayoutPanel1.Controls.Add(Me.msgBoxButton2, 2, 0)
        Me.TableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Bottom
        Me.TableLayoutPanel1.GrowStyle = System.Windows.Forms.TableLayoutPanelGrowStyle.FixedSize
        Me.TableLayoutPanel1.Location = New System.Drawing.Point(0, 53)
        Me.TableLayoutPanel1.Name = "TableLayoutPanel1"
        Me.TableLayoutPanel1.Padding = New System.Windows.Forms.Padding(0, 0, 0, 10)
        Me.TableLayoutPanel1.RowCount = 1
        Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle)
        Me.TableLayoutPanel1.Size = New System.Drawing.Size(305, 39)
        Me.TableLayoutPanel1.TabIndex = 5
        '
        'msgBoxButton1
        '
        Me.msgBoxButton1.AutoSize = True
        Me.msgBoxButton1.Location = New System.Drawing.Point(34, 3)
        Me.msgBoxButton1.Name = "msgBoxButton1"
        Me.msgBoxButton1.Size = New System.Drawing.Size(75, 23)
        Me.msgBoxButton1.TabIndex = 0
        Me.msgBoxButton1.Text = "Button1"
        Me.msgBoxButton1.UseVisualStyleBackColor = True
        '
        'msgBoxButton3
        '
        Me.msgBoxButton3.AutoSize = True
        Me.msgBoxButton3.Location = New System.Drawing.Point(196, 3)
        Me.msgBoxButton3.Name = "msgBoxButton3"
        Me.msgBoxButton3.Size = New System.Drawing.Size(75, 23)
        Me.msgBoxButton3.TabIndex = 2
        Me.msgBoxButton3.Text = "Button3"
        Me.msgBoxButton3.UseVisualStyleBackColor = True
        '
        'msgBoxButton2
        '
        Me.msgBoxButton2.AutoSize = True
        Me.msgBoxButton2.Location = New System.Drawing.Point(115, 3)
        Me.msgBoxButton2.Name = "msgBoxButton2"
        Me.msgBoxButton2.Size = New System.Drawing.Size(75, 23)
        Me.msgBoxButton2.TabIndex = 1
        Me.msgBoxButton2.Text = "Button2"
        Me.msgBoxButton2.UseVisualStyleBackColor = True
        '
        'CustomMessageBox
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.AutoSize = True
        Me.ClientSize = New System.Drawing.Size(305, 92)
        Me.Controls.Add(Me.msgBoxText)
        Me.Controls.Add(Me.msgBoxIcon)
        Me.Controls.Add(Me.TableLayoutPanel1)
        Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog
        Me.MaximizeBox = False
        Me.MinimizeBox = False
        Me.Name = "CustomMessageBox"
        Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide
        Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
        Me.Text = "MessageBox"
        Me.TopMost = True
        CType(Me.msgBoxIcon, System.ComponentModel.ISupportInitialize).EndInit()
        Me.TableLayoutPanel1.ResumeLayout(False)
        Me.TableLayoutPanel1.PerformLayout()
        Me.ResumeLayout(False)
        Me.PerformLayout()
    
      End Sub
      Friend WithEvents msgBoxText As System.Windows.Forms.Label
      Friend WithEvents msgBoxIcon As System.Windows.Forms.PictureBox
      Friend WithEvents TableLayoutPanel1 As System.Windows.Forms.TableLayoutPanel
      Friend WithEvents msgBoxButton1 As System.Windows.Forms.Button
      Friend WithEvents msgBoxButton3 As System.Windows.Forms.Button
      Friend WithEvents msgBoxButton2 As System.Windows.Forms.Button
    End Class
    

    【讨论】:

      【解决方案2】:

      为您的项目添加一个新表单。在 Visual Studio 中,您可以通过转到项目 -> 添加 Windows 窗体来执行此操作。

      修改表单,直到您觉得它看起来与标准窗口对话框足够接近。 您需要更改的一些属性:

      • FormBorderStyle
      • 开始位置
      • 最大化框
      • 最小化框
      • 显示图标
      • ShowInTaskbar

      为表单的标签使用只读文本框。并将文本框的 BorderStyle 设置为 None。

      最后,使用表单的 ShowDialog() 方法将其显示为模态对话框。

      PS。您还应该使用大量文本对其进行测试。您可能需要设置表单的自动调整大小模式并将文本框设置为多行并换行。

      希望对你有帮助。

      【讨论】:

        【解决方案3】:

        创建一个自定义消息框并使用禁用的 TextBox 并设置适当的样式来显示消息。

        根据 Jhonny 的评论:创建一个新表单,并使用 ShowDialog 显示它

        【讨论】:

        • 如何创建自定义消息框?
        • 新建一个Form,用ShowDialog显示
        【解决方案4】:

        当消息框处于活动状态时,当用户按 CTRL+C 时,Windows 具有复制消息框文本的隐藏功能。

        如果您需要允许用户突出显示文本,那么您需要创建一个自定义消息框来执行此操作。

        【讨论】:

          【解决方案5】:

          我认为使用默认文本控件并不容易,但您可以尝试 icsharpcode texteditorAlsing's text editor control

          我用 icsharpcode 来处理类似的东西,它很容易使用。

          【讨论】:

            猜你喜欢
            • 2012-12-20
            • 2016-01-09
            • 2022-08-14
            • 1970-01-01
            • 2014-02-09
            • 2016-05-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多