2012-02-04 19 views
0

我試圖使用WTL跟蹤幾個TrackBars(又名滑塊,全部在同一個窗口內)之間的焦點變化。如何跟蹤使用WTL的幾個TrackBars之間的焦點更改?

到目前爲止,我已經嘗試了 MESSAGE_HANDLER(WM_SETFOCUS,FUNC) 以及一個 COMMAND_HANDLER(IDC_SLIDERn,WM_SETFOCUS,FUNC) 對於沒有成功每個滑塊。

msdn上的about trackbar controls頁面顯示:「WM_SETFOCUS重新繪製trackbar窗口。」 ..

編輯: 我現在已經來源於我自己的類,我處理WM_SETFOCUS與MESSAGE_HANDLER並用m_hWnd作爲lParam的張貼消息,它通知父窗口中的滑塊,所以我可以在滑塊獲得的父項焦點。

這有用,但有沒有更好的方法來做到這一點?

回答

0

將WM_SETFOCUS發送到獲取焦點的特定窗口,而不是您發現的父窗口。

但是,有一種替代技術可以用來避免子類化;大多數控件(特別是包含滑塊的「通用控件」)會在發生某些事件時向其父母發送WM_NOTIFY消息,從而允許父級爲孩子集合處理這些事件。

在你的情況下,嘗試監聽的父窗口WM_NOTIFY消息,專門爲案件檢查該通知ID爲NM_SETFOCUS - 從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(...) { }