MsgBox 内にカスタム ボタンを表示できますか? msgbox の通常のボタンとは異なるボタンが必要です。
- わかった
- キャンセル
- アボート
- リトライ
- 無視
- はい
- いいえ
これらのボタンのテキストと値を制御するにはどうすればよいですか?
MsgBox 内にカスタム ボタンを表示できますか? msgbox の通常のボタンとは異なるボタンが必要です。
これらのボタンのテキストと値を制御するにはどうすればよいですか?
メッセージ ボックスは変更できますが、制限があります。ボタンの最大数は 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")
ここで、選択したメッセージ ボックス スタイルに基づくメッセージ ボックスから結果を処理する必要があります。
私はこれを行う方法を見つけました。それは私にとってはうまくいきます。
新しいフォームを作成し、「msgbox」のように見せて、ボタン、写真など必要なものを追加しますが、フォーム (msgbox) を表示する必要がある場合は... iこのコードを使用してください:
Form1.showDialog()
書く代わりに:Form1.Show()
カスタムボタンを使用して「msgbox」とまったく同じように見せることができ、他の開いているウィンドウでこのフォームを閉じるために何もすることはできません (「msgbox」とまったく同じです)。
わかりません... 私はちょうどこの方法を見つけました... とても良くて簡単です。