如何在Windows窗体应用程序中嵌入控制台?

时间:2013-12-28 14:53:30

标签: vb.net console-application

我正在尝试在VB.net中构建一个Text Adventure游戏,就像过去的日子一样。显而易见的选择是控制台应用程序,但是,我决定使用Windows窗体,因为我希望包含交互式按钮和图片。目前,我已经在我的表格上有一个图片框和一个富文本框。我希望通过Rich Text Box我能够以与控制台相同的方式实现一些功能。唉,我的努力是徒劳的。我尝试过的所有内容都失败了,包括:使用if语句读取Rich_Text_Box.TextRich_Text_Box_KeyUp以按Enter键调用输入按钮的过程。

我想知道是否有任何方法可以在我的表单中包含具有标准Console.WriteLineConsole.ReadLine功能的控制台?这将大大缩短我的任务并简化整个过程。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

您可以使用一个而不是两个文本框来达到您的目的。 tbOutput和tbInput。 tbOutput将是Multiline和ReadOnly,而tbInput将是单行,而不是readonly并且位于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,您将检查用户输入并根据您的需要进行处理。在灰色和黑色背景中使用粗体的Lucida Console字体作为样式: - )

答案 1 :(得分:2)

当然,RichTextBox可用于模拟控制台。需要进行一些手术以避免使用者将其作为控制台故障。在项目中添加一个新类并粘贴下面显示的代码。编译。将新控件从工具箱顶部拖放到表单上。订阅InputChanged事件以检测用户何时按下Enter键,Input属性为您提供键入的文本。使用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
相关问题