DSでかな漢字変換(4)
かな漢字変換ネタに飽きてきました。ただ、ちょっと、バージョンアップしたので書いておきます。
xmlで返ってくる変換候補について、全て選べるようにしました。
int HaitiSelect( int n, int page );
これは候補文字を表示する関数です。変換候補が表示画面内に納まりきらない場合には、今までは無視していましたが、pageという変数が実は表示ページを指定するもので、もともと関数の引数として用意していましたが、関数の中では使っていませんでした。今回、この機能を組み込みました。
関数の戻り値は、この候補が持っている最大ページです。
//************************************************** // 候補文字の表示 // 最終ページを返す。 //************************************************** int HaitiSelect( int n, int page ) { FILE *fp = NULL; char tagData[256]; long posSegmentList; int ret; int ul; int x, y; int hf, haikei; int pagecnt = 0; //XMLファイルを開く fp = fpOpen( KANAKANJI_FOLDER, JIMSERVICE_XML, 0 ); if( fp==NULL ){ ShinoUpPrint( MainScreenA, (u8 *)JIMSERVICE_XML, RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) ); ShinoUpPrint( MainScreenA, (u8 *)"↑がみつかりません", RGB(31,0,0), RGB( 0,0,0 ), 1, RGB( 0,0,0 ) ); return( -1 ); } xmlReadMojiCode( fp ); //XMLデータの文字コードを取得する fseek( fp, 0, SEEK_SET ); //ファイルの先頭に ret = xmlTagTopFound( fp, '<' ); //最初のタグ開始位置までスキップ ret = xmlSearchLayerTag( fp, "ResultSet/Result/SegmentList", ftell(fp) ); posSegmentList = ftell( fp ); //SegmentList開始位置退避 fseek( fp, posSegmentList, SEEK_SET ); //SegmentList開始位置に復帰させる ret = xmlSearchTag( fp, "Segment", n+1 ); //(n+1)個目の"Segment"タグを探してその位置に移動する if( ret!=XML_TRUE ){ return( -1 ); } ret = xmlSearchTag( fp, "CandidateList", 1 ); if( ret!=XML_TRUE ){ return( -1 ); } x = 0; y = 4; hf = 0; while( true ){ ret = xmlGetValue( fp, (char*)"Candidate", tagData, 256, ftell(fp) ); if( ret!=XML_TRUE ){ break; } UTF82SJIS( (unsigned char*)tagData, 255 ); ul = strlen( tagData ); //文字の長さ if( ul+x>28 ){ x = 0; y -= 1; } if( hf==0 ){ haikei = RGB(31,31,10); hf = 1; } else{ haikei = RGB(10,31,0); hf = 0; } if( y<0 ){ y = 4; pagecnt++; } if( page==pagecnt ){ ShinoPrint( KeyScreen, 6*x, 14*y, (u8 *)tagData, RGB(0,0,0), haikei, 1 ); } x += ul; } fclose( fp ); return( pagecnt ); }
pageの指定がいくつであれ、全ての候補語を検索しているので、非常に効率の悪いプログラムになっています。
あとは、編集部分を少し変えました。かな漢字変換部分に何も入力されていなければ、下のメインの編集エリアの編集が有効となるように、if文に、&& kanaKan.Text[0]!=0 を追加しました。ソースは下記です。
//************************************************** // ラインエディットします //************************************************** int LeditKanaKan( LineEditParam lineEdit, LineEditParam kanaKan ) { int keyCode; //1ラインの文字数は256文字以下 if( lineEdit.ChaMojiSu>EDITMOJIMAX ){ lineEdit.ChaMojiSu = EDITMOJIMAX; } if( kanaKan.ChaMojiSu>EDITMOJIMAX ){ kanaKan.ChaMojiSu = EDITMOJIMAX; } //かな漢字変換エリア //表示可能文字数は2以上 if( lineEdit.ChaDispNum<=2 ){ lineEdit.ChaDispNum = 2; } if( kanaKan.ChaDispNum<=2 ) { kanaKan.ChaDispNum = 2; } //かな漢字変換エリア //指定の位置に文字を表示します(初期化します) LineEditSyokika( lineEdit ); while( true ){ //キー待ち keyCode = GetKeyPen(); if( keyCode==0x1c ){ //右カーソル:カーソルを右に動かす if( (SoftKeyboard&0x400)==0x400 && kanaKan.Text[0]!=0 ){ CursorRightMove( kanaKan ); }else{ CursorRightMove( lineEdit );} } else if( keyCode==0x1d ){ //左カーソル:カーソルを左に動かす if( (SoftKeyboard&0x400)==0x400 && kanaKan.Text[0]!=0 ){ CursorLeftMove( kanaKan ); }else{ CursorLeftMove( lineEdit ); } } else if( keyCode==0x1e ){ //上カーソル:カーソルを編集文字列の先頭に動かす if( (SoftKeyboard&0x400)==0x400 ){ CursorUpMove( kanaKan ); } else{ SoftKeyboard |= 0x400; //[漢]ボタンのオン KanButton( kanaKan ); //CursorUpMove( lineEdit ); } } else if( keyCode==0x1f ){ //下カーソル:カーソルを編集文字列の最後に動かす if( (SoftKeyboard&0x400)==0x400 ){ if( kanaKan.Text[0]!=0 ){ //かな漢字変換 callKanjiHenkan( lineEdit, kanaKan ); } else{ //かな漢字変換エリアを閉じる SoftKeyboard |= 0x400; //ビットを1にして1でXORとると0になる SoftKeyboard ^= 0x400; //[漢]ボタンのオフ KanButton( kanaKan ); } } else{ CursorDownMove( lineEdit ); } } else if( keyCode==0xff ){ //タッチペンがキー以外のところをタッチした if( (SoftKeyboard&0x400)==0x400 ){ OutAreaTouch( kanaKan ); } OutAreaTouch( lineEdit ); } else if( keyCode==0x7f || keyCode==0x6 ){ // [DEL] キーの処理 if( (SoftKeyboard&0x400)==0x400 && kanaKan.Text[0]!=0 ){ DelText( kanaKan ); }else{ DelText( lineEdit ); } } else if( keyCode==0x8 || keyCode==0x2 ){ // [BS] キーの処理 if( (SoftKeyboard&0x400)==0x400 && kanaKan.Text[0]!=0 ){ BsText( kanaKan ); }else{ BsText( lineEdit ); } } else if( (keyCode>=0x20 && keyCode<=0x7e) || (keyCode>=0xa1 && keyCode<=0xdf) ){ //1バイト文字を挿入します。 if( (SoftKeyboard&0x400)==0x400 ){ if( keyCode==0x20 ){ //かな漢字変換する //かな漢字変換 // callKanjiHenkan( kanaKan ); } //半角文字はかな漢字変換エリアに入力不可とする } else{ InsHankakuText( lineEdit, keyCode ); } } else if( keyCode==0x5049 ){ //[漢]ボタンが押された処理 KanButton( kanaKan ); } else if( keyCode==0x814A || keyCode==0x814B ){ //濁点または半濁点が入力された if( (SoftKeyboard&0x400)==0x400 ){ DakutenHandakuten( kanaKan, keyCode ); } else{ DakutenHandakuten( lineEdit, keyCode ); } } else if( keyCode==0x8140 ){ //全角スペースが押された処理 if( (SoftKeyboard&0x400)==0x400 ){ //[漢]ボタンが押されていてかな漢字変換エリアに文字があれば if( kanaKan.Text[0]!=0 ){ //かな漢字変換 callKanjiHenkan( lineEdit, kanaKan ); } } else{ InsZenkakuText( lineEdit, keyCode ); } } else if( keyCode>=0x100 ){ //2バイトキー入力を行います if( (SoftKeyboard&0x400)==0x400 ){ InsZenkakuText( kanaKan, keyCode ); } else{ InsZenkakuText( lineEdit, keyCode ); } } else if( keyCode==0x1 ){ //(A)ボタンの場合は編集終了 if( (SoftKeyboard&0x400)==0x400 ){ if( kanaKan.Text[0]==0 ){ //かな漢字変換エリアを閉じる SoftKeyboard |= 0x400; //ビットを1にして1でXORとると0になる SoftKeyboard ^= 0x400; //[漢]ボタンのオフ KanButton( kanaKan ); return( 0xd ); } else{ //かな漢字変換エリアの文字をメインテキストにコピー InsMainText( lineEdit, kanaKan ); kanaKan.Text[0] = 0; *kanaKan.CurPosi = 0; KanButton( kanaKan ); //変換エリアの初期化 } } else{ return( 0x1 ); } } else if( keyCode==0xd ){ //[Enter]ボタンの場合は編集終了 if( (SoftKeyboard&0x400)==0x400 ){ if( kanaKan.Text[0]==0 ){ //かな漢字変換エリアを閉じる SoftKeyboard |= 0x400; //ビットを1にして1でXORとると0になる SoftKeyboard ^= 0x400; //[漢]ボタンのオフ KanButton( kanaKan ); return( 0xd ); } else{ //かな漢字変換エリアの文字をメインテキストにコピー InsMainText( lineEdit, kanaKan ); kanaKan.Text[0] = 0; *kanaKan.CurPosi = 0; KanButton( kanaKan ); //変換エリアの初期化 } } else{ return( 0xd ); } } else if( keyCode==0x1b ){ //[ESC]ボタンの場合は編集終了 return( 0x1b ); } else if( keyCode==0x3 ){ //[START]ボタンの場合は編集終了 return( 0x3 ); } else if( keyCode==0x4 ){ //[SELECT]ボタンの場合は編集終了 return( 0x4 ); } else if( keyCode==0x5 ){ //[X]ボタンの場合は編集終了 return( 0x5 ); } //カーソル位置にカーソルを表示します DispCurLposi( lineEdit ); if( (SoftKeyboard&0x400)==0x400 ){ DispCurLposi( kanaKan ); } } }
新しいプログラムは、NDS Program Roomにアップしています。興味のある方はダウンロードしてみて下さい。
本当にやりたいことリスト
(ブログの終わりにやりたいことを書いておきたいと思います)
- 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
- Androidプログラム
- Web系のプログラム