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

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

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

Re[3]: vb.net(2008)テキストBOX IME制御 その2


(過去ログ 84 を表示中)

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

■50047 / inTopicNo.1)  vb.net(2008)テキストBOX IME制御 その2
  
□投稿者/ Morio (7回)-(2010/05/27(Thu) 09:14:24)

分類:[.NET 全般] 

VB.net(2008)を使用して、IMEのソフトキー画面を作っています。
IMEの動作は、行われるようになりましたが、以下の処理で悩んでいます。

  1.from1に、textbox1を配置
  2.form1に、コマンドボタンを数個配置(キャプションには、"あ","い","う"等を記載して見た目ソフトキーになるように)
    Button1.caption = "あ"
    Button2.caption = "い"
    Button3.caption = "う"

  3.form1_Activate にて
hIMC = ImmGetContext(TextBox2.Handle)'コンテキスト取得
    ImmSetOpenStatus(hIMC, True)'IMEオープン
TextBox1.Focus()'テキストボックスへフォーカス
  これで、IMEが起動

4.各コマンドボタンのClickイベントにて
    strKana= Button2.caption' "い"form1のローカルString変数にボタンのキャプション文字をセット
TextBox1.Focus()'テキストボックスへフォーカスセット

  5.textbox1のEnterもしくはGotfocusイベントにて
Dim length As Integer
Dim ret As Long
length = Encoding.Unicode.GetByteCount(strKana)
'文字入力をする
    ret = ImmSetCompositionString(hIMC, eSCS.SCS_SETSTR, strKana, length, Nothing, 0)
      
この環境で、実施した場合に、ボタンを
   @Button1、Button2、Button3の順番でクリックすると、テキストボックスに表示される文字は
    button3の"う"の文字だけが変換前文字として表示されます。
   Aもう一度、Button1、Button2、Button3の順番でクリックすると、
   "うあいう"と表示されます。

   一度もクリックしていない文字のボタン押下時は、その文字だけになる @の状態
   一度クリックした文字のボタンを押下すると、Aの状態

   Aの状態が最初から実施されることを望んでいますが、何が問題なのか??です。
   もちろん、textbox1にキーボードから直接入力すれば、正しくAの動作をします。
   
  またまた、すみませんが、ご教授願います。


  使用しているAPIです。
Public Declare Function ImmGetConversionStatus Lib "imm32.dll" _
(ByVal himc As IntPtr, ByRef lpdw As Integer, ByRef lpdw2 As Integer) As Boolean

Public Declare Function ImmSetConversionStatus Lib "imm32.dll" _
(ByVal himc As IntPtr, ByVal dw1 As Integer, ByVal dw2 As Integer) As Boolean

Public Declare Function ImmGetContext Lib "imm32" (ByVal hWnd As IntPtr) As IntPtr

Public Declare Function ImmSetOpenStatus Lib "imm32" (ByVal hIMC As IntPtr, _
<MarshalAs(UnmanagedType.Bool)> ByVal fOpen As Boolean ) As <MarshalAs(UnmanagedType.Bool)> Boolean

Public Enum eSCS As Integer 'As UInteger
SCS_SETSTR = &H9
SCS_CHANGEATTR = &H11
SCS_CHANGECLAUSE = &H24
SCS_SETRECONVERTSTRING = &H10000
SCS_QUERYRECONVERTSTRING = &H20000
End Enum

Public Declare Auto Function ImmSetCompositionString Lib "imm32" _
(ByVal hIMC As IntPtr,ByVal dwIndex As eSCS,ByVal lpComp As String, ByVal dwCompLen As Int32, _
ByVal lpRead As String,ByVal dwReadLen As Int32 ) As <MarshalAs(UnmanagedType.Bool)> Boolean

Public Declare Function ImmReleaseContext Lib "imm32" (ByVal hWnd As IntPtr, ByVal hIMC As IntPtr _
) As <MarshalAs(UnmanagedType.Bool)> Boolean
引用返信 編集キー/
■50049 / inTopicNo.2)  Re[1]: vb.net(2008)テキストBOX IME制御 その2
□投稿者/ よねKEN (507回)-(2010/05/27(Thu) 10:08:21)

> @Button1、Button2、Button3の順番でクリックすると、テキストボックスに表示される文字は
>     button3の"う"の文字だけが変換前文字として表示されます。

「strKana= Button2.caption' "い"form1のローカルString変数にボタンのキャプション文字をセット」
とstrKanaという変数に1文字しか入れていないので当然の結果のように思えますが・・・


>    Aもう一度、Button1、Button2、Button3の順番でクリックすると、
>    "うあいう"と表示されます。

提示されている情報からではそうはならないように読めます。
変数strKanaの説明もないですし、どこで宣言されていて、他にどこで変更されているか/いないかわからないのですが、
この変数strKanaの変化をデバッグして追えば、問題点を明らかにできるのではないでしょうか。

--
後、問題点とはあまり関係ないと思いますが、いくつか気になるところを確認しておきます。

>   2.form1に、コマンドボタンを数個配置(キャプションには、"あ","い","う"等を記載して見た目ソフトキーになるように)
>     Button1.caption = "あ"
>     Button2.caption = "い"
>     Button3.caption = "う"

コマンドボタンですか?
Microsoft.VisualBasic.Compatibility.VB6 名前空間
http://msdn.microsoft.com/ja-jp/library/ms634909(v=VS.100).aspx
にはそれらしいクラスが見当たらないのですが、System.Windows.Forms.Buttonクラスではないということでよろしいですか?
このButtonクラスならCaptionではなくTextプロパティのはずなので・・・

>   5.textbox1のEnterもしくはGotfocusイベントにて

VB6のGotFocusイベントに対応するのは、.NETではEnterイベントです。
.NETのGotfocusイベントは低レベルイベントなので基本的には使用しません。

> Dim length As Integer
> Dim ret As Long
> length = Encoding.Unicode.GetByteCount(strKana)
> '文字入力をする
>     ret = ImmSetCompositionString(hIMC, eSCS.SCS_SETSTR, strKana, length, Nothing, 0)

retがLong型で宣言されていますが、APIの定義に合わせてBooleanですよね。
      
>    もちろん、textbox1にキーボードから直接入力すれば、正しくAの動作をします。

提示のコードの中にはtextbox1.Textプロパティに関わるようなコードは含まれていませんので、
この説明が何を意味するのかわかりません。

引用返信 編集キー/
■50052 / inTopicNo.3)  Re[2]: vb.net(2008)テキストBOX IME制御 その2
□投稿者/ Morio (9回)-(2010/05/27(Thu) 10:39:02)
No50049 (よねKEN さん) に返信
よねKENさん、早速の回答ありがとうございます。
すみません、VB6とVB.netで情報がごちゃごちゃになっていました。

Public Class Form1 'form1にて、strKanaをString文字列として宣言しています。
Dim hIMC As IntPtr
Dim strKana As String

'各ボタンの動作は、下記のようになります。
  'strKana は、毎回1文字のみに上書きされます。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
strKana = Button1.text '"あ"
TextBox1.Focus()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
strKana = Button2.text '"い"
TextBox1.Focus()
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
strKana = Button3.text '"う"
TextBox1.Focus()
End Sub

  textbox1のEnterイベント内で
  dim ret as Boolean
  ret = ImmSetCompositionString(hIMC, eSCS.SCS_SETSTR, strKana, length, Nothing, 0)
  'strKanaの文字は、必ず1文字で、Lengthは必ず2です。

  button1を3回押下すると、"あああ"と表示されますが、
  button1,button2,button3と押下していくと、最終的に"う"が表示されます。
  button1,button2,button3と押下した状態で、再度button1,button2,button3と押下すると"うあいう"と表示されます。
  一度、ImmSetCompositionStringを通った文字は、保持されるような動きをしています。
  
  textbox1から、フォーカスが一度外れて、再度フォーカスが戻る処理と,ImmSetCompositionStringに
  関連がありそうにも思います。


この情報で、いかがでしょうか?
よろしくお願いいたします。  

>>@Button1、Button2、Button3の順番でクリックすると、テキストボックスに表示される文字は
>>    button3の"う"の文字だけが変換前文字として表示されます。
>
> 「strKana= Button2.caption' "い"form1のローカルString変数にボタンのキャプション文字をセット」
> とstrKanaという変数に1文字しか入れていないので当然の結果のように思えますが・・・
>
>
>>   Aもう一度、Button1、Button2、Button3の順番でクリックすると、
>>   "うあいう"と表示されます。
>
> 提示されている情報からではそうはならないように読めます。
> 変数strKanaの説明もないですし、どこで宣言されていて、他にどこで変更されているか/いないかわからないのですが、
> この変数strKanaの変化をデバッグして追えば、問題点を明らかにできるのではないでしょうか。
>
> --
> 後、問題点とはあまり関係ないと思いますが、いくつか気になるところを確認しておきます。
>
>>  2.form1に、コマンドボタンを数個配置(キャプションには、"あ","い","う"等を記載して見た目ソフトキーになるように)
>>    Button1.caption = "あ"
>>    Button2.caption = "い"
>>    Button3.caption = "う"
>
> コマンドボタンですか?
> Microsoft.VisualBasic.Compatibility.VB6 名前空間
> http://msdn.microsoft.com/ja-jp/library/ms634909(v=VS.100).aspx
> にはそれらしいクラスが見当たらないのですが、System.Windows.Forms.Buttonクラスではないということでよろしいですか?
> このButtonクラスならCaptionではなくTextプロパティのはずなので・・・
>
>>  5.textbox1のEnterもしくはGotfocusイベントにて
>
> VB6のGotFocusイベントに対応するのは、.NETではEnterイベントです。
> .NETのGotfocusイベントは低レベルイベントなので基本的には使用しません。
>
>> Dim length As Integer
>> Dim ret As Long
>> length = Encoding.Unicode.GetByteCount(strKana)
>> '文字入力をする
>>    ret = ImmSetCompositionString(hIMC, eSCS.SCS_SETSTR, strKana, length, Nothing, 0)
>
> retがLong型で宣言されていますが、APIの定義に合わせてBooleanですよね。
>       
>>   もちろん、textbox1にキーボードから直接入力すれば、正しくAの動作をします。
>
> 提示のコードの中にはtextbox1.Textプロパティに関わるようなコードは含まれていませんので、
> この説明が何を意味するのかわかりません。
>
引用返信 編集キー/
■50056 / inTopicNo.4)  Re[3]: vb.net(2008)テキストBOX IME制御 その2
□投稿者/ よねKEN (508回)-(2010/05/27(Thu) 11:35:38)
#回答ではありません。

申し訳ありません。質問内容の理解が足りていませんでした。
ImmSetCompositionString関数について知識不足&調査不足でした。
「ImmSetCompositionString関数のSCS_SETSTR指定で呼び出し」という処理が
「未変換文字を挿入していく」という動作になるものなのですね。

すぐには私もわからなさそうな内容なので、何かわかったらまた書き込みます。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

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

管理者用

- Child Tree -