(按我的观点)一般来讲进度条就是用来显示进度的,也就是说,除了设置进度外,估计不再需要和用户有什么交互了,但是近来在做一个东西的时候需要完成这样的功能,就是用进度条显示文件的读取进度,并且可以通过双击进度条来对文件进行“跳读”。
对于双击进度条,当初心想,添加一个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 阅读(640)
评论(0) 编辑 收藏 引用 所属分类:
MFC学习笔记