CScrollView嵌入对话框中无法响应WM_MOUSE WHEEL 消息

时间:2022-01-23 18:11:50

1:问题描述:当使用CScrollView来显示图像时,往往需要将它嵌入到对话框中,当嵌入对话框之后,显示图像,使用放大镜查看图像时,发现使用WM_MOUSE WHEEL消息来放大和缩小放大镜,结果消息未响应

2:分析原因:跟着调试发现,CScrollView嵌入对话框后,滚动鼠标滚轮,发现响应的是对话框的滚轮滚动消息处理,而为进入CScrollView的消息中去,分析原因是有可能鼠标发出的滚轮消息未被CScrollView所接收,未被接收而被其它窗口接收,说明当前获得焦点的窗口并非是CScrollView,因此可以分析出是CScrollView为获得焦点导致的。

3:解决方法:根据上面分析的原因,可以推测出只要有办法在使用滚轮消息前,使CScrollView获得焦点,即可解决问题,经过跟踪发现,当鼠标移动到CScrollView视图区域时,CScrollView的OnMouseMove,OnLButtonDown等消息处理函数都能响应,因此只需要再这些函数执行时,使CScrollView获得焦点。使用获得焦点函数this->SetFocus();即可

4:示例代码:

class CDisPlayImageView : public CScrollView
{

..............................

 afx_msg void OnMouseMove(UINT nFlags, CPoint point);
 afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
};

void CDisPlayImageView::OnMouseMove(UINT nFlags, CPoint point)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
  this->SetFocus();//当鼠标进入时获得焦点

 CScrollView::OnMouseMove(nFlags, point);
}

BOOL CDisPlayImageView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值

//再此添加滚轮消息响应处理

 return CScrollView::OnMouseWheel(nFlags, zDelta, pt);
}