C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

メッセージボックスでの条件判断2

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■90181 / inTopicNo.1)  メッセージボックスでの条件判断2
  
□投稿者/ あんみつ (3回)-(2019/02/14(Thu) 19:31:14)

分類:[VB.NET/VB2005 以降] 

何度もすみません。
#90165 での関連質問です。

  Dim ret = MessageBox.Show("どれを選びますか?", "〇〇〇", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Asterisk)
  If ret = DialogResult.Yes Then

これを実行しますと "はい(Y)"、"いいえ(N)"、"キャンセル" が表示され選ぶことで条件判断もします。

これと同じことを "はい(Y)"を"A"に、"いいえ(N)"を"B"に、"キャンセル"を"C"に
などと置き換え表示もし、それによって条件判断もしたいのですがどうすれば良いのか教えてください。

引用返信 編集キー/
■90182 / inTopicNo.2)  Re[1]: メッセージボックスでの条件判断2
□投稿者/ 774RR (666回)-(2019/02/14(Thu) 19:57:35)
アクセラレータキーを変更したいってことだと MessageBox.Show では困難だろう。
自前で新規 Form を作って ShowDialog するほうが結果的に簡単だろう、とオイラは思うの心。

ボタンに DialogResult を設定して Form 自体に AcceptButton や CancelButton を設定すると吉。
https://dobon.net/vb/dotnet/form/okcancelbutton.html


引用返信 編集キー/
■90183 / inTopicNo.3)  Re[1]: メッセージボックスでの条件判断2
□投稿者/ 魔界の仮面弁士 (2055回)-(2019/02/14(Thu) 21:45:58)
No90181 (あんみつ さん) に返信
MessageBox.Show 相当のカスタマイズということなら、
Form2 に Label×1、Button×3 を配置しておいて
後述のコードを書いておくと、

 Dim ret = Form2.ShowDialog("どれを選びますか?", "○○○")
 If ret = DialogResult.Yes Then

のようにして、A/B/C の選択画面を実装できます。

実際の戻り値は DialogResult ではなく、独自の列挙型を返すようにするか、
0 / 1 / 2 といった番号で返した方が分かりやすいかも知れませんが。


----------

Public Class Form2
 Public Overloads Shared Function ShowDialog(msg As String, title As String) As DialogResult
  Using dlg As New Form2()
   dlg.Text = title
   dlg.Label1.Text = msg
   Return dlg.ShowDialog()
  End Using
 End Function

 Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  Me.ActiveControl = Button2

  '下記はデザイン時に指定しておいてもよい
  Button1.Text = "A"
  Button1.DialogResult = DialogResult.Yes
  Button2.Text = "B"
  Button2.DialogResult = DialogResult.No
  Button3.Text = "C"
  Button3.DialogResult = DialogResult.Cancel
  Me.CancelButton = Button3
  Me.AcceptButton = Button2
 End Sub
End Class
引用返信 編集キー/
■90190 / inTopicNo.4)  Re[1]: メッセージボックスでの条件判断2
□投稿者/ 粗品 (9回)-(2019/02/15(Fri) 18:12:03)
No90181 (あんみつ さん) に返信
> これと同じことを "はい(Y)"を"A"に、"いいえ(N)"を"B"に、"キャンセル"を"C"に

以前試したものですが、メッセージボックスの文字のみ書き換えるようになります。
ググりながら作ったので細かなところまでは理解していないのですが、
メッセージボックスを表示する前にHookを実行しておくとボタンの文字列が変わります。

ただ、テキストが入れ替わるだけなので長い文字に変えてもボタンの幅は変わりませんし、
キャンセルボタンはあくまでもキャンセルボタンなのでEscキーに反応します。

"Aボタン(&A)","Bボタン(&B)","Cボタン(&C)"とかにしておけばキーボードのABCには反応します。

あとこれを呼び出す限りは文字列はこれで固定です。
変更したい場合は文字列を渡すとか改造できるのではないでしょうか。

なおMessageBoxEx.Hookを呼び出さなければ普通のメッセージボックスが出ます。



−−−−−−−

Public Class MessageBoxEx

    Private Shared m_hHook As Integer

    Private Const IDOK As Short = 1
    Private Const IDCANCEL As Short = 2
    Private Const IDABORT As Short = 3
    Private Const IDRETRY As Short = 4
    Private Const IDIGNORE As Short = 5
    Private Const IDYES As Short = 6
    Private Const IDNO As Short = 7

    Private Const MSGOK As String = "OK牧場"
    Private Const MSGCANCEL As String = "C" '"キャンセル"
    Private Const MSGABORT As String = "中止(&A)"
    Private Const MSGRETRY As String = "再試行(&R)"
    Private Const MSGIGNORE As String = "無視(&I)"
    Private Const MSGYES As String = "A" '"はい(&Y)"
    Private Const MSGNO As String = "B" '"いいえ(&N)"

    Private Const WH_CBT As Short = 5
    Private Const GWL_HINSTANCE As Short = (-6)
    Private Const HCBT_ACTIVATE As Short = 5

    Private Declare Function GetCurrentThreadId Lib "kernel32" () As Integer
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Integer, ByVal nIndex As Integer) As Integer
    Private Declare Function SetDlgItemText Lib "user32" Alias "SetDlgItemTextA" (ByVal hDlg As Integer, ByVal nIDDlgItem As Integer, ByVal lpString As String) As Integer
    Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As CallBack, ByVal hmod As Integer, ByVal dwThreadId As Integer) As Integer
    Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Integer) As Integer

    Private Delegate Function CallBack(ByVal uMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

    Private Shared Function MsgBoxHookProc(ByVal uMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
        If uMsg = HCBT_ACTIVATE Then
            SetDlgItemText(wParam, IDOK, MSGOK)
            SetDlgItemText(wParam, IDCANCEL, MSGCANCEL)
            SetDlgItemText(wParam, IDABORT, MSGABORT)
            SetDlgItemText(wParam, IDRETRY, MSGRETRY)
            SetDlgItemText(wParam, IDIGNORE, MSGIGNORE)
            SetDlgItemText(wParam, IDYES, MSGYES)
            SetDlgItemText(wParam, IDNO, MSGNO)

            UnhookWindowsHookEx(m_hHook)
        End If
        MsgBoxHookProc = 0
    End Function

    Public Shared Function Hook(ByRef hwndThreadOwner As Integer) As Integer
        Dim temp As CallBack
        Dim hInstance As Integer
        Dim hThreadId As Integer

        temp = AddressOf MsgBoxHookProc
        hInstance = GetWindowLong(hwndThreadOwner, GWL_HINSTANCE)
        hThreadId = GetCurrentThreadId()

        m_hHook = SetWindowsHookEx(WH_CBT, temp, hInstance, hThreadId)

        Return m_hHook
    End Function

End Class

−−−−−−−

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim m_hHook As Integer = MessageBoxEx.Hook(Me.Handle.ToInt32)

    If m_hHook.Equals(0) Then
        MessageBox.Show("SetWindowsHookEx Failed")
        Exit Sub
    End If

    Dim result As DialogResult = MessageBox.Show("どれを選びますか?", "〇〇〇", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Asterisk)

    Console.WriteLine(result.ToString)
End Sub

引用返信 編集キー/
■90195 / inTopicNo.5)  Re[2]: メッセージボックスでの条件判断2
□投稿者/ あんみつ (4回)-(2019/02/15(Fri) 22:52:04)
No90183 (魔界の仮面弁士 さん) に返信

早速ありがとうございました。

> 実際の戻り値は DialogResult ではなく、独自の列挙型を返すようにするか、
> 0 / 1 / 2 といった番号で返した方が分かりやすいかも知れませんが。

これはまだ分かってませんが試してみます。

解決済み
引用返信 編集キー/
■90196 / inTopicNo.6)  Re[2]: メッセージボックスでの条件判断2
□投稿者/ あんみつ (5回)-(2019/02/15(Fri) 22:59:33)
No90190 (粗品 さん) に返信

今のとマッチングがするか試してみます。
ありがとうございました。

解決済み
引用返信 編集キー/
■90197 / inTopicNo.7)  Re[2]: メッセージボックスでの条件判断2
□投稿者/ あんみつ (6回)-(2019/02/15(Fri) 23:01:59)
No90182 (774RR さん) に返信

ありがとうございます。
ご紹介のも見てはいたのです。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ