Подписи пользовательской кнопки в.NET messagebox?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
19
задан Community 23 May 2017 в 10:31
поделиться

5 ответов

Нет нет никакого метода, чтобы получить доступ или перенаправить текст кнопки Messagebox по умолчанию.

единственный способ сделать это должно кодировать Ваше собственное или просто использовать один из многих свободных из Интернета:

Свободный MsgBoxGo!

7
ответ дан 30 November 2019 в 02:42
поделиться

Нет.
необходимо будет сделать пользовательскую форму с FormBorderType = FixedDialog.
Вот немного учебного руководства:

Диалоговые окна Создания в.NET

James D. Murray на июне 12 2007, под 70-526

Microsoft Certification Exam: 70-526 (MCTS)
Цель: Создайте и используйте пользовательские диалоговые окна в приложениях Windows Forms.
Язык: Visual Basic 2005 (щелкают здесь для версии C# этой записи)

я помню первый раз, когда я должен был создать диалоговое окно в приложении.NET, которое я писал в C#. Будучи давним программистом Visual Basic, я предположил, что это могло легко быть выполнено при помощи шаблона диалогового окна, включенного с Визуальным Studio.NET. К моему удивлению никакой такой шаблон формы не существовал для C#, хотя каждый делает для Visual Basic 2005. После прохождения через несколько книг и Веб-страниц, заполненных информацией о программировании Windows Forms 2.0, основной набор шагов стал очевидным для меня для того, чтобы вручную преобразовать форму.NET в диалоговое окно Windows:

Шаг 1: Добавьте Форму к своему проекту.NET и назовите его “DialogBoxForm”.

Шаг 2: Отбросьте две кнопки в нижней правой области Формы и назовите их “OKButton” и “CancelButton”.

Шаг 3: Измените следующие свойства Формы для корректировки ее внешнего вида и поведения, чтобы быть похожими на стандартное диалоговое окно:

    Property        Value                   Description 
    -----------------------------------------------------------------------------------------------------------------------------
    AcceptButton    OK button instance      Causes form to return value DialogResult.OK. Only used on modal dialog boxes.
    CancelButton    Cancel button instance  Causes form to return value DialogResult.Cancel. Only used on modal dialog boxes.
    FormBorderStyle FixedDialog             Create a non-sizable form with no control box on the title bar.
    HelpButton      True    The Help button appears in the caption bar next to the Close button. The ControlBox property must be True for these buttons to be visible.
    MaximizeBox     False   Hide the Maximize button in the title bar.
    MinimizeBox     False   Hide the Minimize button in the title bar.
    ShowIcon        False   The title bar icon is not visible in a dialog box.
    ShowInTaskBar   False   Do not indicate the presence of the form on the Windows Task Bar.
    Start           Position    CenterParent    The initial position of a dialog box is over its parent form.
    Size            As Needed   The fixed size needed for the dialog box.

Эти свойства могут быть установлены с помощью Окна свойств для формы, или с помощью кода, помещенного в событие Form’s Load:

    Me.AcceptButton = OKButton
    Me.CancelButton = CancelButton
    Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog
    Me.HelpButton = True
    Me.MaximizeBox = False
    Me.MinimizeBox = False
    Me.ShowInTaskbar = False
    Me.ShowIcon = False
    Me.StartPosition = FormStartPosition.CenterParent

Шаг 4: Добавьте следующие обработчики событий нажатия кнопки к Форме:

    Private Sub OKButton_Click(ByVal sender As Object, _ByVal e As EventArgs)
        ' User clicked the OK button
        Me.DialogResult = Windows.Forms.DialogResult.OK
    End Sub

    Private Sub CancelButton_Click(ByVal sender As Object, _ByVal e As EventArgs)
        ' User clicked the Cancel button
        Me.DialogResult = Windows.Forms.DialogResult.Cancel
    End Sub

Шаг 5: Добавьте свойства, что необходимо переместить данные в и из диалогового окна, как Вы были бы для любой Формы:

    Private _LoginName As String
    Private _LoginPassword As String

    Public Property LoginName() As String
        Get
            Return _LoginName
        End Get
        Set(ByVal value As String)
            _LoginName = value
        End Set
    End Property

    Public Property LoginPassword() As String
        Get
            Return _LoginPassword
        End Get
        Set(ByVal value As String)
            _LoginPassword = value
        End Set
    End Property

Шаг 6: Покажите диалоговое окно модально путем вызова ShowDialog () формы:

    Public Sub ShowDialogBox()
        Dim dialog As New DialogBoxForm

        dialog.LoginName = "JDMurray"
        dialog.LoginPassword = String.Empty

        If dialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
            Debug.WriteLine("Login Name: " & dialog.LoginName)
            Debug.WriteLine("Password: " & dialog.LoginPassword)
        Else
            ' User clicked the Cancel button
        End If
    End Sub

Шаг 7: Для показа диалогового окна modelessly назовите Шоу () методом DialogBoxForm вместо этого. Необходимо будет добавить обработчик событий к событию Close DialogBoxForm для знания, когда пользователь закроет диалоговое окно:

    Public Sub ShowDialogBox()
        Dim dialog As DialogBoxForm = New DialogBoxForm
        dialog.LoginName = "JDMurray"
        dialog.Password = String.Empty
        AddHandler dialog.FormClosed, AddressOf dialog_FormClosed
        dialog.Show()

        ' The Show() method returns immediately
    End Sub

    Private Sub dialog_FormClosed(ByVal sender As Object, _

     ByVal e As FormClosedEventArgs)
        ' This method is called when the user closes the dialog box
    End Sub
19
ответ дан 30 November 2019 в 02:42
поделиться

MessageBox использует простое окно, которое может быть смешано с подобным любое другое окно. Это уже было возможно в Windows в течение очень долгого времени, хорошо более чем 20 лет. Методы становятся неясными, хотя, слишком много дружественных оберток класса, которые скрывают собственный winapi и не выставляют все, которое можно сделать с ним. Так так, чтобы программисты теперь автоматически предполагают, что это не возможно, как можно сказать из ответов upvoted. Это - вид программирования, которое Petzold преподавал нам в его оригинальной "книге" Windows Программирования. Замену MessageBox с пользовательской Формой или Окном на самом деле довольно трудно сделать, это делает нетривиальное автоматическое расположение для установки тексту и локализации поддержек без справки. Хотя это точно, что Вы, кажется, не любите :)

Anyhoo, окно окна сообщения легко найти назад. Это принадлежит потоку UI и имеет специальное имя класса, которое делает это уникальным. EnumThreadWindows () перечисляет окна, принадлежавшие потоку, GetClassName () позволяет Вам проверить вид окна. Затем просто введите текст по абсолютному адресу в кнопку с SetWindowText ().

Добавляют новый класс к Вашему проекту и вставляют код, показанный ниже. Вызовите его с кодом как это:

Nobugz.PatchMsgBox(New String() {"Da", "Njet"})
MsgBox("gack", MsgBoxStyle.YesNo)

Вот код:

Imports System.Text
Imports System.Runtime.InteropServices

Public Class Nobugz
  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
17
ответ дан 30 November 2019 в 02:42
поделиться

Код C# для выполнения того же самого может быть найден в статье под форумом MSDN, https://forums.microsoft.com/MSDN/ShowPost.aspx? PostID=3087899& SiteID=1.

1
ответ дан 30 November 2019 в 02:42
поделиться

Есть решение. Установив CBT-хук, можно "на лету" настроить широкий спектр визуальных параметров MessageBox: шрифты сообщений и кнопок, фон диалога, позиционирование диалога, иконки, надписи кнопок, таймаут, даже вставка дополнительных элементов управления.

Полное решение: Расширенная сборка MessageBox .NET http://www.news2news.com/vfp/?solution=5

Это полнофункциональная пробная версия, обычная версия включает полный исходный код на C#.

2
ответ дан 30 November 2019 в 02:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: