トップページ > 過去ログ > 記事閲覧
MakeKeyInput関係の挙動について
名前:いっち 日時: 2012/02/05 14:18

MakeKeyInput 関係の挙動についていくつかご確認頂きたい事象があります。 (事象の説明用にテストコードを作成しましたので末尾に掲載します。 テストコードはキー入力を2つ作りそれらをボタン入力(マウス)で操作するというものです。 各ボタンの動作はお手数ですが switch 文の中をご確認下さい。) 1.アクティブなキー入力のキャンセル Dxlib.h によると SetActiveKeyInput に -1 を渡すことでアクティブなキーハンドルを 非アクティブにすることが出来るようですが、現在その様にはなっていないようです。 テストコードによる再現手順は以下の通りです。 [0]をクリックし kih1 をアクティブにする。 → [6]をクリックしても kih1 はアクティブなまま。 2.GetActiveKeyInput の戻り値 Dxlib.h によると GetActiveKeyInput は「現在アクティブになっているキー入力ハンドルを取得する」と なっていますが、現状では「最後にアクティブになっていたキー入力ハンドルを取得する」になっているようです。 DXライブラリが自動で「アクティブ->非アクティブ」に切り替えることはあってもその逆は無いので、 アクティブなキー入力ハンドルが無い場合は戻り値として -1 を戻すほうが良いように思います。 (ただ、現状でもキーハンドルの状態は追跡可能(なはず)なので 「最後にアクティブになっていた〜」という機能のままでも良いかもしれません。) 3.CheckKeyInput の戻り値 本件は要望なのですが SetActiveKeyInput によってアクティブなキーハンドルが非アクティブになった場合、 CheckKeyInput から有意な戻り値(たとえば 3 など)を返却するようにしていただく事は可能でしょうか? (現状でもキーハンドルの状態は追跡可能なので特に問題ないのですが、0 が返却されているのも何かおかしい気がします) 4.ReStartKeyInput の挙動 その1 ReStartKeyInput を使用すると入力不可のまま DrawKeyInputString が有効になることがあります。 テストコードによる再現手順は以下の通りです。 [0]をクリックし kih1 をアクティブにする。 → 何らかの文字を入力 Enter で確定する。 → [3]をクリックし kih2 をアクティブにする。 → [1]をクリックすると kih1 が入力不可のまま DrawKeyInputString が有効になる。 5.ReStartKeyInput の挙動 その2 ReStartKeyInput が入力不可時のキー入力を拾ってきます。 テストコードによる再現手順は以下の通りです。 [0]をクリックし kih1 をアクティブにする。 → 何らかの文字を入力 Enter で確定する。 → そのままさらに何らかの文字を入力する。 → [1]をクリックすると kih1 に直前に入力した文字も追加されている。 以下は関連スレッドです。 > h t t p://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1675 ReStartKeyInput に関しては今回少し動作を確認してみたのですが、使いどころが良く分かりませんでした。 もしかすると、管理人さんの意図通りに動作していない部分が他にもあるのかもしれません。 ご確認のほどよろしくお願いします。 //-- 以下、テストコード --// #include "DxLib.h" int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) { ChangeWindowMode( TRUE ); SetWindowText( "DxLib:" DXLIB_VERSION_STR ); if ( DxLib_Init( ) == -1 ) return -1; int white = GetColor( 255, 255, 255 ); RECT btn[8]; POINT mp; for ( int i = 0; i < sizeof(btn) / sizeof(RECT); i++ ) { btn[i].left = i * 40; btn[i].right = btn[i].left + 40; btn[i].top = 120; btn[i].bottom = btn[i].top + 40; } char strbuff[256] = {0}; int kih1 = MakeKeyInput( 50, TRUE, FALSE, FALSE ); int kih2 = MakeKeyInput( 50, TRUE, FALSE, FALSE ); int minew = 0, miold = GetMouseInput( ), mx = 0, my = 0, btnpush = -1; SetDrawScreen( DX_SCREEN_BACK ); while ( ProcessMessage( ) == 0 ) { btnpush = -1; if ( (minew = GetMouseInput( )) != miold ) { if ( minew & MOUSE_INPUT_LEFT ) { GetMousePoint( (int*)&mp.x, (int*)&mp.y ); for ( int i = 0; i < sizeof(btn) / sizeof(RECT); i++ ) { if ( PtInRect( &btn[i], mp ) ) { btnpush = i; break; } } } } miold = minew; switch ( btnpush ) { case 0: SetActiveKeyInput( kih1 ); break; case 1: ReStartKeyInput( kih1 ); break; case 2: SetKeyInputString( 0, kih1 ); break; case 3: SetActiveKeyInput( kih2 ); break; case 4: ReStartKeyInput( kih2 ); break; case 5: SetKeyInputString( 0, kih2 ); break; case 6: SetActiveKeyInput( -1 ); break; case 7: ClearInputCharBuf( ); break; default: break; } ClearDrawScreen( ); DrawKeyInputModeString( 640, 480 ); DrawFormatString( 0, 0, white, "kih1:" ); DrawKeyInputString( 48, 0, kih1 ); GetKeyInputString( strbuff, kih1 ); DrawFormatString( 0, 20, white, "id=%d status=%d : %s", kih1, CheckKeyInput( kih1 ), strbuff ); DrawFormatString( 0, 40, white, "kih2:" ); DrawKeyInputString( 48, 40, kih2 ); GetKeyInputString( strbuff, kih2 ); DrawFormatString( 0, 60, white, "id=%d status=%d : %s", kih2, CheckKeyInput( kih2 ), strbuff ); DrawFormatString( 0, 80, white, "ActiveKeyInput = %d", GetActiveKeyInput( ) ); for ( int i = 0; i < sizeof(btn) / sizeof(RECT); i++ ) { DrawBox( btn[i].left, btn[i].top, btn[i].right, btn[i].bottom, white, FALSE ); DrawFormatString( btn[i].left + 2, btn[i].top + 2, white, "%d", i ); } ScreenFlip( ); } DeleteKeyInput( kih1 ); DeleteKeyInput( kih2 ); DxLib_End( ); return 0; }

Page: 1 |

Re: MakeKeyInput関係の挙動について ( No.1 )
名前:管理人 日時:2012/02/06 03:06

ご報告&検証用のプログラムありがとうございます > 1.アクティブなキー入力のキャンセル >  Dxlib.h によると SetActiveKeyInput に -1 を渡すことでアクティブなキーハンドルを >  非アクティブにすることが出来るようですが、現在その様にはなっていないようです。 すいませんバグっていました、修正しました > 2.GetActiveKeyInput の戻り値 >  Dxlib.h によると GetActiveKeyInput は「現在アクティブになっているキー入力ハンドルを取得する」と >  なっていますが、現状では「最後にアクティブになっていたキー入力ハンドルを取得する」になっているようです。 入力が完了してもアクティブ状態が解除されないままになっていました 修正しました( 入力が完了したらアクティブなキー入力ハンドルが -1 になるようにしました ) > 3.CheckKeyInput の戻り値 >  本件は要望なのですが SetActiveKeyInput によってアクティブなキーハンドルが非アクティブになった場合、 >  CheckKeyInput から有意な戻り値(たとえば 3 など)を返却するようにしていただく事は可能でしょうか? こちらはとりあえず仕様変更はせず GetActiveKeyInput と組み合わせて対処する感じで・・・ > 4.ReStartKeyInput の挙動 その1 >  ReStartKeyInput を使用すると入力不可のまま DrawKeyInputString が有効になることがあります。 >   [0]をクリックし kih1 をアクティブにする。 → >  何らかの文字を入力 Enter で確定する。 → >  [3]をクリックし kih2 をアクティブにする。 → >  [1]をクリックすると kih1 が入力不可のまま DrawKeyInputString が有効になる。 「入力不可のまま」というのは「アクティブではない」ということでしょうか? 一応 ReStartKeyInput は「入力完了状態」を解除する関数なので、アクティブではなくても DrawKeyInputString で入力中の文字列が描画されるのは仕様となります > 5.ReStartKeyInput の挙動 その2 >  ReStartKeyInput が入力不可時のキー入力を拾ってきます。 >  テストコードによる再現手順は以下の通りです。 >  [0]をクリックし kih1 をアクティブにする。 → >  何らかの文字を入力 Enter で確定する。 → >  そのままさらに何らかの文字を入力する。 → >  [1]をクリックすると kih1 に直前に入力した文字も追加されている。 アクティブにする前に入力した文字が追加されないように修正しました 修正を施したバージョンをこちらにアップしましたので、よろしければご確認ください 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/DxLibGCCTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
Re: MakeKeyInput関係の挙動について ( No.2 )
名前:いっち 日時:2012/02/06 19:09

> > 3.CheckKeyInput の戻り値 > こちらはとりあえず仕様変更はせず GetActiveKeyInput と組み合わせて対処する感じで・・・ 了解しました。 > > 4.ReStartKeyInput の挙動 その1 > 「入力不可のまま」というのは「アクティブではない」ということでしょうか? > 一応 ReStartKeyInput は「入力完了状態」を解除する関数なので、アクティブではなくても > DrawKeyInputString で入力中の文字列が描画されるのは仕様となります すみません、ReStartKeyInput はキーハンドルを非アクティブ->アクティブに変更する関数だと思っていました。 (直前のバージョンではその様な動作になっていたと思います。) キーハンドルの入力完了状態を解除するだけであれば問題ありません。 > > 1.アクティブなキー入力のキャンセル > > 2.GetActiveKeyInput の戻り値 > > 5.ReStartKeyInput の挙動 その2 お疲れ様です。修正確認しました。 対応ありがとうございます。

Page: 1 |