2011-12-15 18 views
0

C++アプリケーションでGUIを実行しようとしていますが、キープレスイベントで問題が発生しています。基本的に、すべてのボタンをクリックしない限り(メインウィンドウはキーイベントを登録します)、すべてが正常に機能しますが、ボタンをクリックするとメインウィンドウがフォーカスを失い、キーイベントはキャプチャされなくなります。これは愚かな質問かもしれませんが、私はC++にとって非常に新しいです。これは、私が使用していたコードの一部です:私はまた、私は上をクリックしたときに気づいている子ボタンが押されたときにC++ウィンドウがフォーカスを失う

CreateWindow(TEXT("button"), TEXT("Start"), 
       WS_VISIBLE | WS_CHILD, 
       x, y, width, height, 
       hwnd, (HMENU) 6, NULL, NULL); 

:メインウィンドウの

作成:ボタンのいずれかの

hwnd = CreateWindowEx (
       0,     /* Extended possibilites for variation */ 
       szClassName,   /* Classname */ 
       "Application Name", /* Title Text */ 
       WS_OVERLAPPEDWINDOW, /* default window */ 
       CW_USEDEFAULT,  /* Windows decides the position */ 
       CW_USEDEFAULT,  /* where the window ends up on the screen */ 
       540,     /* The programs width */ 
       250,     /* and height in pixels */ 
       HWND_DESKTOP,  /* The window is a child-window to desktop */ 
       NULL,    /* No menu */ 
       hThisInstance,  /* Program Instance handler */ 
       NULL     /* No Window Creation data */ 
      ); 

の作成をボタンを押すと、WM_KILLFOCUSイベントが発生します。これがフォーカスの問題だと私は思っています。私もWM_KILLFOCUSイベントをキャプチャしようとし、SetActiveWindowで再びフォーカスを設定しましたが、それは私のプログラムをクラッシュさせました。

任意の助けいただければ幸い:)

+0

ボタンはメインウィンドウの一部で、誰がフォーカスを得ていますか?または、ボタンを使用してダイアログを作成していますか?ダイアログのボタンを押すと、ダイアログにフォーカスが移りますか? – PlasmaHH

+0

私はちょうどボタンが付いた1つのメインウィンドウを持っています。私は提供されたコードでウィンドウとボタンを作成しますが、私はダイアログを作成しません。ボタンがクリックされるとボタンにフォーカスが当たっていると仮定しています。 – npinti

+0

私はこれを理解できません:(HMENU)6なぜ必要ですか? –

答えて

2

間違った機能(SetWindowActive)を使用していたことが判明しました。 Assaf Levyの答えは私のために複雑に思え、私はこれを回避する別の方法があると思った。私はそのハンドルを提供することによって任意のウィンドウに焦点を当てるSetFocus関数を見つけることができました。

私がする必要があったのは、必要なコードがWM_COMMANDブロック内で実行されたら、私はSetFocus関数をメインウィンドウのハンドルで呼び出すことでした。これによりメインウィンドウにフォーカスが戻ってイベントを受け取ることができました。

注:SetFocusをWM_KILLFOCUSブロックに配置すると、ボタンやその他のコンポーネントがイベントに反応しなくなります。

+0

短いパス、少ないコード=より良いコードを見つけてうれしいよ:) –

+1

フォーカスをフレームに強制的に戻すということは、ボタンを2回クリックすることができないということです。スペースバーを2回押します。これを行うもっと一般的な方法は、 'IsDialogMessage'技術を並列化することです。あなたはなぜユーザーがそれを置くから離れてフォーカスをヤンクしておく必要がありますか? –

+0

メインウィンドウがフォーカスを失うと、メインウィンドウからキープレスイベントをキャプチャできなくなります。 – npinti

2

これは仕様によるものです。メインウィンドウはwindowですが、ボタンはwindowであり、任意の時点でフォーカスが1つしかないことがあります。ボタンがフォーカスを盗み出さないようにするには、OnFocusハンドラ(または傍受WM_SETFOCUS)を追加してすぐに前のウィンドウにフォーカスを戻します(WPARAMWM_SETFOCUSです)。

簡単なハックは以下のようになります。

  1. hMyButton =のcreateWindow( "ボタン"、...)。
  2. MyButtonProc(HWND、UINT、WPARAM、LPARAM)関数を定義します。
  3. SetWindowLong(hMyButton、GWL_WNDPROC、(LONG)MyButtonProc)を呼び出します。この関数が返す値をg_OldButtonProcに保存します。
  4. MyButtonProc()の内部でWM_SETFOCUSをキャッチし、SetFocus(hMyMainWindow)を呼び出します。 メッセージがWM_SETFOCUSでない限り、MyButtonProc()関数の最後に常にCallWindowProc(h_OldButtonProc、hwnd、msg、...)を返します。

これはトリック(テスト済み)です。

+0

はい、私は基本的に同じ機能がウィンドウとボタンの両方を作成するために使用されているので、私が考えたことです。それ以上の明確化は理解されるだろう:) – npinti

+0

私はそれの周りに道を見つけることができた、C + +のノブである私は私のために少し複雑すぎるあなたの答えを見つけた。しかし、洞察力を提供してくれてありがとう:) – npinti

関連する問題