zoukankan      html  css  js  c++  java
  • MFC对话框水平和垂直滚动条功能

    转载来自:https://blog.csdn.net/zhangchunbo135246/article/details/25234369

    1.Resource View - Dialog - 主程序对话框 - 右键 - 属性 - Horizontal Scroll - true 和VerticalScroll - true;
    2.Message - WM_HSCROLL :OnHScroll回车,跳到.cpp文件添加代码,同理WM_HSCROLL;
    3.添加代码

    void CMyBSplineDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
        // TODO: Add your message handler code here and/or call default
        SCROLLINFO scrollinfo; 
        GetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
        switch (nSBCode) 
        { 
            case SB_LEFT: 
                ScrollWindow((scrollinfo.nPos-scrollinfo.nMin)*10,0); 
                scrollinfo.nPos = scrollinfo.nMin; 
                SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
                break; 
            case SB_RIGHT: 
                ScrollWindow((scrollinfo.nPos-scrollinfo.nMax)*10,0); 
                scrollinfo.nPos = scrollinfo.nMax; 
                SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
                break; 
            case SB_LINELEFT: 
                scrollinfo.nPos -= 1; 
                if (scrollinfo.nPos<scrollinfo.nMin) 
                { 
                    scrollinfo.nPos = scrollinfo.nMin; 
                    break; 
                } 
                SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
                ScrollWindow(10,0); 
                break; 
            case SB_LINERIGHT: 
                scrollinfo.nPos += 1; 
                if (scrollinfo.nPos>scrollinfo.nMax) 
                { 
                    scrollinfo.nPos = scrollinfo.nMax; 
                    break; 
                } 
                SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
                ScrollWindow(-10,0); 
                break; 
            case SB_PAGELEFT: 
                scrollinfo.nPos -= 5; 
                if (scrollinfo.nPos<scrollinfo.nMin) 
                { 
                    scrollinfo.nPos = scrollinfo.nMin; 
                    break; 
                } 
                SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
                ScrollWindow(10*5,0); 
                break; 
            case SB_PAGERIGHT: 
                scrollinfo.nPos += 5; 
                if (scrollinfo.nPos>scrollinfo.nMax) 
                { 
                    scrollinfo.nPos = scrollinfo.nMax; 
                    break; 
                } 
                SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
                ScrollWindow(-10*5,0); 
                break; 
            case SB_THUMBPOSITION: 
                break; 
            case SB_THUMBTRACK: 
                ScrollWindow((scrollinfo.nPos-nPos)*10,0); 
                scrollinfo.nPos = nPos; 
                SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL); 
                break; 
            case SB_ENDSCROLL: 
                break; 
        } 
        Invalidate();    
        CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
    }
    
    
    void CMyBSplineDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
        // TODO: Add your message handler code here and/or call default
        SCROLLINFO scrollinfo;
        GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
        switch (nSBCode) 
        { 
            case SB_BOTTOM: 
                ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMax)*10); 
                scrollinfo.nPos = scrollinfo.nMax; 
                SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
                break; 
            case SB_TOP: 
                ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMin)*10); 
                scrollinfo.nPos = scrollinfo.nMin; 
                SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
                break; 
            case SB_LINEUP: 
                scrollinfo.nPos -= 1; 
                if (scrollinfo.nPos<scrollinfo.nMin)
                { 
                    scrollinfo.nPos = scrollinfo.nMin; 
                    break;
                } 
                SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
                ScrollWindow(0,10); 
                break; 
            case SB_LINEDOWN:
                scrollinfo.nPos += 1; 
                if (scrollinfo.nPos>scrollinfo.nMax) 
                { 
                    scrollinfo.nPos = scrollinfo.nMax; 
                    break; 
                } 
                SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
                ScrollWindow(0,-10); 
                break; 
            case SB_PAGEUP: 
                scrollinfo.nPos -= 5; 
                if (scrollinfo.nPos<scrollinfo.nMin)
                { 
                    scrollinfo.nPos = scrollinfo.nMin; 
                    break; 
                } 
                SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
                ScrollWindow(0,10*5); 
                break; 
            case SB_PAGEDOWN: 
                scrollinfo.nPos += 5; 
                if (scrollinfo.nPos>scrollinfo.nMax) 
                { 
                    scrollinfo.nPos = scrollinfo.nMax; 
                    break; 
                } 
                SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
                ScrollWindow(0,-10*5); 
                break; 
            case SB_ENDSCROLL: 
                // MessageBox("SB_ENDSCROLL"); 
                break; 
                case SB_THUMBPOSITION: 
                // ScrollWindow(0,(scrollinfo.nPos-nPos)*10); 
                // scrollinfo.nPos = nPos; 
                // SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
                break; 
            case SB_THUMBTRACK: 
                ScrollWindow(0,(scrollinfo.nPos-nPos)*10); 
                scrollinfo.nPos = nPos; 
                SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL); 
                break; 
        }
        Invalidate();
        CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
    }

    SCROLLINFO

    typedef struct tagSCROLLINFO
    {
        UINT    cbSize;
        UINT    fMask;
        int     nMin;
        int     nMax;
        UINT    nPage;
        int     nPos;
        int     nTrackPos;
    }   SCROLLINFO, FAR *LPSCROLLINFO;

    cbSize: SCROLLINFO结构长度字节数,该值在设置和查询参数时都必须填写。
    fMask: 指定结构中的哪些成员是有效,该值共有如下5种选择,可以选择多种用“OR”组合起来,该值在设置和查询参数时都必须填写。

    SIF_ALL : 整个结构都有效
    SIF_DISABLENOSCROLL : 该值仅在设定参数时使用,视控件参数设定的需要来对本结构的成员进行取舍。
    SIF_PAGE : nPage成员有效
    SIF_POS : nPos成员有效
    SIF_RANGE : nMin和nMax成员有效

    nMin: 滚动范围最小值
    nMax: 滚动范围最大值
    nPage: 页尺寸,用来确定比例滚动框的大小,一般设置为窗口在宽或高,分别对应用于横向滚动条和竖向滚动条
    nPos: 滚动框的位置
    nTrackPos: 拖动时滚动框的位置,该参数只能查询,不能设置。

    API 及其参数解释

    BOOL SetWindowOrgEx(HDC hdc, int X, int Y, LPPOINT lpPoint);

    该函数用指定的坐标设置设备环境的窗口原点。
    hdc:指向设备环境的句柄。
    X:指定新窗口原点的逻辑X坐标。
    Y:指定新窗口原点的逻辑Y坐标。
    lpPoint:指向POINT结构的指针,先前的窗口原点存放在此结构中,如果lpPoint的值为NULL,则什么也没返回。
    返回值:如果函数调用成功,返回值为非零值,否则为零。

    void ScrollWindow(int xAmount, int yAmount, LPCRECT lpRect = NULL, LPCRECT lpClipRect = NULL);

    XAmount: [in]指定水平滚动的距离,以设备单位计。如果窗口类风格为CS_OWNDC或CS_CLASSDC,则此参数则使用逻辑单位而非设备单位。当向左滚动窗体内容时,参数值必须为负。
    YAmount: [in]指定垂直滚动的距离,以设备单位计。如果窗口类风格为CS_OWNDC或CS_CLASSDC,则此参数则使用逻辑单位而非设备单位。当向上滚动窗体内容时,参数值必须为负。
    lpRect: [in]指向RECT结构的指针,该结构指定了将要滚动的客户区范围。若此参数为NULL,则整个客户区域将被滚动。
    lpClipRect: [in]指向RECT结构的指针,该结构指定了要滚动的裁剪区域。只有这个矩形中的位才会被滚动。在矩形之外的位不会被影响,即使它们是在lpRect矩形之内。假如lpClipRect为NULL,则不会在滚动矩形上进行裁剪。

    BOOL SetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE);

    fnBar:指定被设定参数的滚动条的类型。这个参数可以是下面值,含义如下:
    SB_CTL:设置滚动条控件。而参数hwnd必须是滚动条控件的句柄。
    SB_HORZ:设置所给定的窗体上标准水平滚动条参数。
    SB_VERT:设置所给定的窗体上标准垂直滚动条参数。
    lpsi:指向SCROLLINFO结构。在调用SetScrollInfo之前,设置SCROLLINFO结构中cbSize成员以标识结构大小,设置成员fMask以说明待设置的滚动条参数,并且在适当的成员中制定新的参数值。成员fMask可以为下面所列复合值,含义如下:
    SIF_DISABLENOSCROLL:如果滚动条的新参数使其为没必要,则使滚动条无效而不再移动它。
    SIF_PAGE:设置滚动页码值到由Ipsi指向的SCROLLINFO结构的nPage成员中。
    SIF_POS:设置滚动位置值到由lpsi指向的SCROLLINFO结构的nPos成员中。
    SIF_RANGE:设置滚动范围值到由lpsl指向的SCROLLINFO结构的nMin和nMax成员中。
    fRedraw:指定滚动条是否重画以反映滚动条的变化。如果这个参数为TRUE,滚动条将被重画,否则不被重画。

    BOOL GetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo, UINT nMask = SIF_ALL);
      读取滚动条的信息,数据从lpScrollInfo中返回。各参数意义同SetScrollInfo

  • 相关阅读:
    CentOS 6.9/7通过yum安装指定版本的Nginx
    Ubuntu 16.04安装uafred用于替代Alfred
    Alfred修改内置Terminal为iTerm
    CentOS 6.9下的iptables在本机用DNAT转发指定IP到内网IP无效的问题解决(127.0.0.1)
    Java在Service层异常封装
    Chrome无法播放m3u8格式的直播视频流的问题解决
    Caused by: java.net.UnknownHostException: localhost.localdomain: localhost.localdomain的问题解决
    macOS High Sierra 10.13正式版USB安装盘制作
    Maven打包排除某个资源或者目录
    mybatis实现变量定义,实现sql业务代码
  • 原文地址:https://www.cnblogs.com/Galesaur-wcy/p/14184103.html
Copyright © 2011-2022 走看看