2014-04-08 85 views
1

我正在制作一个winforms应用程序,其目的是使用组合键将IPA符号写入文本框。用户在关注RichTextBox时按下按键。某些组合键(如Ctrl + S)只会产生一个字符并等待下一个按键,如ʃ。如果您在按住Ctrl的同时重复按下相同的按键,其他组合键将产生不同的字符。例如,如果我按下Ctrl键,则会输入A,æ,但如果在仍按住Ctrl的同时再次按A,则æ将被删除,而ɑ将会出现。它将通过这两个键继续循环,直到玩家释放Ctrl或按下不同的键。等待循环中的按键VB.NET WinForms

虽然我被困在试图实现这种行为。这是迄今为止我所了解的一个粗略的想法;最主要的障碍是,我不知道如何在一个循环的中间暂停和读取按键,使用形式:

Private Sub IPAtext_KeyPress(sender As Object, e As KeyEventArgs) Handles IPAtext.KeyDown 
    Dim AChars() As Char = {"æ", "ɑ"} 
    Dim Counter As Integer = 0 
    Select Case e.Modifiers 
     Case Keys.Control 
      Select Case e.KeyCode 
       Case Keys.A 
        While e.Modifiers = Keys.Control And e.KeyCode = Keys.A 
         IPAtext.AppendText(AChars(Counter)) 
         '-- Pause for keypress. If keypress =/= A then complete loop, if keypress is A again then increase counter. -- 
         Counter = (Counter + 1) Mod AChars.Count 'Increments the counter so that it cycles back to 0 when it goes past the count of AChars. 
         '-- Only execute the line below if keypress is A. -- 
         IPAtext.Text = IPAtext.Text.Remove(IPAtext.TextLength - 1) 'Remove the last character from the textbox. 
        End While 
      End Select 
    End Select 
End Sub 

我也应该注意到,我试图模仿到一定程度的行为this IPA web app

+0

你有更大的问题,按Ctrl + A已经在RichTextBox中做了一些事情,它会选择所有文本。显然不是你想要的,不是简单的修复。你不能“在中间暂停”,你需要使用一个变量。 –

+0

采取了点。当我想到这件事时,我会想到这一点,但也许我应该向前看 - 再想一想。无论如何,什么类型的变量?我知道在控制台有ConsoleKeyInfo和ConsoleKey,但我不知道我的方式如此舒适地围绕Forms。我可以使用什么函数来读取按键并将其插入该变量中? – Lou

+0

您可能需要使用ProcessCmdKey http://msdn.microsoft.com/en-us/library/yscs73zz(v=vs.110).aspx –

回答

0

这就是当我尝试这个时想出来的。在KeyDown事件上设置处理程序,然后默认禁用所有KeyPress。然后看看你是否可以将当前keyCode与你期望的特例相匹配。否则,取消选择KeyEventArgs对象并保留Sub。

我的代码将选择您期望循环的文本,因此即使Ctrl被释放,您也可以手动选择一个字符并“继续”循环。你将不得不根据自己的喜好进行修改,但这对你来说是一个开始。

Private Sub RichTextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles RichTextBox1.KeyDown 
    e.SuppressKeyPress = True 
    e.Handled = True 

    Select Case e.KeyCode 
     Case Keys.A And e.Modifiers = Keys.Control 
      RichTextBox1.SelectedText = GetCharacterToPrint(RichTextBox1.SelectedText, New Char() {"æ", "ɑ"}) 
      RichTextBox1.Select(RichTextBox1.SelectionStart - 1, 1) 
     Case Else 
      e.Handled = False 
      e.SuppressKeyPress = False 
    End Select 
End Sub 

这里是一个简短的函数返回一个字符:

Private Function GetCharacterToPrint(ByVal SelectedText As String, ByVal Characters As Char()) As Char 
    If SelectedText.Length <> 1 Then 
     Return Characters(0) 
    End If 
    Dim c As Char = SelectedText(0) 
    Dim index As Integer = String.Join("", Characters).IndexOf(c) 
    If index = Characters.Length - 1 Then 
     Return Characters(0) 
    Else 
     Return Characters(index + 1) 
    End If 
End Function 

最后如何CONTROLKEY被释放后继续:

Private Sub RichTextBox1_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles RichTextBox1.KeyUp 
    If e.KeyValue = Keys.ControlKey Then 
     RichTextBox1.SelectionStart += 1 
    End If 
End Sub 
+0

我很欣赏这种努力,但这不足以解决问题。它只适用于选择已写入的文本,当我想Ctrl + A *生成文本,然后在用户再次按Ctrl + A时更改它 - 此外,它需要在该组合键的所有可能变体之间循环直到用户释放Ctrl或按下另一个键。我仍然不明白我该如何做到这一点。 – Lou

+0

如果没有选择任何内容或者选择的文本不是“æ”,将打印æ,如果选择了它,将打印“Æ”。 SelectedText就是CaretPosition。或者你也许在.NET4.5中编码?这在4.0中完成。 – WozzeC

+0

我在VS2012 Express上,使用.NET 4.5.50938(具体有多荒谬)。这会有所作为吗? – Lou