响应WM_MOUSEWHEEL消息的问题

vc_xiaocainiao 2008-09-07 08:08:31
我在基于对话框的类中重载PreTranslateMessage()以为自己处理一些消息,

加了兰色段,是在用来捕捉鼠标滑轮的消息,可是我发现这个消息好象只是在鼠标滑轮启动的一瞬间产生这个消息,那我的鼠标滑轮什么时候结束也无法判断,也既是说本次鼠标滑轮滚了多少圈也不知道,这样不符合我需求,,我需要知道鼠标滑轮什么时候结束滚动,或者只要还在滚动我都能捕获到消息,该怎么做???
BOOL CConditionSearch::PreTranslateMessage(MSG* pMsg)
{
switch (pMsg->message)
{
case WM_MOUSEWHEEL:
if(((CWnd *)GetFocus())->GetDlgCtrlID() == IDC_RICHEDIT_FILECONTENT)
{
AssociateFileLine(-1);
}
break;


case WM_KEYDOWN:
case WM_CHAR:
switch( pMsg->wParam )
{
case 'f':
case 'F':
if(GetKeyState(VK_CONTROL) & 0xFF00)
{
AfxMessageBox( "group ctrl + f key" ) ;
return TRUE;
}
break;

default:
break;
}
break;

default:
break;
}

return CDialog::PreTranslateMessage(pMsg);
}
...全文
1619 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Show_Mike 2008-09-08
  • 打赏
  • 举报
回复
MFC中处理WM_MOUSEWHEEL消息的函数
afx_msg BOOL OnMouseWheel( UINT nFlags, short zDelta, CPoint pt );
其中参数zDelta就是关于鼠标滚轮的转动参数,一般设为120,pt给出光标所在位置坐标.


vc_xiaocainiao 2008-09-08
  • 打赏
  • 举报
回复
楼兄这样的解释,难道是因为我的这个函数AssociateFileLine(-1);太长,造成执行时间太久,以致于我的本次鼠标滚动结束了,这个函数才执行完吗??

可是我的这个函数也不是很长呀,不过有设计到画界面,不知道是否很耗费界面时间,,

为了证明楼兄的说法,刚刚做了一个变量去测试,通过一个变量去计数WM_MOUSEWHEEL消息产生了多少次,发现的确跑了很多次,而AssociateFileLine(-1);
函数也跑了很多次数,但是发现我的界面刷新还是有点不匹配,下面他贴一下代码,请帮看一下,如何解决这个问题呢??
BOOL CConditionSearch::AssociateFileLine(int unRow)
{
CListCtrl *pListNumber = ((CListCtrl *)GetDlgItem(IDC_LIST_LINENUMBER));//IDC_LIST_LINENUMBER界面上CListCtrl控件ID,想
//用来显示行号
CRichEditCtrl *pRichFile = ((CRichEditCtrl *)GetDlgItem(IDC_RICHEDIT_FILECONTENT));//IDC_RICHEDIT_FILECONTENT界面
//CRichEditCtrl控件ID
int unLineMax = pRichFile->GetLineCount();//取得IDC_RICHEDIT_FILECONTENT内容的行数
int unIndex = 0;
CString sLine;
int unRowStart = 0, unRowEnd = MAX_LISTCTRL_LINES;//MAX_LISTCTRL_LINES == 80

unRowStart = pRichFile->GetFirstVisibleLine();//抓出IDC_RICHEDIT_FILECONTENT当前显示区域第一行位于第几行
pListNumber->DeleteAllItems();//删除IDC_LIST_LINENUMBER上次留下的内容

while(unIndex < unRowEnd)//总共画80次,即80行,
{
pListNumber->SetTextBkColor(RICHEDIT_BGCOLOR);//IDC_LIST_LINENUMBER中设置画每一行行号时的背景色
sLine.Format(_T(" %04d: "),unIndex + unRowStart);//计算行号代表的字符串
pListNumber->InsertItem(unIndex,sLine);//IDC_LIST_LINENUMBER中显示当前的行号
if((unRow == (unRowStart + unLineMax)) && (unRow != -1))
{//unRowStart为IDC_RICHEDIT_FILECONTENT中为初体显示内容的行号,它在行号区域画两个行号
unIndex++;
sLine.Format(_T(" %04d: "),unIndex + unRowStart);
pListNumber->InsertItem(unIndex,sLine);
}
unIndex++;
}

return TRUE;
}

上面的函数代码我解释了一下,我现在的问题就是,比如IDC_LIST_LINENUMBER当前第一行为125行,假如我向下滚动一次鼠标,结束后发现IDC_LIST_LINENUMBER显示的行号与IDC_RICHEDIT_FILECONTENT不一致,比如IDC_RICHEDIT_FILECONTENT显示区的第一行已经是160行了,而IDC_LIST_LINENUMBER的第一行才画第140行.我需要再次把鼠标点击一次IDC_RICHEDIT_FILECONTENT,此时重新调用一次
AssociateFileLine(),才能使IDC_LIST_LINENUMBER显示的行号跟IDC_RICHEDIT_FILECONTENT实际行号一致.(因为我在EN_SELCHANGE消息中有去调用AssociateFileLine()实现光标键的移动来实现行号和内容一致,鼠标点进IDC_RICHEDIT_FILECONTENT会激活EN_SELCHANGE这个消息,从而执行AssociateFileLine())

以上请大家帮帮我呀,,解决了继续加分..感谢
编程夜猫 2008-09-08
  • 打赏
  • 举报
回复
WM_MOUSEWHEEL触发WM_VSCROLL就行,界面的处理,画图呀,还是在WM_PAINT比较好
vc_xiaocainiao 2008-09-08
  • 打赏
  • 举报
回复
我解决问题了,,原因是我采用的是RichEdit 控件,RichEdit 控件要响应这些消息需要在OnInitDialog()内先调用SetEventMask()enable这些消息

pRichCtrl->SetEventMask(pRichCtrl->GetEventMask()|ENM_SELCHANGE|ENM_SCROLL|ENM_UPDATE );

不过还是非常谢谢大家帮我提供思路,给大家在加10分分享一下。。
schlafenhamster 2008-09-08
  • 打赏
  • 举报
回复
有焦点的控件才响应WM_MOUSEWHEEL
blz_wowar 2008-09-08
  • 打赏
  • 举报
回复
2楼的回答是对的,
补充一些:滚轮滚动,只要卡口卡到一次,WM_MOUSEWHEEL就会发一次出来,若卡口没卡到,那不会有这个消息,至于每次滚动的大小,你可以看看MSDN的文档,delta默认是120个单位。
vc_xiaocainiao 2008-09-08
  • 打赏
  • 举报
回复
我按照楼上的方法通过向导加OnMouseWheel()消息后,设置断点,没有反应,没有响应这个消息,不知道为什么?

然后我又对一个RichEdit控件通过向导加入EN_VSCROLL消息,设置断点,发现也没有反应,,

是不是说在初始化对话框时需要类似pRichCtrl->SetEventMask(pRichCtrl->GetEventMask()|ENM_SELCHANGE);之后才能响应
EN_SELCHANGE这样的消息呀???
zhoujianhei 2008-09-07
  • 打赏
  • 举报
回复
WM_MOUSEWHEEL:

只要鼠标滚动就会产生这个消息。
THCNC 2008-09-07
  • 打赏
  • 举报
回复
直接响应对话框的WM_MOUSEWHEEL消息呢?
BOOL CConditionSearch::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: Add your message handler code here and/or call default

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

可以知道哪个方向滚。
滚多少圈,不好得知吧!

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧