トップページ > 記事閲覧
ClauseData[i].Lengthが常に0
名前:koga2020 日時: 2015/05/12 16:16

いつもお世話になっています。 Windows7(無印) 32bit ATOK2015(ver 28.0.1) Visual Studio 2010 Express DXライブラリ 3.14aです。 ImeData = GetIMEInputData(); とした時の ImeDataー>ClauseData[i].Length が常に0になります。 もう1つの要素のPositionは正常に値がセットされます。 文節ごとに下線を引くプログラムなので、文節より短く下線が引かれることから気づきました。また、文節の数(ImeData->ClauseNum)だけループして処理するものになっています。 現在の環境に問題があるのかとも思いましたが違うようで、次のものは正常に動作しています。 非常に古いのですが以前VS2005で作成したEXEが手元に残っており、その中では正常に取れており、現在の環境で実行させても文節ごとの下線が正常な長さで引かれてました。 また、当時のEXEのソースをVS2010で動くように修正してコンパイルしたもので、上記の症状となりました。 VS2010でコンパイルしたものであっても、他のCandidate関係やConvertFlag等は正常に動作しているので、ClauseData[i].Lengthだけがおかしいようです。 よろしくお願いします。
メンテ

Page: 1 |

ClauseData[i].Lengthが常に0no ( No.1 )
名前:koga2020 日時:2015/05/12 19:01

int count_for_ime = 0; int count_timing = 100; ////////////////////////////////////////////////////////////////////////////////////// // 入力文字列を描画する関数 void DrawOriginalInputString( int x, int y, int InputHandle, int OnePageListNum, int CursolColor = GetColor(255,255,255) ) { char String[ 1024 ] ; const IMEINPUTDATA *ImeData ; int i, CursorPos, CursorDotPos, SelectClauseX, LineStartX, LineLength, StartNumber ; int p_y = 480 - CANDIDATE_SPACE; SetFontSize( HAN_MOJI_H ) ; // 現時点での確定入力文字列を取得する GetKeyInputString( String , InputHandle ) ; // 確定入力文字列を描画する //バッファ描画を別途行うので、不要 // DrawString( x, p_y, String, GetColor( 255,255,255 ) ) ; // カーソルの位置を取得する CursorPos = GetKeyInputCursorPosition( InputHandle ) ; // カーソルのドット単位の位置を取得する CursorDotPos = GetDrawStringWidth( String, CursorPos ) ; // IME入力情報を取得する ImeData = GetIMEInputData() ; // IME入力情報があるかどうか(IME入力をしているかどうか)で処理を分岐 if( ImeData )//IME ON { count_for_ime++; int IME_CURSOL_POS_X = ImeData->CursorPosition * HAN_MOJI_W; bool is_ImeCursolPos_Kanji_1 = iskanji_1(ImeData->InputString[ImeData->CursorPosition]); int IME_CURSOL_W = HAN_MOJI_W; if(is_ImeCursolPos_Kanji_1) IME_CURSOL_W += HAN_MOJI_W; // IME入力をしている場合 // IMEで入力中の文字列の下地を黒で塗る // DrawBox( CursorDotPos + x, y, CursorDotPos + x + strlen(ImeData->InputString)*9, y+HAN_MOJI_H, GetColor( 0,0,0 ), TRUE ); DrawBox( 0, p_y, strlen(ImeData->InputString)*HAN_MOJI_W, p_y+HAN_MOJI_H, GetColor( 0,0,0 ), TRUE ); // IMEで入力中の文字列を描画する DrawString( 0, p_y, ImeData->InputString, GetColor( 255,255,0 ) ); if(count_for_ime % count_timing == 0) { printfDx("■ClauseNum:%d CursorPosition:%d InputString:%s\nSelectClause:%d IME_CURSOL_POS_X:%d isKanji1:%d\nConvertFlag:%d\n", ImeData->ClauseNum, ImeData->CursorPosition, ImeData->InputString , ImeData->SelectClause, IME_CURSOL_POS_X, is_ImeCursolPos_Kanji_1, ImeData->ConvertFlag ); } // 文節の数だけ下線を描画する for( i = 0; i < ImeData->ClauseNum ; i++ ) { if(count_for_ime % count_timing == 0) { if( i == ImeData->SelectClause ) { printfDx("選択中 ", i, ImeData->ClauseData[ i ].Position); }else { printfDx("選択外 ", i, ImeData->ClauseData[ i ].Position); } printfDx("ClauseData[%d].Position:%d ", i, ImeData->ClauseData[ i ].Position); printfDx("ClauseData[%d].Length:%d ", i, ImeData->ClauseData[ i ].Length); } // 下線の開始座標を計算 LineStartX = GetDrawStringWidth( ImeData->InputString, ImeData->ClauseData[ i ].Position ) ; // 下線の長さを計算 LineLength = GetDrawStringWidth( ImeData->InputString + ImeData->ClauseData[ i ].Position, ImeData->ClauseData[ i ].Length ) ; // 下線の描画 DrawLine( LineStartX + 1, p_y + BOTTOMLINE_Y, LineStartX + LineLength - 1, p_y + BOTTOMLINE_Y, GetColor( 255,255,0 ) ) ; // もし選択している文節だった場合は文節の開始座標を保存しておく if( i == ImeData->SelectClause ) { SelectClauseX = CursorDotPos + LineStartX + x ; } if(count_for_ime % count_timing == 0) { printfDx("\n"); } } // カーソルの描画 if( coursol_bright > 0 ) { // ワープロ上の文字 変換中のIMEのカーソル位置にカーソルを表示 if( editor_type_buf[get_buf_gyo_no(in_y+in_s)][in_x] == TYPE_ZENKAKU1 || editor_type_buf[get_buf_gyo_no(in_y+in_s)][in_x] == TYPE_GAIJI_ZEN1 ) { DrawCursol(x + CursorDotPos, y, coursol_overwrite, CursolColor, 2); }else { DrawCursol(x + CursorDotPos, y, coursol_overwrite, CursolColor, 1); } // FEPライン上の文字 IMEの行は、常に上書きモードのカーソルを描画 if(ImeData->CursorPosition == strlen(ImeData->InputString)) // IME上の文字より、右端に隣接する場所のとき { // 小さい下線のみの描画 DrawBox(IME_CURSOL_POS_X, p_y+HAN_MOJI_H-1,IME_CURSOL_POS_X+IME_CURSOL_W, p_y+HAN_MOJI_H, GetColor( 255,255,0 ), TRUE); } if(ImeData->ConvertFlag == false) // 変換中ではないとき { DrawBox(IME_CURSOL_POS_X, p_y ,IME_CURSOL_POS_X+IME_CURSOL_W, p_y+HAN_MOJI_H, GetColor( 255,255,0 ), TRUE); }else // 変換中のとき { DrawBox(IME_CURSOL_POS_X, p_y ,IME_CURSOL_POS_X+IME_CURSOL_W, p_y+HAN_MOJI_H, GetColor( 0,255,255 ), TRUE); } //DrawBox(GetDrawStringWidth( ImeData->InputString, ImeData->CursorPosition ), p_y,GetDrawStringWidth( ImeData->InputString, ImeData->CursorPosition )+HAN_MOJI_W, p_y+HAN_MOJI_H, GetColor( 255,255,0 ), TRUE); } // 変換候補リストが存在する場合は描画処理を行う if( ImeData->CandidateNum ) { //背景を黒で塗りつぶす DrawBox( 0, 480 - CANDIDATE_SPACE, 680, 480, GetColor(0,0,0), TRUE ); // 変換候補リストの開始ナンバーを計算 StartNumber = ImeData->SelectCandidate / OnePageListNum * OnePageListNum ; //【変換候補文字の描画】 // 変換候補リストの同時表示数に達するか、変換候補リストの終端に来るまでループ for( i = 0; StartNumber + i < ImeData->CandidateNum && i < OnePageListNum; i ++ ) { char koho[256]; //描画内容をセット sprintf_s( koho, "%d.%s",i+1,ImeData->CandidateList[ StartNumber + i ] ); // 現在いる文節の描画(反転描画) if( ImeData->SelectCandidate - StartNumber == i ) DrawString_hanten( i*120, 480-CANDIDATE_SPACE, koho, GetColor( 255,255,255 ) ) ; else DrawString( i*120, 480-CANDIDATE_SPACE, koho, GetColor( 255,255,255 ) ) ; } } if(count_for_ime % count_timing == 0) { printfDx("\n\n"); } } else { // カーソルを描画 if( coursol_bright > 0 ) //IME OFFの状態のカーソル位置にカーソルを表示 { if( editor_type_buf[get_buf_gyo_no(in_y+in_s)][in_x] == TYPE_ZENKAKU1 || editor_type_buf[get_buf_gyo_no(in_y+in_s)][in_x] == TYPE_GAIJI_ZEN1 ) { DrawCursol(x+CursorDotPos, y, coursol_overwrite, CursolColor, 2); }else { DrawCursol(x+CursorDotPos, y, coursol_overwrite, CursolColor, 1); } } } }
メンテ
すみません、、、 ( No.2 )
名前:koga2020 日時:2015/05/12 19:10

すみません、IME確定のつもりでEnterを押したら、送信してしまいました。 題名「ClauseData[i].Lengthが常に0のソース」にするつもりでした。 デバッグ用のprintfDXにコピペの残骸があったり見苦しいのに今更気づきましたが、「// 文節の数だけ下線を描画する」のループで    Positionは正しく値が出るが、    Lengthは常に 0 になってしまいます。 先のソースはデバッグ用にprintfDXを追加してありますが、printfDXの無い元のソースを2008年頃にVC2005で作成したexeのものは正常に動作(下線の長さが文節の長さと一致して描画される)しています。
メンテ
Re: ClauseData[i].Lengthが常に0 ( No.3 )
名前:管理人 日時:2015/05/13 00:38

ご指摘ありがとうございます、現象を確認できました 修正版をアップしましたので、よろしければお使いください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: ClauseData[i].Lengthが常に0 ( No.4 )
名前:koga2020 日時:2015/05/13 09:06

早速の修正ありがとうございます。 修正版を試したところ、以下のようになりました。 あ      Pos:0 Lengs:0 あい     Pos:0 Lengs:2 あいう    Pos:0 Lengs:2 あいうえ   Pos:0 Lengs:4 あいうえお  Pos:0 Lengs:4 あいうえおか Pos:0 Lengs:6 カウント方法だと思うのですが、正しくは あ      Pos:0 Lengs:2 あい     Pos:0 Lengs:4 あいう    Pos:0 Lengs:6 あいうえ   Pos:0 Lengs:8 あいうえお  Pos:0 Lengs:10 あいうえおか Pos:0 Lengs:12 になっていく値だと思います。 よろしくお願いします。
メンテ
Re: ClauseData[i].Lengthが常に0 ( No.5 )
名前:管理人 日時:2015/05/14 04:40

すみません、確認が不十分でした 再度修正したバージョンをアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: ClauseData[i].Lengthが常に0 ( No.6 )
名前:koga2020 日時:2015/05/15 09:43

修正ありがとうございます。 Length大丈夫になりました。 度々すみません、、、ImeData->SelectClauseですが以下のようになります。 「きょうはてんきもよく」ー> 今日は 天気も よく を例にすると、    ※「()」は変換対象文節の位置(ATOK上のカーソル位置)です。 キー入力:きょうはてんきもよく   このとき、未変換ですらない状態なので文節は存在しませんので、SelectClauseは -1 です。 SP押下:(今日は)天気もよく    このとき、(今日は)は1番目なのでSelectClauseは 0 です。 右矢印:今日は(天気も)よく    このとき、(天気も)は2番目なのでSelectClauseは 1 です。 右矢印:今日は天気も(よく)    このとき、(よく)は3番目なのですがSelectClauseは -1 です。 -1となってしまうタイミングがおかしいようです。 一方で、IME上のキャレット位置を示す ImeData->CursorPosition は正常な位置を示し続けていました。 よろしくお願いします。
メンテ
Re: ClauseData[i].Lengthが常に0 ( No.7 )
名前:管理人 日時:2015/05/16 23:31

すみません、ImeData->SelectClause のバグを確認、修正しましたので、 よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: ClauseData[i].Lengthが常に0 ( No.8 )
名前:koga2020 (解決) 日時:2015/05/17 09:52

ありがとうございます! 大丈夫になりました。
メンテ

Page: 1 |

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

   クッキー保存