C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[21]: IME入力中であることを判定できるか?(VB.NET) [1]


(過去ログ 67 を表示中)

[トピック内 26 記事 (21 - 26 表示)]  << 0 | 1 >>

■38600 / inTopicNo.21)  Re[16]: IME入力中であることを判定できるか?(VB.NET)
  
□投稿者/ やんまー (11回)-(2009/07/20(Mon) 13:20:57)
やじゅさんの教えてくだすった方法にてうまくいきそうなのですが、
どうフォームにイベント発生を通知すればいいかわからなくなってゆきづまってしまいました・・・

おそらくExTextBoxクラスにてイベント通知メソッド(?)を呼んでやればよいのでしょうが、
私にはなかなか難しくて苦労しています。

そこで私なりに、以下のようにしてみました。

Protected Overrides Sub WndProc(ByRef m As Message)
Public strjotai As String
Const WM_IME_ENDCOMPOSITION As Integer = &H10E
Const WM_IME_COMPOSITION As Integer = &H10D
Select Case m.Msg
Case WM_IME_COMPOSITION
strjotai="1"
Case WM_IME_ENDCOMPOSITION
strjotai="2"
End Select
MyBase.WndProc(m)
End Sub
Public ReadOnly Property Jotai() As String
Get
return strjotai
End Get
End Property


これで、「exTextBox1.Jotai」の値を見ることで何とかなりそうなのですが、
なんだかいまいちです@@;


WM_IME_COMPOSITIONやWM_IME_ENDCOMPOSITIONを拾ったときに
KEYDOWNイベントを発生させるのにはどうしたらいいのでしょうか・・・?

または、ExTextBoxクラスの中から、貼り付けているフォームのラベルに記入というのは、できるでしょうか・・・

# 親フォームの別のコントロールにアクセス・・・ということです。無理でしょうか・・・


引用返信 編集キー/
■38603 / inTopicNo.22)  Re[17]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ Azulean (424回)-(2009/07/20(Mon) 16:49:07)
No38600 (やんまー さん) に返信
> やじゅさんの教えてくだすった方法にてうまくいきそうなのですが、
> どうフォームにイベント発生を通知すればいいかわからなくなってゆきづまってしまいました・・・

そのExTextBoxコントロールに自分で新しいイベントを定義すると良いでしょう。
フォームからはその新しいイベントを利用することで、メッセージの受信を知ることができます。
参考: http://msdn.microsoft.com/ja-jp/library/ms973905.aspx
引用返信 編集キー/
■38606 / inTopicNo.23)  Re[18]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ やじゅ (1123回)-(2009/07/20(Mon) 20:09:12)
やじゅ さんの Web サイト
No38600 (やんまー さん) に返信
>>どうフォームにイベント発生を通知すればいいかわからなくなってゆきづまってしまいました・・・
> そのExTextBoxコントロールに自分で新しいイベントを定義すると良いでしょう。
> フォームからはその新しいイベントを利用することで、メッセージの受信を知ることができます。
> 参考: http://msdn.microsoft.com/ja-jp/library/ms973905.aspx

例 KeyDownイベント発生ではないが、独自のイベントを発生させる。

    Public Class ExTextBox
        Inherits System.Windows.Forms.TextBox

        Public Event onImeEndComposition()

        Protected Overrides Sub WndProc(ByRef m As Message)
            Const WM_IME_COMPOSITION As Integer = &H10D
            Const WM_IME_ENDCOMPOSITION As Integer = &H10E

            Select Case m.Msg
                Case WM_IME_COMPOSITION

                Case WM_IME_ENDCOMPOSITION
                    'イベント発生させて、Form側で処理する。
                    RaiseEvent onImeEndComposition()
            End Select

            MyBase.WndProc(m)

        End Sub

    End Class

    'ここからForm側
    Friend WithEvents exText As ExTextBox

    Private Sub ExText_ImeEndComposition() Handles exText.onImeEndComposition
        MsgBox("IME_ENDCOMPOSITION")
    End Sub

引用返信 編集キー/
■38610 / inTopicNo.24)  Re[19]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ やんまー (12回)-(2009/07/21(Tue) 02:09:18)
やじゅさん、ご丁寧にコードをありがとうございます。感謝です!

で、早速試してみたのですが・・・



Protected Overrides Sub WndProc(ByRef m As Message)
Public strjotai As String
Const WM_IME_ENDCOMPOSITION As Integer = &H10E
Const WM_IME_COMPOSITION As Integer = &H10D
Select Case m.Msg
Case WM_IME_COMPOSITION
strjotai="1"
Case WM_IME_ENDCOMPOSITION
strjotai="2"     ’←ここは通過している ◆
RaiseEvent onImeEndComposition() 'ここも通過しているが何も起きない・・・
End Select
MyBase.WndProc(m)
End Sub
Public ReadOnly Property Jotai() As String
Get
return strjotai
End Get
End Property




'Form側
Friend WithEvents exText As ExTextBox

Private Sub ExText_ImeEndComposition() Handles exText.onImeEndComposition
MsgBox("IME_ENDCOMPOSITION")
End Sub




のようにしてみました・・・が・・・

exTextBox1.Jotaiは1や2という値が取れているにかかわらず、
MsgBox("IME_ENDCOMPOSITION")
が実行されません・・泣!!!

RaiseEventがまったく反応していない感じです・・・

だめな理由がわかりません・・・・

Sharpdevelop1.1だから何か変なのでしょうか・・・





引用返信 編集キー/
■38611 / inTopicNo.25)  Re[20]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ やんまー (13回)-(2009/07/21(Tue) 02:20:04)
申し訳ありませんでした。大ボケでした。

宣言したExTEXTBOXにWithEventsをつけないといけませんでしたね・・・


Private exTextBox1 As ExTextBox

Friend WithEvents exTextbox1 As ExTextBox


これでようやく拾えました!

本当にありがとうございました。

# もうちょっときちんと整理してから解決済みにしたいと思います。
引用返信 編集キー/
■39008 / inTopicNo.26)  Re[21]: IME入力中であることを判定できるか?(VB.NET)
□投稿者/ やんまー (14回)-(2009/07/29(Wed) 10:52:41)
最終的に以下のようにして実現しました。

本当に助かりました。皆様ありがとうございます!


◆TEXTBOXでIMEの入力中を判定する方法。


新しいクラスを追加。

Public Class ExTextBox
  Inherits System.Windows.Forms.TextBox
  Public Sub New()
  End Sub
  Public strjotai As String
  Public Event onImeEndComposition()
  Public Event onImeComposition()
  Protected Overrides Sub WndProc(ByRef m As Message)
    Const WM_IME_ENDCOMPOSITION As Integer = &H10E
    Const WM_IME_COMPOSITION As Integer = &H10D

    Select Case m.Msg
     Case WM_IME_COMPOSITION
      RaiseEvent onImeComposition()
     Case WM_IME_ENDCOMPOSITION
      RaiseEvent onImeEndComposition()
    End Select
    MyBase.WndProc(m)
  End Sub
End Class

これを追加すると、コントロールに「ExTextBox」が追加されるので、
それをフォームに追加。


イベントに
ExTextBox1onImeEndComposition()
ExTextBox1onImeComposition()
が追加されるので、

以下のようにして「入力中」「入力中で無い」を判定するようにしました。

Private Sub ExTextBox1onImeEndComposition()
 imeinpflg = false
End Sub
Private Sub ExTextBox1onImeComposition()
 imeinpflg = true
End Sub



解決済み
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -