在编写代码的时候, 用到了MouseMove, 本来是在LbuttonDown后, 才让MouseMove有效, 且移动和不移动是两种结果, 示例代码如下:
BOOL bclick = FALSE, bmove = FALSE;
void MarkBase::OnLButtonDown(UINT nFlags, CPoint point)
{
bclick = TRUE;
}
void MarkBase::OnMouseMove(UINT nFlags, CPoint point)
{
SetFocus();
if(bclick)
{
bmove = TRUE;
}
}
void MarkBase::OnLButtonUp(UINT nFlags, CPoint point)
{
if(bmove)
{
MessageBox(_T("移动"),_T("测试"),MB_ICONINFORMATION);
}
else
{
MessageBox(_T("未移动"),_T("测试"),MB_ICONINFORMATION);
}
bmove = FALSE;
bclick = FALSE;
}
但实际上, 在字符集设置为UNICODE和多字节时, 却是两种结果.
1. 多字节时, 可以按照逻辑工作, 移动鼠标则显示”移动”, 不移动则显示”未移动”.
2. UNICODE时, 不论是否移动鼠标, 都显示为”移动”.
原因是: 当为UNICODE时, 不论鼠标是否有在窗口上移动, 都会有MouseMove消息被发送, 并响应, 而多字节字符集时, 只有当鼠标在窗口上移动时, 才会有MouseMove消息.
判断原因可能是因为Unicode和多字节两者调用库函数的不同而导致的两种机制.
解决方法很简单, 在MouseMove中增加一个鼠标位置的移动判断. 示例代码如下:
BOOL bclick = FALSE, bmove = FALSE;
CPoint ptTemp;
void MarkBase::OnLButtonDown(UINT nFlags, CPoint point)
{
bclick = TRUE;
ptTemp = point; //保存点击时的位置
}
void MarkBase::OnMouseMove(UINT nFlags, CPoint point)
{
SetFocus();
if(bclick)
{
if(ptTemp == point) //当两点一致时, 不改变bmove的值
return;
bmove = TRUE;
}
}
void MarkBase::OnLButtonUp(UINT nFlags, CPoint point)
{
if(bmove)
{
MessageBox(_T("移动"),_T("测试"),MB_ICONINFORMATION);
}
else
{
MessageBox(_T("未移动"),_T("测试"),MB_ICONINFORMATION);
}
bmove = FALSE;
bclick = FALSE;
}
好了, 解决!
本文介绍了一种解决在不同字符集环境下MouseMove行为不一致的方法。通过在MouseMove事件中加入鼠标位置变化判断,确保了在UNICODE字符集下也能正确区分鼠标是否移动。
331

被折叠的 条评论
为什么被折叠?



