我想在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,有什么建議。非常感謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/102534.html
標籤:基礎類
下一篇:opencv擬合平面
