Mesoscopic Programming

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

Programming Tips #16 ツリービューの余計な警告音を抑止する

あなたはツリービューでアイテムを選択したのち、リターンキーが押されたタイミングで何らかの処理を実施したいのではないのか?
それは極めて自然な発想である。
しかしながら、それを実践するために TVN_KEYDOWN 通知だけで処理しようとすると不要な警告音が鳴るだろう。
その理由は、ツリービューがインクリメンタルサーチに失敗したからである。
もしあなたがリターンキーをインクリメンタルサーチに加えたくないと思うならば、TVN_KEYDOWN 通知に対し非ゼロを返せば良いとヘルプには書いてあるが、実際はそれだけでは警告音は鳴り止まない。
調査したところ、TVN_KEYDOWN 通知に対し非ゼロを返した場合、次にコモンコントロールのキー入力通知が発生するようだ。
リターンキーのみを処理したい場合は、コモンコントロールの NM_RETURN 通知に対応すれば良い。
そして NM_RETURN 通知に対しても非ゼロを返すことで、やっとこさ警告音が鳴らなくなるのである。

LRESULT TreeView :: OnNmReturn()
{
    // ここで必要な処理を行う

    return 1;
}

LRESULT TreeView :: OnTvnKeyDown()
{
    if ( lpnmtvkd->wVKey == VK_RETURN )
    {
        // リターンキーが押されたら NM_RETURN 通知を発生させる

        return 1;
    }

    return 0;
}

必要な処理を行うタイミングはどちらの通知イベントでも構わないと思うが、ヘルプを読むとどうやら TVN_KEYDOWN 通知の方はインクリメンタルサーチを抑止するためのイベントとして用意されているみたいなので NM_RETURN 通知で行う方がエレガントだろう。

以上。