2012-02-04 8 views
0

私は、WTLを使用して、いくつかのトラックバー(別名、同じウィンドウ内のすべてのスライダ)間でフォーカスの変更を追跡しようとしています。WTLを使用していくつかのトラックバー間のフォーカス変更を追跡する方法は?

は、これまでのところ私は成功せず、各スライダーのため MESSAGE_HANDLER(WM_SETFOCUS、FUNC) ならびに1つ COMMAND_HANDLER(IDC_SLIDERn、WM_SETFOCUS、FUNC) を試みました。

msdnのaboutトラックバーコントロールページには、「WM_SETFOCUSはトラックバーウィンドウを再描画します。 ..

編集: 私は今ので、私はスライダーが得親に確認することができ、私はMESSAGE_HANDLERでWM_SETFOCUSを扱う私自身のクラスからスライダーを派生したlParamとしてm_hWndをして、それにメッセージを投稿することで、親ウィンドウを通知してきましたフォーカス。

これは機能しますが、これを行うにはよりエレガントな方法がありますか?

答えて

0

WM_SETFOCUSは、あなたが発見したように、フォーカスを取得する特定のウィンドウに送信され、親には送信されません。

ただし、サブクラス化を避けるために使用できる別のテクニックがあります。ほとんどのコントロール(特にスライダを含む「共通コントロール」)は、特定のイベントが発生したときにWM_NOTIFYを親に送信し、親が子のコレクションに対してこれらのイベントを処理できるようにします。あなたのケースでは

、特に通知IDがNM_SETFOCUSある場合のチェック、親ウィンドウにWM_NOTIFYメッセージを聞いてみてください - MSDNから:

は、コントロールが入力を受信したコントロールの親ウィンドウに通知フォーカス。この通知コードは、WM_NOTIFYメッセージの形式で送信されます。

...あなたが探しているもののように聞こえます。どうやらATLは、のようなものNOTIFY_HANDLERを使用して、メッセージマップでこれらをサポートしています。

NOTIFY_HANDLER(IDC_SLIDERn, NM_SETFOCUS, func) 

Win32のコモンコントロールは通知転送のこの種をサポートしているため、これが動作することを注意します。代わりに他のカスタムコントロールを使用する場合は、これらの通知を受け取らない可能性があり、サブクラス化に頼る必要があります。しかし、一般的なコントロールの場合、これを行うのが最も簡単な方法です。

0

クラスを派生する必要はありません。CContainedWindowTでサブクラス化するだけで問題ありません。

BEGIN_MSG_MAP_EX(CDialog) 
// ... 
ALT_MSG_MAP(IDC_TRACKBAR) 
    MSG_WM_SETFOCUS(OnControlSetFocus) 
    MSG_WM_KILLFOCUS(OnControlKillFocus) 
END_MSG_MAP() 
// ... 
CContainedWindowT<CTrackBarCtrl> m_TrackBar; 
// ... 
CDialog() : 
    m_TitleListView(this, IDC_TRACKBAR) 
// ... 
LRESULT OnInitDialog(HWND, LPARAM) 
{ 
    // ... 
    ATLVERIFY(m_TrackBar.SubclassWindow(GetDlgItem(IDC_TRACKBAR))); 
    // ... 
// ... 
LRESULT OnControlSetFocus(...) { } 
LRESULT OnControlKillFocus(...) { } 
関連する問題