如何嵌入在Windows窗体应用程序控制台?(How to embed a Console in a

2019-09-28 00:33发布

我试图建立一个VB.net文字冒险游戏,就像昔日的天。 最明显的选择将是一个控制台应用程序,但是,我有一个Windows窗体上的决定,因为我希望能有互动按钮和图片。 目前,我已经得到了我的表格图片框和格式文本框上。 我希望用丰富的文本框,我可以做到的东西,以同样的方式作为控制台的工作。 唉,我的努力都是徒劳的。 我已经试过各种失败,包括:阅读Rich_Text_Box.TextRich_Text_Box_KeyUp用,如果被按压输入语句来调用一个输入按钮的过程。

我在想,如果有任何办法,包括与标准控制台Console.WriteLineConsole.ReadLine我的表单里面的能力? 这将非常缩短我的任务并简化整个过程。

有任何想法吗?

Answer 1:

你可以使用不是一个而是两个文本框为你的目的。 tbOutput和tbInput。 tbOutput将是多行和只读而tbInput将是单线,不是只读并置于tbOutput下方。 然后处理输入,你可以这样做:

Private Sub Output(s As String)
    If s <> "" Then
        tbOutput.AppendText(vbCrLf & ">> " & s)
    End If
End Sub
Private Sub tbInput_KeyDown(sender As Object, e As KeyEventArgs) Handles tbInput.KeyDown
    If e.KeyCode = Keys.Enter Then
        If tbInput.Text <> "" Then
            Output(tbInput.Text)
            ' Handle input value
            tbInput.Text = ""
        End If
    End If
End Sub

'Handle input value ,你会检查用户输入,并根据您的需要处理它。 使用龙力控制台字体在样式灰色和黑色的背景大胆:-)



Answer 2:

当然,一个RichTextBox可以用来模拟控制台。 有些手术需要避免用户从使它发生故障的控制台。 添加一个新类到您的项目并粘贴如下所示的代码。 编译。 从工具箱的上方新的控制到窗体。 订阅的把inputChanged事件,当用户按下回车键,输入属性使您键入的文本来检测。 使用Write()或的WriteLine()方法来添加文本。

Imports System.Windows.Forms

Public Class RichConsole
    Inherits RichTextBox
    Public Event InputChanged As EventHandler

    Public ReadOnly Property Input() As String
        Get
            Return Me.Text.Substring(InputStart).Replace(vbLf, "")
        End Get
    End Property

    Public Sub Write(txt As String)
        Me.AppendText(txt)
        InputStart = Me.SelectionStart
    End Sub

    Public Sub WriteLine(txt As String)
        Write(txt & vbLf)
    End Sub

    Private InputStart As Integer

    Protected Overrides Function ProcessCmdKey(ByRef m As Message, keyData As Keys) As Boolean
        '' Defeat backspace
        If (keyData = Keys.Back OrElse keyData = Keys.Left) AndAlso InputStart = Me.SelectionStart Then Return True
        '' Defeat up/down cursor keys
        If keyData = Keys.Up OrElse keyData = Keys.Down Then Return True
        '' Detect Enter key
        If keyData = Keys.[Return] Then
            Me.AppendText(vbLf)
            RaiseEvent InputChanged(Me, EventArgs.Empty)
            InputStart = Me.SelectionStart
            Return True
        End If
        Return MyBase.ProcessCmdKey(m, keyData)
    End Function

    Protected Overrides Sub WndProc(ByRef m As Message)
        '' Defeat the mouse
        If m.Msg >= &H200 AndAlso m.Msg <= &H209 Then Return
        MyBase.WndProc(m)
    End Sub
End Class


文章来源: How to embed a Console in a Windows Form application?