入力モードについて – プログラミング – Home

通知
すべてクリア

[解決済] 入力モードについて


nepiaa
 nepiaa
(@nepiaa)
ゲスト
結合: 17年前
投稿: 35
Topic starter  

環境はWinXP VisualStudio.NET2003 VC++ MFC です。

エディットボックスに入力する時の入力モードについて教えてください。
エディットボックスA、Bを作りました。
下記の条件で入力させるようにしたいです。

A.エディットボックスにフォーカスが来ている時だけ入力モードをひらがなにする。
入力モードを言語バーやキーボードの半角/全角キーで変更できる。
フォーカスが無くなると元のモードに戻す。

B.エディットボックスにフォーカスが来ている時だけ入力モードを半角英数にする。
入力モードを言語バーやキーボードの半角/全角キーで変更ができない。
フォーカスが無くなると元のモードに戻す。
半角英数以外の貼り付けはできない。


引用未解決
トピックタグ
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>A.エディットボックスにフォーカスが来ている時だけ入力モードをひらがなにする。
>入力モードを言語バーやキーボードの半角/全角キーで変更できる。
>フォーカスが無くなると元のモードに戻す。

ImmSetConversionStatusでIMEの変換状態を設定できます。

>B.エディットボックスにフォーカスが来ている時だけ入力モードを半角英数にする。
>入力モードを言語バーやキーボードの半角/全角キーで変更ができない。
>フォーカスが無くなると元のモードに戻す。

ImmAssociateContextにNULLを指定してウインドウと入力コンテキストの
関連付けを解除すれば入力モードを半角英数のみにできます。

>半角英数以外の貼り付けはできない。

WM_PASTEのハンドラでそのように実装してください。


返信引用
nepiaa
 nepiaa
(@nepiaa)
ゲスト
結合: 17年前
投稿: 35
Topic starter  

>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のハンドラでそのように実装してください。
見つからなかったのです。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>>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のハンドラを追加してください。
貼り付け時にクリップボードの中身を調べて半角英数以外の文字が含まれていたら
貼り付けしないという実装にすればよいのだと思います。


返信引用
nepiaa
 nepiaa
(@nepiaa)
ゲスト
結合: 17年前
投稿: 35
Topic starter  

エディットボックスの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);
}


返信引用
nepiaa
 nepiaa
(@nepiaa)
ゲスト
結合: 17年前
投稿: 35
Topic starter  

void CTree_basisView::OnEnKillfocusEdit3()

void CTree_basisView::OnEnSetfocusEdit3()

ソースでは間違えてなかったのですが、ここに書く時に間違えて書きました。
下がソースに正しいです。


返信引用
nepiaa
 nepiaa
(@nepiaa)
ゲスト
結合: 17年前
投稿: 35
Topic starter  

プロジェクト→プロパティ→リンカ→入力→追加の依存ファイル→imm32.libを追加でエラーな
くなりました。

それでも半角英数で入力になります。
どこを直せばいいですか?


返信引用
nepiaa
 nepiaa
(@nepiaa)
ゲスト
結合: 17年前
投稿: 35
Topic starter  

連投すいません。
下記のようにして動くようになりました。

HIMC hImc = ImmGetContext(m_kensaku);
ImmSetOpenStatus(hImc, TRUE);
ImmSetConversionStatus(hImc,IME_CMODE_ROMAN | IME_CMODE_NATIVE |
IME_CMODE_FULLSHAPE, IME_SMODE_PHRASEPREDICT);


返信引用
nepiaa
 nepiaa
(@nepiaa)
ゲスト
結合: 17年前
投稿: 35
Topic starter  

解決しました。


返信引用
筋肉マン
 筋肉マン
(@筋肉マン)
ゲスト
結合: 16年前
投稿: 1
 

nepiaa様
以上のコードを読みましたあと、質問があります。お願いします。
入力モードの切替方はもうわかりました。ありがとうございました。
言語の切替方はわかりません。
言語の切替方を教えてください。

以上、宜しくお願いいたします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました