- 題名: 【VB.NET+FW3.0〜】入力情報を維持したままフォーカスを移動させたいのですが……
- 日時: 2010/01/13 15:39:56
- ID: 26241
- この記事の返信元:
- (なし)
- この記事への返信:
- [26242] Re[1]: 【VB.NET+FW3.0〜】入力情報を維持したままフォーカスを移動させたいのですが……2010/01/13 18:05:42
- ツリーを表示
お疲れ様です。
とりあえず以下のコードで試してみてください。
(私のPCではうまくいきましたが、私はSendMessageの使い方を詳しく知りません。
完全にはテストしていないので、入念な確認をお願いいたします)
Imports System.Runtime.InteropServices
Public Class Form_RichTextBoxTest
Inherits Form
Dim WithEvents TextBox1 As New TextBox
Dim WithEvents RichTextBox1 As New RichTextBoxEx(Me.TextBox1)
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
With Me.RichTextBox1
.Multiline = True
.Bounds = New Rectangle(30, 30, 220, 100)
' ※ ReadOnlyにせず、ImeModeをTextBox1と同期させる
.BackColor = Control.DefaultBackColor
.Text = "かきくけこ123" + vbCrLf + "さしすせそABCDEF"
End With
With Me.TextBox1
.Multiline = True
.Bounds = New Rectangle(50, 160, 220, 100)
.Text = "あいうえおABC567"
End With
Me.Controls.Add(Me.RichTextBox1)
Me.Controls.Add(Me.TextBox1)
MyBase.OnLoad(e)
End Sub
' カスタムRichTextBox
Private Class RichTextBoxEx
Inherits RichTextBox
Dim _tbx As TextBox
Public Sub New(ByVal tbx As TextBox)
Me._tbx = tbx
Me._tbx.DataBindings.Add("ImeMode", Me, "ImeMode")
End Sub
<DllImport("user32")> _
Private Shared Sub SendMessage(ByVal hwnd As IntPtr, _
ByVal msg As Integer, ByVal wparam As IntPtr, ByVal lparam As IntPtr)
' コード不要
End Sub
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Const WM_KEYDOWN As Integer = &H100
Const WM_SYSDEADCHAR As Integer = &H107
Const WM_IME_STARTCOMPOSITION As Integer = &H10D
Const WM_IME_KEYDOWN As Integer = &H290
Const WM_IME_CHAR As Integer = &H286
If (WM_KEYDOWN <= m.Msg AndAlso m.Msg <= WM_SYSDEADCHAR) OrElse _
m.Msg = WM_IME_STARTCOMPOSITION OrElse m.Msg = WM_IME_KEYDOWN OrElse _
m.Msg = WM_IME_CHAR Then
Select Case m.WParam.ToInt32
Case Keys.Up, Keys.Down, Keys.Left, Keys.Right, Keys.PageDown, Keys.PageUp, Keys.Home, Keys.End
MyBase.WndProc(m)
Case Else
Me._tbx.SelectionStart = Me._tbx.TextLength
If Me._tbx.ImeMode = Windows.Forms.ImeMode.On Then
' この辺は苦し紛れ
SendMessage(Me._tbx.Handle, WM_IME_CHAR, m.WParam, m.LParam)
End If
SendMessage(Me._tbx.Handle, m.Msg, m.WParam, m.LParam)
Me._tbx.Focus()
Return
End Select
Else
MyBase.WndProc(m)
End If
End Sub
End Class
End Class
分類:[.NET]
いつもこちらのサイト及び掲示板の皆様には大変お世話になっております。
今回どうしても自力では解決できなかったので、こちらで質問させてください。
当方はVisualBasicのExpressEditon2008で開発を行っています。
.NET Frameworkも基本は2.0ですが、必要な機能があれば3.0も使用しています。
今回、いわゆるチャットソフトのようなものを作成しており、ログの表示に
ReadOnlyプロパティをTrueにしたRichTextBoxを使用し、入力にはMultiLine
アリのTextBoxを利用しています。
いわゆるLimeChatなどに実装されているように、ログであるRichTextBoxなどに
フォーカスがあった場合、入力が行われたらそれをTextBoxに移動させたいのです。
まず、RichTextBoxのKeyPressやPreviewKeyDownなどで入力があった場合
TextBox.Focusでフォーカスを移動してみましたが、これでは入力された
キーがなくなってしまい、ダメでした。
次に
'Private Sub RichTextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles RichTextBox1.KeyPress
' e.Handled = True
' TextBox1.Focus()
' TextBox1.Text = TextBox1.Text & e.KeyChar
' TextBox1.SelectionStart = TextBox1.Text.Length
'End Sub
このようにしてみたところ、キー情報は送信できましたが、これで日本語入力など
は維持できないため、「aああ……」となってしまいます。
何か方法はないものでしょうか、お教えください。