随笔-59  评论-36  文章-0  trackbacks-0

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

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理