对于在多字节和UNICODE下 MouseMove消息的响应

本文介绍了一种解决在不同字符集环境下MouseMove行为不一致的方法。通过在MouseMove事件中加入鼠标位置变化判断,确保了在UNICODE字符集下也能正确区分鼠标是否移动。
   在编写代码的时候, 用到了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;
}

好了, 解决!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值