2013-04-15 5 views
0

Existe-t-il un moyen de personnaliser le contrôle MsgBox dans Visual Basic? Je l'utilise assez souvent pour alerter les utilisateurs. Cependant, il n'apparaît jamais à l'écran. il apparaît juste le long de la barre des tâches en bas. Il a également toujours un titre similaire à "App_data_xxx". Puis-je améliorer cela de quelque façon que ce soit?Comment personnaliser un contrôle "MsgBox" dans Visual Basic

Mes recherches ne sont pas très utiles.

Par exemple:

' 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 
+1

Pour une personnalisation complète juste faire un formulaire, puis le rendre visible à chaque fois que vous souhaitez alerter l'utilisateur ... – Sam

+4

MsgBox est la fonction Olden, MessageBox est une nouvelle avec plus d'options. Mais même MsgBox a un argument Title, difficile de ne pas le découvrir. Vous l'utilisez probablement de manière inappropriée si vous ressentez le besoin de le personnaliser.Son rapport dans le visage est assez grinçant à un utilisateur, utilisez-le seulement avec parcimonie et seulement pour les problèmes graves. Ou vous courez le risque que l'utilisateur rejette systématiquement la boîte sans la lire, manquant les plus importantes. Beaucoup de maux mineurs disponibles dans une bibliothèque de classe GUI. –

+0

Si vous utilisez vb .net, utilisez MessageBox. Si cela n'a pas ce que vous voulez, faites votre propre formulaire. – dbasnett

Répondre

2

Vous pouvez utiliser la fonction MessageBox et ses nombreuses variables. Voici un exemple de ce qu'il peut faire:

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

Ou vous pouvez toujours utiliser MsgBox et utiliser ses variables, mais il vous donne moins d'options. Voici un exemple:

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

Vous utilisez une référence à la classe MessageBox sans spécifier le Method que vous voulez appeler. Vous ne pouvez pas créer une instance de MessageBox et par conséquent ne pouvez pas passer une chaîne en tant que paramètre pour essayer d'en créer une.

Utilisez MessageBox.Show(string messageText) pour afficher le MessageBox avec le message souhaité. Pour votre question, vous devez créer votre propre classe MessageBox. Avec cette solution, vous obtenez toutes les options que vous voulez et pouvez le personnaliser complètement. L'appel sera un peu différent:

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

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

Le ShowDialog() sera utilisé pour créer l'effet d'un messagebox.

+0

merci pour la clarté – Gavin

0

En 2008, Visual Basic, j'ai eu une exigence pour une boîte de message qui ne rester pour peu de temps et que le temps était à être variable. J'ai également eu le problème que lors de l'utilisation de l'écran étendu que le msgbox a montré sur l'écran étendu (qui était une forme différente) au lieu de sur l'écran d'ordinateur principal. Pour surmonter ces problèmes, j'ai créé une boîte de message personnalisée en utilisant un panneau sur le formulaire que j'avais sur l'écran principal.

Pour appeler le panneau de message DoMessage ("Le message", Secondes, Boutons pour afficher 1 = OK seulement 2 = Oui (ok) et Non, 3 = Oui, Non et Annuler Si les secondes sont 0 ou non spécifiées l'affichage du panneau est long (10000 secondes) Si les boutons à afficher ne sont pas spécifiés, ils sont réglés sur le bouton Ok. Si les secondes et les boutons sont spécifiés, si aucun bouton n'est cliqué, le panneau se cache juste après le délai d'attente.

les réponses sont 1 si Ok ou vous cliquez sur Oui, 2 si Non est cliqué, 3 si Annuler est cliqué il est mis en DoMsgResp si vous voyez ce qui est en elle pour gérer la réponse.

Créer le panneau de message lorsque ouvrant le formulaire en appelant 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 
Questions connexes