(按我的觀點)一般來講進度條就是用來顯示進度的,也就是說,除了設置進度外,估計不再需要和用戶有什么交互了,但是近來在做一個東西的時候需要完成這樣的功能,就是用進度條顯示文件的讀取進度,并且可以通過雙擊進度條來對文件進行“跳讀”。
對于雙擊進度條,當初心想,添加一個WM_LBUTTONDBLCLK 響應函數就是了,但后來發現進度條中沒有這個消息。于是就想那就在PreTranslateMessage中截獲進度條的WM_LBUTTONDBLCLK 消息,但實驗后發現PreTranslateMessage并不能截到這個消息。
后來在MSDN中對于WM_LBUTTONDBCLICK消息有這么一行文字:
“
Only windows that have the CS_DBLCLKS WNDCLASS style will receive OnLButtonDblClk calls
”。
看到這行文字后,我便認為是進度條的wndclass對象中沒有CS_DBCLKS,經下面代碼確認,證明了我的正確
LONG style = GetClassLong(m_ProcessCtrl.GetSafeHwnd() , GCL_STYLE);
bool val = style & CS_DBLCLKS; // val 為false說明進度條真的沒有CS_DBLCLKS
為了讓進度條可以獲取鼠標雙擊,只需在OnInitDialog中加入如下兩行代碼便可以了:
LONG style = GetClassLong(m_ProcessCtrl.GetSafeHwnd() , GCL_STYLE);
SetClassLong(m_ProcessCtrl.GetSafeHwnd() , GCL_STYLE , style | CS_DBLCLKS );
在PreTranslateMessage中加入
BOOL CDataAnalyzerDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->hwnd == m_ProcessCtrl.m_hWnd && WM_LBUTTONDBLCLK == pMsg->message)
{
if (m_isStartRead)
{
// 計算偏移量
// ........
// ........
m_ProcessCtrl.SetPos(offset);
}
}
return CDialog::PreTranslateMessage(pMsg);
}
有了上面的代碼,問題就解決了。
P.S.:
當然通過繼承一個進度條類,然后在那個派生類中接收WM_LBUTTONDBLCLK也應該是可以的。
posted on 2010-05-06 22:24
zhaoyg 閱讀(654)
評論(0) 編輯 收藏 引用 所屬分類:
MFC學習筆記