CScrollView的滚动条自动隐藏及滚动条重画

fengshun1028 2017-04-22 12:24:56
我想在ChildFrame窗口中实现CScrollView的一个功能:当鼠标进入某个ScrollView窗口(包括ScrollBar的所有View区域)时,出现滚动条,当鼠标离开这个ScrollView时,滚动条消失。我的CTextView采用了下面的代码,CTextView继承于CSrollView。

void CTextView::OnMouseMove(UINT, CPoint point)
{
CRect rt;
GetClientRect(&rt);
CSize sizeclient, sizebar;
GetTrueClientSize(sizeclient, sizebar);
rt.right = sizeclient.cx; //获取真实的View宽度,包括水平ScrollBar
rt.bottom = sizeclient.cy; //获取真实的View高度,包括竖直ScrollBar

TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_HOVER | TME_LEAVE; //跟踪鼠标的行为
tme.dwHoverTime = 10;
tme.hwndTrack = m_hWnd;

if (!_TrackMouseEvent(&tme))
_cprintf("Track Error!\n");
//判断Point是否在rt的范围内,m_ScrollShow仅为一个标示该View是否显示ScrollBar的标示位
if (rt.PtInRect(point) && m_ScrollShow == FALSE){
CSize temp(400, 500);
SetScrollSizes(MM_TEXT, temp);
m_ScrollShow = TRUE;
return;
}
else if (!rt.PtInRect(point)){
_cprintf("In CTextView::OnMouseMove Hide Bar!!!!!!!!!\n");
CSize temp(0, 0);
SetScrollSizes(MM_TEXT, temp); //让ScrollBar消失,把尺寸变为0
m_ScrollShow = FALSE;
return;
}
return;
}
void CTextView::OnMouseLeave(){
CSize temp(0, 0);
SetScrollSizes(MM_TEXT, temp); //若鼠标离开CTextView,则让ScrollBar的尺寸变为0
m_ScrollShow = FALSE;
return;
}


但是,现在的问题是,当鼠标停留在ScrollBar区域时,程序开始在OnMouseMove和OnMouseLeave间不停的循环,导致ScrollBar不停的闪动,且无法响应鼠标的其他行为(如LButtonDown)。看了一下MFC的viewscrl.cpp的源码,可能原因是MFC默认ScrollBar区域不在ClientRect中,导致当鼠标停留在ScrollBar区域时,系统自动判断鼠标已经离开,触发OnMouseLeave。

我的问题是:1、如何在ScrollView的派生类中实现我上面描述的功能;2、对于在ScrollView派生类中重画ScrollBar,有什么建议。非常感谢!


...全文
154 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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