(一応解決しました。)

最近はEDGE2の動作チェックなどをやっているのですが、また新たな不具合が発生しまして・・・、これがなかなか曲者でして、今まで気が付きませんでしたがなんとEDGE1でも再現します_| ̄|○・・・。

例によってシンプルなプロジェクトファイルと実行ファイルを用意しましたので、もし通りすがった方で良い解決策などをご存知の方がいらっしゃれば、私まで連絡をお願いいたします(という他力本願な日記です)。なお、興味のある方向けに実行ファイルも用意しました。

Visual C++ 6.0 プロジェクトファイル
実行ファイル

概要

今回の不具合は、アクセラレータキー(Ctrl+Zでアンドゥが効くような機構・・・ショートカットキーと呼ぶのが一般的?)が場合によって効かなくなるというものです。

再現手順

  1. 起動する
  2. 「↑(矢印)」キーが「浅い」というコマンドに割り当てられ、「↓」キーが「深い」というコマンドに割り当てられています。
    050414_00

    050414_01

    つまり、「↑」キーを押せば「浅い」が実行され、「↓」キーを押せば「深い」が実行されるというわけです。

  3. では試しに「↑」「↓」キーを押してみてください。
    どちらもコマンドが実行されるとメッセージボックスが表示され、「実行された」という事が目で見て解るようにしてあります。

    どちらのキーでも処理が実行されることを確認してみてください。
    050414_02

  4. ここで、ツールボタン「ONで有効」の凹んでる状態を解除します(OFFになります)
    050414_03

  5. すると、「浅い」や「深い」が無効状態になります(無効状態にしています)。

    メニューを表示し、各コマンドが両方とも使えなくなっていル事を確認してください(必須)
    050414_04

    050414_05

  6. さて、ここで「↑」「↓」キーを押してみてください。

    「浅い」や「深い」は使えない状態ですので、もちろん処理は実行されません。

  7. では、ツールボタン「ONで有効」をもう一度凹まし、ONの状態にしてください。

    050414_06

  8. これで内部的には「浅い」も「深い」も実行可能状態になります。
    (メニューは開かないでください。)

    このまま、「↑」「↓」キーを押してみてください。

    「浅い」は処理されますが、「深い」が処理されません。

    「浅い」位置にあるコマンド(ルートの直下)は使えるのに、
    「深い」位置にあるコマンド(サブメニュー?)は使えないのです。

    これが今回の不具合です。

  9. ちなみに、このあとメニューを開き、「深い」が有効状態になっているのを確認してから「↓」キーを押せば処理されるようになります。

EDGE1の場合・・・

EDGE1の場合は、矢印キーで選択範囲を移動する事が出来るのですが、
選択範囲が無い時点でメニューを見に行き、座標微調整コマンドが無効状態になっているのを確認してから、画像を選択し、矢印キーを押してみると、キーが効かなくなるという不具合が発生します。

考察

まだちょこっとしか調査していませんが、キーアクセラレータ機構については、キー入力系メッセージ(KEYDOWNとか)からTranslateAccelerator APIを通ってコマンド(WM_COMMAND)に変換されるようなのです。
その際にTranslateAcceleratorは、対応するメニューコマンドが無効だとコマンドを送信しない仕様らしいんです(MSDNの資料はこちら)。
だから、MFCのフレームワークで深い位置にあるメニューコマンド状態が更新されないのかなぁなどと推測しています(あんまりWindowsSDKとかメッセージ処理とか詳しくないのでどっかかん違いしていたらごめんなさい)。

仕様なのか不具合なのか、どちらにせよ、便利であるはずのライブラリに時間を取られるのだけは勘弁してほしいです(´・ω・`)ショボーン

#アクセラレータキー処理を自前でやれば問題無しかも?

#今回は矢印キーばかりでしたが、「Ctrl+A」のような感じのキーも同様です

記事検索

アーカイブ