2013-09-09 3 views
2

Могу ли я показывать пользовательские кнопки внутри MsgBox? Я хочу, чтобы различные кнопки от обычных кнопок для MsgBox которых:Как я могу управлять инструментом «msgbox» в VB. net

  1. OK
  2. Отменить
  3. Прервать
  4. Retry
  5. Игнорировать
  6. Да
  7. Нет

Как я могу управлять текстом n значение этих кнопок?

ответ

3

Нет, MsgBox привязан непосредственно к базовому пользовательскому интерфейсу Windows и не может быть легко изменен или расширен.
Вы должны создать свой собственный класс или искать уже сделал проект, как это один

A versatile MessageBox replacement

Ну, немного исследований по этому вопросу привело меня к этой старой статье и код

Using Windows Hooks to Enhance MessageBox in .NET

но это большая работа, и, возможно, вы могли бы лучше использовать свое время, чтобы создать свой собственный класс сообщений.

1

Вы можете изменить окно сообщения, но будут ограничения. Максимальное количество кнопок - 3. Текст кнопок можно изменить.

Добавьте в свой проект следующий класс, который поможет вам изменить текст кнопок.

Imports System.Text 
Imports System.Windows.Forms 

Public Class MessageClass 

Private Shared mLabels() As String '' Desired new labels 
Private Shared mLabelIndex As Integer '' Next caption to update 

Public Shared Sub PatchMsgBox(ByVal labels() As String) 
    ''--- Updates message box buttons 
    mLabels = labels 
    Application.OpenForms(0).BeginInvoke(New FindWindowDelegate(AddressOf FindMsgBox), GetCurrentThreadId()) 
End Sub 

Private Shared Sub FindMsgBox(ByVal tid As Integer) 
    ''--- Enumerate the windows owned by the UI thread 
    EnumThreadWindows(tid, AddressOf EnumWindow, IntPtr.Zero) 
End Sub 

Private Shared Function EnumWindow(ByVal hWnd As IntPtr, ByVal lp As IntPtr) As Boolean 
    ''--- Is this the message box? 
    Dim sb As New StringBuilder(256) 
    GetClassName(hWnd, sb, sb.Capacity) 
    If sb.ToString() <> "#32770" Then Return True 
    ''--- Got it, now find the buttons 
    mLabelIndex = 0 
    EnumChildWindows(hWnd, AddressOf FindButtons, IntPtr.Zero) 
    Return False 
End Function 

Private Shared Function FindButtons(ByVal hWnd As IntPtr, ByVal lp As IntPtr) As Boolean 
    Dim sb As New StringBuilder(256) 
    GetClassName(hWnd, sb, sb.Capacity) 
    If sb.ToString() = "Button" And mLabelIndex <= UBound(mLabels) Then 
     ''--- Got one, update text 
     SetWindowText(hWnd, mLabels(mLabelIndex)) 
     mLabelIndex += 1 
    End If 
    Return True 
End Function 

''--- P/Invoke declarations 
Private Delegate Sub FindWindowDelegate(ByVal tid As Integer) 
Private Delegate Function EnumWindowDelegate(ByVal hWnd As IntPtr, ByVal lp As IntPtr) As Boolean 
Private Declare Auto Function EnumThreadWindows Lib "user32.dll" (ByVal tid As Integer, ByVal callback As EnumWindowDelegate, ByVal lp As IntPtr) As Boolean 
Private Declare Auto Function EnumChildWindows Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal callback As EnumWindowDelegate, ByVal lp As IntPtr) As Boolean 
Private Declare Auto Function GetClassName Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal name As StringBuilder, ByVal maxlen As Integer) As Integer 
Private Declare Auto Function GetCurrentThreadId Lib "kernel32.dll"() As Integer 
Private Declare Auto Function SetWindowText Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal text As String) As Boolean 

End Class 

Теперь использовать класс следующим образом, чтобы показать сообщения:

MessageClass.PatchMsgBox(New String() {"Button name 1", "Button name 2"}) 
Dim Result As DialogResult = MsgBox("Message", MsgBoxStyle.OkCancel, "Title") 

Теперь вам нужно обработать ваш результат от окна сообщения, которое будет основываться на стиле окна сообщения Вы выбираете.

0

Я нашел способ сделать это, и это отлично работает для меня.

Я создал новую форму, и я заставляю ее выглядеть как «msgbox», и я добавляю к ней то, что мне нужно, как кнопки, картинки ... и все остальное, но когда мне нужно показать форму (msgbox) ... я использую этот код:

Form1.showDialog() 

вместо записи: Form1.Show()

вы можете сделать это выглядеть так же, как «MsgBox» с пользовательской кнопки, и вы ничего не можете сделать в другом открыли окна, чтобы закрыть эту форму (точно так же, как «msgbox»).

Я не знаю ... я просто нашел этот путь ... очень хорошо и легко.

Смежные вопросы