入力モードについて

[戻る]
nepiaa 2008/07/05(土) 14:22:33
環境はWinXP VisualStudio.NET2003 VC++ MFC です。

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

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

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

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

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

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

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

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

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

nepiaa 2008/07/07(月) 15:53:36
>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 2008/07/08(火) 13:37:07
>>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 2008/07/09(水) 15:04:04
エディットボックスの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 2008/07/09(水) 15:05:51
void CTree_basisView::OnEnKillfocusEdit3()
↓
void CTree_basisView::OnEnSetfocusEdit3()

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

nepiaa 2008/07/09(水) 16:10:29
プロジェクト→プロパティ→リンカ→入力→追加の依存ファイル→imm32.libを追加でエラーな
くなりました。

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

nepiaa 2008/07/09(水) 16:18:33
連投すいません。
下記のようにして動くようになりました。

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

nepiaa 2008/07/09(水) 16:18:46
[[解決]]
解決しました。

筋肉マン [E-Mail] 2008/09/24(水) 11:55:30
nepiaa様
以上のコードを読みましたあと、質問があります。お願いします。
入力モードの切替方はもうわかりました。ありがとうございました。
言語の切替方はわかりません。
言語の切替方を教えてください。

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

古いスレッドには追加発言できません。