我试图建立一个VB.net文字冒险游戏,就像昔日的天。 最明显的选择将是一个控制台应用程序,但是,我有一个Windows窗体上的决定,因为我希望能有互动按钮和图片。 目前,我已经得到了我的表格图片框和格式文本框上。 我希望用丰富的文本框,我可以做到的东西,以同样的方式作为控制台的工作。 唉,我的努力都是徒劳的。 我已经试过各种失败,包括:阅读Rich_Text_Box.Text
和Rich_Text_Box_KeyUp
用,如果被按压输入语句来调用一个输入按钮的过程。
我在想,如果有任何办法,包括与标准控制台Console.WriteLine
和Console.ReadLine
我的表单里面的能力? 这将非常缩短我的任务并简化整个过程。
有任何想法吗?
你可以使用不是一个而是两个文本框为你的目的。 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
,你会检查用户输入,并根据您的需要处理它。 使用龙力控制台字体在样式灰色和黑色的背景大胆:-)
当然,一个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