关于MFC中滚动条的参悟

 int iHeight = GetSystemMetrics(SM_CYSCREEN);//获取屏幕高度的分辨率

    CRect rect1;

    GetClientRect(rect1);//获取要客户区位置信息(呈现数据矩形框)

 

    SCROLLINFO scrollInfo;         

    GetScrollInfo(SB_VERT,   &scrollInfo,   SIF_ALL); //获取进度条当前信息,因为要考虑滚动条滚动到一半,然后对界面放大,滚动条仍然要处在正确的位置,此处获取的是放大或缩小前的滚动条信息。

 

    SCROLLINFO info;

    info.cbSize = sizeof(SCROLLINFO);    

    info.fMask = SIF_ALL;    

    info.nMin = 0;    

    info.nMax = 2*iHeight-rect1.Height(); //图形的总高度为2* iHeight,在初始界面显示时已经占据了rect1.Height()。滚动条可以活动的最大高度为2*iHeight-rect1.Height()。

    info.nPage = 1;//每单位移动一个像素点    

    info.nPos = (scrollInfo.nPos*(2*iHeight-rect1.Height()))/scrollInfo.nMax; 

//计算放大或缩小后的滚动位置,scrollInfo.nPos(原始位置)除以scrollInfo.nMax(原始最大位置),得到原始位置中滚动条所占的比例,乘以(2*iHeight-rect1.Height())(当前最大位置)得到在新界面中滚动条所在的位置。

    SetScrollInfo(SB_VERT,&info,SIF_ALL);//设置滚动条信息

    ScrollWindow(0,  -1*info.nPos);//滚动客户区界面,滚动条向下走,第二个值要取负数。

 

按比例放大或缩小:

在.h文件中定义POINT oldPiont;

在OnInitDialog函数中计算当前客户区的宽度和高度。

 CRect rect;
 GetClientRect(&rect);
 oldPiont.x = rect.right - rect.left;
 oldPiont.y = rect.bottom - rect.top;

在界面尺寸发生变化时在OnSize(UINT nType, int cx, int cy)函数中调用如下代码:

 

    float fsp[2];
        POINT newPoint;//获取当前对话框大小
        CRect newRect;//获取当前对话框的坐标
        GetClientRect(&newRect);
        newPoint.x = newRect.right - newRect.left;
        newPoint.y = newRect.bottom - newRect.top;
        fsp[0] = (float)newPoint.x / oldPiont.x;
        fsp[1] = (float)newPoint.y / oldPiont.y;

        int woc;
        CRect rect;
        CPoint oldTLPoint, newTLPoint;//左上角
        CPoint oldBRPoint, newBRPoint;//右下角
        //列出所有的子空间
        HWND hwndChild = ::GetWindow(m_hWnd, GW_CHILD);
        while (hwndChild) {
            woc = ::GetDlgCtrlID(hwndChild);//取得ID


            GetDlgItem(woc)->GetWindowRect(rect);

            ScreenToClient(rect);

            oldTLPoint = rect.TopLeft();
            newTLPoint.x = long(oldTLPoint.x*fsp[0]);
            newTLPoint.y = long(oldTLPoint.y*fsp[1]);
            oldBRPoint = rect.BottomRight();
            newBRPoint.x = long(oldBRPoint.x*fsp[0]);
            newBRPoint.y = long(oldBRPoint.y*fsp[1]);

            rect.SetRect(newTLPoint, newBRPoint);

            GetDlgItem(woc)->MoveWindow(rect, TRUE);
            hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
        }
        oldPiont = newPoint;


 

 

posted @ 2019-06-17 17:06  soft_myl  阅读(1077)  评论(0编辑  收藏  举报