vb.net 如何在 Visual Basic 中自定义“MsgBox”控件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16015035/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-09 16:49:52  来源:igfitidea点击:

How to customize a "MsgBox" control in Visual Basic

vb.netmsgbox

提问by Gavin

Is there a way to customize the MsgBoxcontrol in Visual Basic?

有没有办法在 Visual Basic 中自定义MsgBox控件?

I use it quite often to alert users. However it never pops up on the screen; it just appears along the bottom task bar. It also always has a heading similar to "App_data_xxx". Can I improve this in any way?

我经常使用它来提醒用户。但是它永远不会在屏幕上弹出;它只出现在底部任务栏上。它也总是有一个类似于“App_data_xxx”的标题。我可以以任何方式改进吗?

My searches aren't throwing up much help.

我的搜索并没有提供太多帮助。

For example:

例如:

' Queries user number and password against the database and returns user
Dim matchingusers = From u In db.Users
                    Where username = u.Email And password = u.Password
                    Select u

' Checks if a valid user was returned
If matchingusers.Count = 0 Then
    MsgBox("Invalid user entered, try again")
Else
    SelectedDeveloper = 0
    ' Set the logged in user for use in the project
    GlobalVariables.LoggedInUser = matchingusers.First

回答by phadaphunk

You are using a reference to the MessageBoxclass without specifying the Methodyou want to call. You cannot create an instance of MessageBoxand therefore cannot pass a string as parameter to try and create one.

您正在使用对MessageBox类的引用,而未指定Method要调用的 。您不能创建 的实例,MessageBox因此不能将字符串作为参数传递来尝试创建一个。

Use MessageBox.Show(string messageText)to display the MessageBoxwith the desired message.

使用MessageBox.Show(string messageText)以显示MessageBox与所希望的消息。

As for your question, you should create your own MessageBoxclass. With this solution, you get all the options you want and can customize it completely. The call will be a little different :

至于你的问题,你应该创建自己的MessageBox类。使用此解决方案,您可以获得所需的所有选项,并且可以完全自定义。调用会有所不同:

//C#
var myCustomMessageBox = new CustomMessageBox();
myCustomMessageBox.ShowDialog();

//Vb
Dim myCustomMessageBox As New CustomMessageBox()
myCustomMessageBox.ShowDialog()

The ShowDialog()will be used to create the effect of a messagebox.

所述的ShowDialog()将被用来创建一个消息的效果。

回答by Ayman El Temsahi

You can use the MessageBoxfunction and its many variables. Here's an example of what it can do:

您可以使用该MessageBox函数及其许多变量。下面是它可以做什么的一个例子:

 MessageBox.Show("The Displayed text in the messagebox", _
         "the text displayed in the title bar", MessageBoxButtons.YesNoCancel, _
             MessageBoxIcon.Error, MessageBoxDefaultButton.Button2)

Or you can still use MsgBoxand use its variables, though it gives you fewer options. Here's an example:

或者您仍然可以使用MsgBox和使用它的变量,尽管它为您提供了更少的选择。下面是一个例子:

MsgBox("message text", MsgBoxStyle.Information, "title bar text")

回答by Graeme Wallace

In Visual Basic 2008 I had a requirement for a message box that would only stay on for short times and that the time it was on to be variable. I also had the problem that when using extended screen that the msgbox showed up on the extended screen (which was a different form) instead of on the main computer screen. To overcome these problems I created a custom Message Box using a panel on the form I had on the main screen.

在 Visual Basic 2008 中,我需要一个消息框,该消息框只能停留很短的时间,并且它的开启时间是可变的。我还有一个问题,当使用扩展屏幕时,msgbox 出现在扩展屏幕(这是一种不同的形式)而不是主计算机屏幕上。为了克服这些问题,我使用主屏幕上表单上的面板创建了一个自定义消息框。

To call the message panel DoMessage("The message", Seconds, Buttons to show 1 = Ok only 2 = Yes(ok) and No, 3 = Yes, No and Cancel. If seconds is 0 or not specified then the time to show the panel is set to a long time (10000 seconds) If Buttons to show is not specified it is set to Ok button only. If seconds and buttons are both specified, If no button is clicked the panel will just hide after the timeout.

调用消息面板 DoMessage("The message", Seconds, Buttons to show 1 = Ok only 2 = Yes(ok) and No, 3 = Yes, No and Cancel. 如果 seconds 为 0 或未指定,则显示时间面板设置为长时间(10000 秒)如果未指定要显示的按钮,则仅设置为确定按钮。如果同时指定了秒和按钮,如果没有单击按钮,则面板将在超时后隐藏。

The responses are 1 if Ok or Yes is clicked, 2 if No is clicked, 3 if Cancel is clicked It is put into DoMsgResp so you see what is in it to handle the response.

如果单击“确定”或“是”,则响应为 1,如果单击“否”,则为 2,如果单击“取消”则为 3。它被放入 DoMsgResp 中,以便您查看其中处理响应的内容。

Create the message panel when opening the form by calling MakeMsgPanel()

通过调用 MakeMsgPanel() 在打开表单时创建消息面板

Dim MessagePanel As New Panel    'The panel 
Dim MessageLabel As New Label    'The message 
Dim MsgYes As New Button          'Yes or OK button
Dim MsgNo As New Button          'no button
Dim MsgCcl As New Button         'Cancel button
Dim Sleepsecs As Integer          'How long panel shows for 
Dim DoMsgResp As Integer         'response 1, 2 or 3 depending which button clicked
Private Sub MakeMsgPanel()
    Me.Controls.Add(MessagePanel)
    Me.MessagePanel.Controls.Add(MessageLabel)
    Me.MessagePanel.Controls.Add(MsgYes)
    Me.MessagePanel.Controls.Add(MsgNo)
    Me.MessagePanel.Controls.Add(MsgCcl)
    MessagePanel.Location = New System.Drawing.Point(Me.Width / 2 - 200, Me.Height / 2 - 100)
    MessagePanel.BackColor = Color.PaleGreen
    MessageLabel.BackColor = Color.PeachPuff
    MessagePanel.BorderStyle = BorderStyle.FixedSingle
    MessageLabel.Font = New Font("Arial", 12, FontStyle.Regular, GraphicsUnit.Point)
    MessageLabel.AutoSize = True
    MessagePanel.AutoSize = True
    MessagePanel.AutoSizeMode = Windows.Forms.AutoSizeMode.GrowOnly
    MessagePanel.Hide()
    MsgYes.Location = New System.Drawing.Point(205, 5)
    MsgNo.Location = New System.Drawing.Point(115, 5)
    MsgCcl.Location = New System.Drawing.Point(25, 5)
    MsgYes.Text = "Yes"
    MsgNo.Text = "No"
    MsgCcl.Text = "Cancel"
    AddHandler MsgYes.Click, AddressOf MsgYes_Click
    AddHandler MsgNo.Click, AddressOf MsgNo_Click
    AddHandler MsgCcl.Click, AddressOf MsgCcl_Click
End Sub


Private Sub MsgYes_Click()
    DoMsgResp = 1
    Sleepsecs = 0
End Sub


Private Sub MsgNo_Click()
    DoMsgResp = 2
    Sleepsecs = 0
End Sub
Private Sub MsgCcl_Click()
    DoMsgResp = 3
    Sleepsecs = 0
End Sub


  Private Sub DoMessage(ByVal Msg As String, Optional ByVal Secs As Integer = 0, _
           Optional ByVal Btns As Integer = 0)
    'Information messages that can be timed
    Dim TheHeight As Integer
    Dim TheWidth As Integer
    Dim Labelx As Integer
    Dim Labely As Integer
    DoMsgResp = 0
    MessageLabel.Text = Msg
    If MessageLabel.Height < 90 Then
        TheHeight = 100
        Labely = (100 - MessageLabel.Height) / 2
    Else
        TheHeight = MessageLabel.Height + 10
        Labely = 5
    End If
    If MessageLabel.Width < 140 Then
        TheWidth = 150
        Labelx = (150 - MessageLabel.Width) / 2
    Else
        TheWidth = MessageLabel.Width + 10
        Labelx = 5
    End If
    MessagePanel.Size = New System.Drawing.Size(TheWidth, TheHeight)
    MessageLabel.Location = New System.Drawing.Point(Labelx, Labely)
    MessageLabel.Show()
    MessagePanel.Show()
    MessagePanel.BringToFront()
    MsgYes.BringToFront()
    MsgNo.BringToFront()
    MsgCcl.BringToFront()
    MessagePanel.Focus()
    If Btns = 0 Or Btns > 3 Then Btns = 1 'Make ok button if none specified or number too high
    If Btns = 1 Then
        MsgYes.Text = "Ok"
        MsgNo.Hide()
        MsgCcl.Hide()
    Else    'is 2 or 3 
        MsgYes.Text = "Yes"
        MsgNo.Show()
        If Btns = 2 Then MsgCcl.Hide() Else MsgCcl.Show()
    End If
    If Secs = 0 Then Secs = 10000 'make a long time
    If Secs > 0 Then
        Sleepsecs = Secs * 2
        Do Until Sleepsecs < 1
            Threading.Thread.Sleep(500)
            Application.DoEvents()
            Application.RaiseIdle(New System.EventArgs)
            Sleepsecs = Sleepsecs - 1
        Loop
    End If
    MessagePanel.Hide()
End Sub


 Private Sub ButtonTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonTest.Click
            DoMessage("This is To see what happens with my message" & vbCrLf & _
              "see if it works good", 0, 3)
    If DoMsgResp = 1 Then
        MsgBox("Ok was hit")
    End If
    If DoMsgResp = 2 Then
        MsgBox("No was hit")
    End If
    If DoMsgResp = 3 Then
        MsgBox("Cancel was hit")
    End If
End Sub