環境はWinXP VisualStudio.NET2003 VC++ MFC です。
エディットボックスに入力する時の入力モードについて教えてください。
エディットボックスA、Bを作りました。
下記の条件で入力させるようにしたいです。
A.エディットボックスにフォーカスが来ている時だけ入力モードをひらがなにする。
入力モードを言語バーやキーボードの半角/全角キーで変更できる。
フォーカスが無くなると元のモードに戻す。
B.エディットボックスにフォーカスが来ている時だけ入力モードを半角英数にする。
入力モードを言語バーやキーボードの半角/全角キーで変更ができない。
フォーカスが無くなると元のモードに戻す。
半角英数以外の貼り付けはできない。
>A.エディットボックスにフォーカスが来ている時だけ入力モードをひらがなにする。
>入力モードを言語バーやキーボードの半角/全角キーで変更できる。
>フォーカスが無くなると元のモードに戻す。
ImmSetConversionStatusでIMEの変換状態を設定できます。
>B.エディットボックスにフォーカスが来ている時だけ入力モードを半角英数にする。
>入力モードを言語バーやキーボードの半角/全角キーで変更ができない。
>フォーカスが無くなると元のモードに戻す。
ImmAssociateContextにNULLを指定してウインドウと入力コンテキストの
関連付けを解除すれば入力モードを半角英数のみにできます。
>半角英数以外の貼り付けはできない。
WM_PASTEのハンドラでそのように実装してください。
>ImmSetConversionStatusでIMEの変換状態を設定できます。
この関数?の使い方、どこに書くかが、よくわかりません。
できれば使用例もあればいいのですが、下はMSDNです。
http://msdn.microsoft.com/ja-jp/library/cc448035.aspx
>ImmAssociateContextにNULLを指定してウインドウと入力コンテキストの
関連付けを解除すれば入力モードを半角英数のみにできます。
上と同じく、わからなかったです。
http://msdn.microsoft.com/ja-jp/library/cc447958.aspx
>WM_PASTEのハンドラでそのように実装してください。
見つからなかったのです。
>>ImmSetConversionStatusでIMEの変換状態を設定できます。
>
>この関数?の使い方、どこに書くかが、よくわかりません。
フォーカス取得時にIMEの変換状態を変更するとよいでしょう。
変換状態の設定は以下のような関数で実現できます。
enum ConversionType {
ImeOff = 1,
Hiragana,
Katakana,
Alpha,
KatakanaHalf,
AlphaHalf
};
void SetImeConversionStatus(HWND hwnd, ConversionType type)
{
HIMC hImc = ImmGetContext(hwnd);
if(type == ImeOff) {
//IMEオフ
ImmSetOpenStatus(hImc, FALSE);
}
else {
ImmSetOpenStatus(hImc, TRUE);
DWORD dwConversion = 0;
DWORD dwSentence = 0;
ImmGetConversionStatus(hImc, &dwConversion, &dwSentence);
switch(type) {
case Hiragana: //ひらがな
dwConversion |= IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE;
dwConversion &= ~IME_CMODE_KATAKANA;
break;
case Katakana: //全角カタカナ
dwConversion |= IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE |
IME_CMODE_KATAKANA;
break;
case Alpha: //全角英数
dwConversion |= IME_CMODE_FULLSHAPE;
dwConversion &= ~(IME_CMODE_NATIVE | IME_CMODE_KATAKANA);
break;
case KatakanaHalf: //半角カタカナ
dwConversion |= IME_CMODE_NATIVE | IME_CMODE_KATAKANA;
dwConversion &= ~IME_CMODE_FULLSHAPE;
break;
case AlphaHalf: //半角英数
dwConversion &= ~(IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE |
IME_CMODE_KATAKANA);
break;
default:
break;
}
ImmSetConversionStatus(hImc, dwConversion, dwSentence);
}
ImmReleaseContext(hwnd, hImc);
}
>>WM_PASTEのハンドラでそのように実装してください。
>見つからなかったのです。
CEditから派生したクラスを作成し、WM_PASTEのハンドラを追加してください。
貼り付け時にクリップボードの中身を調べて半角英数以外の文字が含まれていたら
貼り付けしないという実装にすればよいのだと思います。
エディットボックスのOnEnSetfocus(フォーカスある時)に下記のように書きました。
hEditはエディットボックスのコントロール変数です。
定義されてないとエラー出たので、調べてimm.hをインクルードしました。
ですが、ImmGetとImmSetの行が未解決の外部シンボルエラーとなってしまいます。
void CTree_basisView::OnEnKillfocusEdit3()
{
HIMC hImc;
hImc = ImmGetContext(hEdit);
ImmSetConversionStatus(hImc,IME_CMODE_ROMAN | IME_CMODE_NATIVE |
IME_CMODE_FULLSHAPE,IME_SMODE_PHRASEPREDICT);
}
void CTree_basisView::OnEnKillfocusEdit3()
↓
void CTree_basisView::OnEnSetfocusEdit3()
ソースでは間違えてなかったのですが、ここに書く時に間違えて書きました。
下がソースに正しいです。
プロジェクト→プロパティ→リンカ→入力→追加の依存ファイル→imm32.libを追加でエラーな
くなりました。
それでも半角英数で入力になります。
どこを直せばいいですか?
連投すいません。
下記のようにして動くようになりました。
HIMC hImc = ImmGetContext(m_kensaku);
ImmSetOpenStatus(hImc, TRUE);
ImmSetConversionStatus(hImc,IME_CMODE_ROMAN | IME_CMODE_NATIVE |
IME_CMODE_FULLSHAPE, IME_SMODE_PHRASEPREDICT);
解決しました。
nepiaa様
以上のコードを読みましたあと、質問があります。お願いします。
入力モードの切替方はもうわかりました。ありがとうございました。
言語の切替方はわかりません。
言語の切替方を教えてください。
以上、宜しくお願いいたします。