2014-04-08 126 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