ヌメロン製作講座第33回:入力改良
修正点
エクセルを使っていて気が付きました。
いちいちセルを選んでリターンキーを押すのはめんどくさい。
そこでエクセルのようにリターンキー押さずにすぐ入力できるようにしました。
修正内容
WM_CHARメッセージに対応してエディットコントロールを立ち上げるようにしました。
class App(アプリケーションクラス)
VOID App :: OnChar() { focus->OnChar( ( int ) wparam, lparam ); lresult = 0; }
グリッドにイベントを渡すだけです。
class Grid(グリッドクラス)
VOID Grid :: OnChar( int ch, LPARAM lParam ) { Cell * cells = GetCells(); Cell & cell = cells[ select ]; if ( ! IsCapture() && cursor && hctrl == NULL ) { switch ( cell.cid ) { case cellEdit : case cellSetNumber : case cellCallNumber : case cellUpDown : if ( isprint( ch ) ) { OnEditBegin(); if ( hctrl != NULL ) { PostMessage( hctrl, WM_CHAR, ch, lParam ); } } break; } } } BOOL Grid :: OnNmKeyDown( int id, HWND hWnd, UINT vkey ) { if ( hWnd == hctrl ) { ~中略~ else if ( vkey == VK_TAB ) { OnEditEnd(); SelectNext(); return TRUE; } } return FALSE; }
エディットコントロールが立ち上がっていなければ起動して、入力された文字をWM_CHARメッセージでポストします。
ついでにエクセルのようにタブキーが押されたら入力を確定し、次のセルに移動するようにしました。
以上。