具有滚动位置的CScrollView Offset Client Rect

时间:2013-09-11 05:50:58

标签: visual-c++ mfc scroll

我正在尝试编写一个函数,如果当前具有焦点的窗口完全显示在我的CScrollView的客户端矩形中,但是我正在努力弄清楚我做错了什么。这就是我到目前为止所做的:

CWnd * pWnd = pView->GetFocus();
if(pWnd)
{                               
    CRect winRect;
    pWnd->GetWindowRect(&winRect);
    pView->ScreenToClient(&winRect);    //pView is a pointer the CScrollView        

    CRect viewRect;
    pView->GetClientRect(&viewRect);

    CPoint currentScrollPoint = pView->GetScrollPosition();
    viewRect.OffsetRect(currentScrollPoint);

    if(!(viewRect.PtInRect(winRect.BottomRight()) && viewRect.PtInRect(winRect.TopLeft())))
    {
        //Not shown fully
    }
}

任何人都可以看到我在这里做错了或建议更好的方法吗?

1 个答案:

答案 0 :(得分:2)

对上述问题的评论澄清了问题的实际意图:

...when I tab to one that is not shown by the current client rect I want to scroll
to display that `CEdit`...

我发现有两篇文章在MSDN上搜索CFormView scroll tab key

  • first one使用OnCtlColor()检查子窗口是否具有焦点且不在视图中;它使用ScrollToPosition()
  • second one提及ScrollToPosition()在Windows CE中不起作用(这两篇文章都很老了!),检查WM_KEYUP中的标签键的PreTranslateMessage()和使用它自己的ScrollToPos()函数将控件滚动到视图中(本文适用于Windows CE,您需要将wce_GetNextWindow替换为GetNextWindow