2

MsgBox 内にカスタム ボタンを表示できますか? msgbox の通常のボタンとは異なるボタンが必要です。

  1. わかった
  2. キャンセル
  3. アボート
  4. リトライ
  5. 無視
  6. はい
  7. いいえ

これらのボタンのテキストと値を制御するにはどうすればよいですか?

4

3 に答える 3

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")

ここで、選択したメッセージ ボックス スタイルに基づくメッセージ ボックスから結果を処理する必要があります。

于 2013-09-10T06:29:23.750 に答える
0

私はこれを行う方法を見つけました。それは私にとってはうまくいきます。

新しいフォームを作成し、「msgbox」のように見せて、ボタン、写真など必要なものを追加しますが、フォーム (msgbox) を表示する必要がある場合は... iこのコードを使用してください:

Form1.showDialog()

書く代わりに:Form1.Show()

カスタムボタンを使用して「msgbox」とまったく同じように見せることができ、他の開いているウィンドウでこのフォームを閉じるために何もすることはできません (「msgbox」とまったく同じです)。

わかりません... 私はちょうどこの方法を見つけました... とても良くて簡単です。

于 2015-09-19T19:14:54.687 に答える