|
|
|
2008/4/8(Tue) 21:18:54|NO.15002
ただいまIMEを操作するモジュールを製作していますが、
IMEでの入力文字数(未決定文字数)が64字あたりを越えると文字化け (のような
ことが起きます。str型でのメモリの宣言不足かと思い (自動で拡張しますよね
256^2で初期化したのですが問題は解決せず。。。
#module
#uselib "imm32.dll"
#cfunc global ImmCreateContext "ImmCreateContext"
#cfunc global ImmAssociateContext "ImmAssociateContext" int, int
#func global ImmSetCompositionWindow "ImmSetCompositionWindow" int,int,int
#func global ImmGetCompositionString "ImmGetCompositionStringA" int,int,var,int
#func global ImmSetCompositionFont "ImmSetCompositionFontA" int,int
#deffunc ime_creat
//ウィンドウにIMEを割り当て
hwnd_ime=ImmCreateContext()
k=ImmAssociateContext(hwnd,hwnd_ime)
return hwnd_ime
#deffunc ime_pos int hwnd2_ime,int com_posx, int com_posy
//IMEの出現場所指定 標準0,0
compositionform = 0x0002 ,com_posx ,com_posy
ImmSetCompositionWindow hwnd2_ime,varptr(compositionform)
return
#deffunc ime_getstr int hwnd2_ime,var buf,var str_size
//IMEに入力されている文字をリアルタイムに取得
str_size=0
ImmGetCompositionString hwnd2_ime,8,buf,str_size
str_size=stat
sdim buf,str_size
ImmGetCompositionString hwnd2_ime,8,buf,str_size
return
#deffunc ime_font int hwnd4_ime,str font_name,int font_size
//IMEフォント指定
dim logfont,15
lfFaceName =font_name
logfont(0)=font_size
poke logfont,23,1
poke logfont, 28, lfFaceName
ImmSetCompositionFont hwnd4_ime,varptr(logfont)
return
#global
ime_creat//IME割り当て(既存する場合は上書き)
hwnd_ime=stat//ハンドル格納
str1_=""
sdim buf,256*256
sdim str1_,256*256//初期化がちゃんとできていないのが原因かと思ったが違うようだ
font_name="MS UI Gothic":font_size=13
ime_font hwnd_ime,font_name,font_size//IMEとmesでのフォントを合わせる
font font_name,font_size//mesでのフォントも指定
ime_pos hwnd_ime,0,40//IME出現場所
repeat
ime_getstr hwnd_ime,buf,s//IMEに入力されている文字と長さを取得
if s!0:str1_=buf
color 255,255,255:boxf
color
pos 0,0:mes "全角モードにしてください。"
pos 0,20:mes buf//リアルタイム取得
title "buf=\""+buf+"\" length="+s
redraw 1
wait 3
redraw 0
loop
| |
|
2008/4/8(Tue) 21:41:08|NO.15003
あとフォントも思ったように変わってくれません。。。
|
|
2008/4/8(Tue) 22:26:36|NO.15006
#deffunc ime_getstr int hwnd2_ime,var buf,var str_size
//IMEに入力されている文字をリアルタイムに取得
str_size=0
ImmGetCompositionString hwnd2_ime,8,buf,str_size
str_size=stat
sdim buf,str_size
ImmGetCompositionString hwnd2_ime,8,buf,str_size
return
str_sizeでバイト数を取得し、sdimでbufを初期化しているようですが、
どうやらNUL文字分が考慮されていないようです。
64バイト以降で発生するというのは、sdimで初期化できる最低が64バイトだから
だと思います。
つまり、64バイト以上だとNUL文字が考慮されない1文字少ないサイズで初期化されて
しまうために、"\0”がなくなってしまい文字化け部分が発生したんだと思います。
つまり
sdim buf,str_size+1
これで十分でしょう。
|
|
2008/4/8(Tue) 22:29:06|NO.15007
ありがとうございます。理解できました。m(_ _)m
|
|
2008/4/8(Tue) 23:38:08|NO.15009
フォントはPCによって正しかったり違ったりしているようです。。
unicode shift-jisとかなのか・・・
|
|
2008/4/9(Wed) 01:17:32|NO.15011
Asさんのおかげで解決することができました。
フォントの異常は、既存するIMEがあった場合削除しないとうまく動作しないらしい。
#module
#uselib "imm32.dll"
#cfunc ImmCreateContext "ImmCreateContext"
#cfunc ImmAssociateContext "ImmAssociateContext" int, int
#func ImmSetCompositionWindow "ImmSetCompositionWindow" int,int,int
#func ImmGetCompositionString "ImmGetCompositionStringA" int,int,var,int
#func ImmSetCompositionFont "ImmSetCompositionFontA" int,int
#func ImmReleaseContext "ImmReleaseContext" int,int
#func ImmDestroyContext "ImmDestroyContext" int
#cfunc ImmGetContext "ImmGetContext" int
#deffunc ime_dest
//ウィンドウに関係づけられたIMEを削除
defime=ImmGetContext(hwnd)
if defime!0{
ImmReleaseContext hwnd,defime
ImmDestroyContext defime
}
return
#deffunc ime_hwnd
//ウィンドウに関係づけられたIMEのハンドルを取得
defime=ImmGetContext(hwnd)
return defime
#deffunc ime_creat
//ウィンドウにIMEを割り当て
hwnd_ime=ImmCreateContext()
k=ImmAssociateContext(hwnd,hwnd_ime)
return hwnd_ime
#deffunc ime_pos int hwnd2_ime,int com_posx, int com_posy
//IMEの出現場所指定 標準0,0
compositionform = 0x0002 ,com_posx ,com_posy
ImmSetCompositionWindow hwnd2_ime,varptr(compositionform)
return
#deffunc ime_getstr int hwnd2_ime,var buf,var str_size
//IMEに入力されている文字をリアルタイムに取得
str_size=0
ImmGetCompositionString hwnd2_ime,8,buf,str_size
str_size=stat
sdim buf,str_size+1
ImmGetCompositionString hwnd2_ime,8,buf,str_size
return
#deffunc ime_font int hwnd4_ime,str font_name,int font_size
//IMEフォント指定
dim logfont,20
lfFaceName =font_name
logfont(0)=font_size
poke logfont,23,1
memcpy logfont, lfFaceName, strlen(lfFaceName), 28, 0
ImmSetCompositionFont hwnd4_ime,varptr(logfont)
return
#global
title "h"
screen 5
ime_hwnd
hwnd_ime=stat
if hwnd_ime=0{
ime_creat//IME割り当て
hwnd_ime=stat//ハンドル格納
}
str1_=""
sdim buf,256*256
sdim str1_,256*256//初期化がちゃんとできていないのが原因かと思ったが違うようだ
font_name="MS P明朝":font_size=13
ime_font hwnd_ime,font_name,font_size//IMEとmesでのフォントを合わせる
font font_name,font_size//mesでのフォントも指定
ime_pos hwnd_ime,0,40//IME出現場所
repeat
ime_getstr hwnd_ime,buf,s//IMEに入力されている文字と長さを取得
if s!0:str1_=buf
color 255,255,255:boxf
color
pos 0,0:mes "全角モードにしてください。"
pos 0,20:mes buf//リアルタイム取得
title "buf=\""+buf+"\" length="+s
redraw 1
wait 3
redraw 0
loop
| |
|
2008/4/9(Wed) 01:18:38|NO.15012
解決チェック
|
|