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;
}