トップページ > 記事閲覧
入力済みの文字の再変換について
名前:ホビロン山崎 日時: 2014/08/28 14:05

お世話になっております。 キーボードで入力している最中に変換することはできたのですが、 既に入力済みの文字を再変換することは可能でしょうか。 よろしくおねがいします。
メンテ

Page: 1 |

Re: 入力済みの文字の再変換について ( No.1 )
名前:管理人 日時:2014/08/29 00:07

> 既に入力済みの文字を再変換することは可能でしょうか。 すみません、できません 文字列を範囲選択して「変換」キーを押すと再変換することができるんですね・・・今日初めて知りました 週末に時間が確保できたら実装できるか試してみようと思います
メンテ
Re: 入力済みの文字の再変換について ( No.2 )
名前:管理人 日時:2014/08/31 02:52

文字列の再変換に対応してみました よろしければお試しください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: 入力済みの文字の再変換について ( No.3 )
名前:ホビロン山崎 日時:2014/09/01 13:33

説明不足で申し訳ありません。 現在作りたいと思っているものが、マウスだけで文字を入力することのできるソフトキーボードのようなものなので、画面に配置するボタン操作のみで再変換を行いたいのですが、そういった環境を作ることができる関数などを用意していただくことは可能でしょうか…?
メンテ
Re: 入力済みの文字の再変換について ( No.4 )
名前:管理人 日時:2014/09/04 00:30

少し調べてみましたところ、実現出来そうなAPIをみつけました 週末に時間が確保できたら試してみようと思います
メンテ
Re: 入力済みの文字の再変換について ( No.5 )
名前:管理人 日時:2014/09/05 01:04

当初考えていたAPIが機能しなかったので、「キーボードのキーを押したことにする」APIを使って ソフトキーボードを実現するサンプルを作成してみました、よろしければご覧ください あと、下記のサンプルは再変換の機能を使用していますので、No.2 の暫定最新版をお使いください m(_ _)m #include "DxLib.h" #define TOPSPACE 64 #define SPACE 48 #define XNUM 16 #define YNUM 5 // 文字テーブル const char *CharTable[ XNUM ][ YNUM ] = { "あ", "い", "う", "え", "お", "か", "き", "く", "け", "こ", "さ", "し", "す", "せ", "そ", "た", "ち", "つ", "て", "と", "な", "に", "ぬ", "ね", "の", "は", "ひ", "ふ", "へ", "ほ", "ま", "み", "む", "め", "も", "や", "ゐ", "ゆ", "ゑ", "よ", "ら", "り", "る", "れ", "ろ", "わ", "を", "ん", "っ", " ", "が", "ぎ", "ぐ", "げ", "ご", "ざ", "じ", "ず", "ぜ", "ぞ", "た", "ぢ", "づ", "で", "ど", "ば", "び", "ぶ", "べ", "ぼ", "←", "→", "BS", "DEL", "変換", "変←", "変→", "変↑", "変↓", "確定", } ; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int i ; int j ; int KeyInputHandle ; int MouseInputEdge = 0 ; int MouseInputNow = 0 ; int MouseInputOld = 0 ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // 画面は横長に SetGraphMode( 1024, 480, 32 ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // キー入力ハンドルの作成 KeyInputHandle = MakeKeyInput( 256, FALSE, FALSE, FALSE, FALSE ) ; // 作成したキー入力ハンドルをアクティブにする SetActiveKeyInput( KeyInputHandle ) ; // メインループ(何かキーが押されたらループを抜ける) while( ProcessMessage() == 0 ) { // マウスの入力更新 MouseInputOld = MouseInputNow ; MouseInputNow = GetMouseInput() ; MouseInputEdge = MouseInputNow & ~MouseInputOld ; // 左クリックされたら処理 if( MouseInputEdge & MOUSE_INPUT_LEFT ) { int PressX ; int PressY ; int MouseX ; int MouseY ; // マウスカーソルの位置から押されたマスを割り出す GetMousePoint( &MouseX, &MouseY ) ; PressX = MouseX / SPACE ; PressY = ( MouseY - TOPSPACE ) / SPACE ; // マスの範囲内のみ処理 if( PressX >= 0 && PressX < XNUM || PressY >= 0 && PressY < XNUM ) { int StrLen ; const char *Chr ; const IMEINPUTDATA *IMEData ; // 押されたマスの文字列を取得 Chr = CharTable[ PressX ][ PressY ] ; // IMEの状態も取得 IMEData = GetIMEInputData() ; // "←"が押されたら←キーを押したことにする if( strcmp( Chr, "←" ) == 0 ) { keybd_event( VK_LEFT, 0, 0, 0 ) ; keybd_event( VK_LEFT, 0, KEYEVENTF_KEYUP, 0 ) ; } else // "→"が押されたら→キーを押したことにする if( strcmp( Chr, "→" ) == 0 ) { keybd_event( VK_RIGHT, 0, 0, 0 ) ; keybd_event( VK_RIGHT, 0, KEYEVENTF_KEYUP, 0 ) ; } else // "変換"が押されたら変換キーが押されたことにする if( strcmp( Chr, "変換" ) == 0 ) { keybd_event( VK_CONVERT, 0, 0, 0 ) ; keybd_event( VK_CONVERT, 0, KEYEVENTF_KEYUP, 0 ) ; } else // "確定"が押されたらEnterキーが押されたことにする if( strcmp( Chr, "確定" ) == 0 ) { keybd_event( VK_RETURN, 0, 0, 0 ) ; keybd_event( VK_RETURN, 0, KEYEVENTF_KEYUP, 0 ) ; } else // "BS"が押されたらBackSpaceキーが押されたことにする if( strcmp( Chr, "BS" ) == 0 ) { keybd_event( VK_BACK, 0, 0, 0 ) ; keybd_event( VK_BACK, 0, KEYEVENTF_KEYUP, 0 ) ; } else // "DEL"が押されたらDeleteキーが押されたことにする if( strcmp( Chr, "DEL" ) == 0 ) { keybd_event( VK_DELETE, 0, 0, 0 ) ; keybd_event( VK_DELETE, 0, KEYEVENTF_KEYUP, 0 ) ; } else // "変←"が押されたら文字列変換中にシフトキー+←キーが押されたことにする if( strcmp( Chr, "変←" ) == 0 ) { // 変換中ではなかったら何もしない if( IMEData != NULL && IMEData->CandidateNum != 0 ) { keybd_event( VK_SHIFT, 0, 0, 0 ) ; keybd_event( VK_LEFT, 0, KEYEVENTF_EXTENDEDKEY, 0 ) ; keybd_event( VK_LEFT, 0, KEYEVENTF_KEYUP, 0 ) ; keybd_event( VK_SHIFT, 0, KEYEVENTF_KEYUP, 0 ) ; } } else // "変→"が押されたら文字列変換中にシフトキー+→キーが押されたことにする if( strcmp( Chr, "変→" ) == 0 ) { // 変換中ではなかったら何もしない if( IMEData != NULL && IMEData->CandidateNum != 0 ) { keybd_event( VK_SHIFT, 0, 0, 0 ) ; keybd_event( VK_RIGHT, 0, KEYEVENTF_EXTENDEDKEY, 0 ) ; keybd_event( VK_RIGHT, 0, KEYEVENTF_KEYUP, 0 ) ; keybd_event( VK_SHIFT, 0, KEYEVENTF_KEYUP, 0 ) ; } } else // "変↑"が押されたら文字列変換中に↑キーが押されたことにする if( strcmp( Chr, "変↑" ) == 0 ) { // IME入力中ではないか変換リストが出ていない場合は"変換"と同じ動作にする if( IMEData == NULL || IMEData->CandidateNum == 0 ) { keybd_event( VK_CONVERT, 0, 0, 0 ) ; keybd_event( VK_CONVERT, 0, KEYEVENTF_KEYUP, 0 ) ; } else { keybd_event( VK_UP, 0, 0, 0 ) ; keybd_event( VK_UP, 0, KEYEVENTF_KEYUP, 0 ) ; } } else // "変↓"が押されたら文字列変換中に↓キーが押されたことにする if( strcmp( Chr, "変↓" ) == 0 ) { // IME入力中ではないか変換リストが出ていない場合は"変換"と同じ動作にする if( IMEData == NULL || IMEData->CandidateNum == 0 ) { keybd_event( VK_CONVERT, 0, 0, 0 ) ; keybd_event( VK_CONVERT, 0, KEYEVENTF_KEYUP, 0 ) ; } else { keybd_event( VK_DOWN, 0, 0, 0 ) ; keybd_event( VK_DOWN, 0, KEYEVENTF_KEYUP, 0 ) ; } } else // それ以外の場合は文字列をキー入力に送る { StrLen = strlen( Chr ) ; for( i = 0 ; i < StrLen ; i ++ ) { StockInputChar( Chr[ i ] ) ; } } } } // 画面のクリア ClearDrawScreen() ; // 文字一覧とマスの枠を描画する for( i = 0 ; i < YNUM ; i ++ ) { for( j = 0 ; j < XNUM ; j ++ ) { DrawString( j * SPACE + 8, i * SPACE + TOPSPACE + 8, CharTable[ j ][ i ], GetColor( 255,255,255 ) ) ; DrawBox( j * SPACE, i * SPACE + TOPSPACE, ( j + 1 ) * SPACE, ( i + 1 ) * SPACE + TOPSPACE, GetColor( 255,255,255 ), FALSE ) ; } } // 入力が終了している場合は終了 if( CheckKeyInput( KeyInputHandle ) != 0 ) break ; // 入力モードを描画 DrawKeyInputModeString( 1024, 480 ) ; // 入力途中の文字列を描画 DrawKeyInputString( 0 , 0 , KeyInputHandle ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: 入力済みの文字の再変換について ( No.6 )
名前:ホビロン山崎(解決) 日時:2014/09/08 13:51

ありがとうございます! やりたいことを実現できました お手数おかけしました
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存