Mesoscopic Programming

タコさんプログラミング専門

ヌメロン製作講座第33回:入力改良

修正点

エクセルを使っていて気が付きました。
いちいちセルを選んでリターンキーを押すのはめんどくさい。
そこでエクセルのようにリターンキー押さずにすぐ入力できるようにしました。

ソースファイル
  1. Grid.cpp
  2. Grid.h
  3. main.cpp
  4. main.h
実行ファイル
  1. Numer0n.zip


修正内容

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メッセージでポストします。
ついでにエクセルのようにタブキーが押されたら入力を確定し、次のセルに移動するようにしました。

以上。