VC对话框实现垂直滚动效果

1.修改滚动的范围,设置nMax的值,此处设置为3倍窗口高度。

    CRect rc;
    GetClientRect(&rc);
    SCROLLINFO si = {sizeof(SCROLLINFO)};
    si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
    si.nPos = si.nMin = 1;
    si.nMax = rc.Height() * 3;
    si.nPage = rc.Height();
    SetScrollInfo(SB_VERT, &si, FALSE);

2.对话框添加WM_VSCROLL消息响应函数.

    void CPrintDlgAppDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
        SetVScrool(SB_VERT, nSBCode);

        CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
    }

3.代码中添加以下3个辅助函数

    void CPrintDlgAppDlg::ScrollClient(int nBar, int nPos)
    {
        static int s_prevx = 1;
        static int s_prevy = 1;  

        int cx = 0;
        int cy = 0;  

        int& delta = cy;
        int& prev = s_prevy;

        delta = prev - nPos;
        prev = nPos;  

        if(cx || cy)
        {
            ScrollWindow(cx, cy, NULL, NULL);
        }
    }  

    int CPrintDlgAppDlg::GetScrollPos(int nBar, UINT nSBCode)
    {
        SCROLLINFO si;
        si.cbSize = sizeof(SCROLLINFO);
        si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS;
        GetScrollInfo(nBar, &si);  

        const int minPos = si.nMin;
        const int maxPos = si.nMax - (si.nPage - 1);  

        int result = -1;  

        switch(nSBCode)
        {
        case SB_LINEUP /*SB_LINELEFT*/:
            result = max(si.nPos - 1, minPos);
            break;
        case SB_LINEDOWN /*SB_LINERIGHT*/:
            result = min(si.nPos + 1, maxPos);
            break;
        case SB_PAGEUP /*SB_PAGELEFT*/:
            result = max(si.nPos - (int)si.nPage, minPos);
            break;
        case SB_PAGEDOWN /*SB_PAGERIGHT*/:
            result = min(si.nPos + (int)si.nPage, maxPos);
            break;
        case SB_THUMBPOSITION:
            // do nothing
            break;
        case SB_THUMBTRACK:
            result = si.nTrackPos;
            break;
        case SB_TOP /*SB_LEFT*/:
            result = minPos;
            break;
        case SB_BOTTOM /*SB_RIGHT*/:
            result = maxPos;
            break;
        case SB_ENDSCROLL:
            // do nothing
            break;
        }  

        return result;
    }  

    void CPrintDlgAppDlg::SetVScrool(int nBar, UINT nSBCode)
    {
        const int scrollPos = GetScrollPos(nBar, nSBCode);  

        if(scrollPos == -1)
            return;  

        SetScrollPos(nBar, scrollPos, TRUE);
        ScrollClient(nBar, scrollPos);
    }
时间: 2024-10-29 12:58:58

VC对话框实现垂直滚动效果的相关文章

无缝不间断图片垂直滚动效果

无缝不间断图片垂直滚动效果: 垂直滚动效果虽然使用频率没有水平滚动高,不过也有大量的使用,例如垂直滚动的友情链接效果,下面就结合实例简单介绍一下如何实现此效果,代码实例如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /&g

Android 公告新闻消息资讯之垂直滚动效果

垂直滚动新闻栏的实现原理: 就是一个自定义的LinearLayout,并且textView能够循环垂直滚动,而且条目可以点击,显示区域最多显示2个条目,并且还有交替的属性垂直移动的动画效果,通过线程来控制滚动的实现. ................................................... 自定义属性: <style name="AppTheme" parent="@android:style/Theme.Light.NoTitleBar&

jquery文字垂直滚动代码实例

jquery文字垂直滚动代码实例: 文字垂直滚动效果在大量网站都有应用,尤其在新闻公告或者新闻列表之类形式的功能结构中出现. 代码实例如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.51texiao.cn/" /> <title>蚂

[Swift通天遁地]九、拔剑吧-(14)创建更美观的景深视差滚动效果

景深视差经常被应用在游戏项目中. 本文将演示创建更美观的景深视差滚动效果. 首先确保已经安装了所需的第三方类库.双击查看安装配置文件[Podfile] 1 platform :ios, '12.0' 2 use_frameworks! 3 4 target 'DemoApp' do 5 source 'https://github.com/CocoaPods/Specs.git' 6 pod 'Presentation' 7 end 根据配置文件中的相关设置,安装第三方类库. 安装完成之后,双击

页面滚动显示或隐藏元素Headroom.js插件帮助你实现滚动效果

Headroom.js 是什么? Headroom.js 是一个轻量级.高性能的JS小工具(不依赖任何工具库!),它能在页面滚动时做出响应.此页面顶部的导航条就是一个鲜活的案例,当页面向下滚动时,导航条消失,当页面向上滚动时,导航条就出现了. Headroom.js 有什么用? 固定页头(导航条)可以方便用户在各个页面之间切换.但是这也会带来些问题…本文原创博客地址:http://www.cnblogs.com/unofficial官网地址:www.pushself.com) 大屏幕一般都是宽度

VC++实现位图显示透明效果--实现原理

我们在进行程序的界面设计时,常常希望将位图的关键部分,也既是图像的前景显示在界面上,而将位图的背景隐藏起来,将位图与界面很自然的融合在一起,本文介绍了透明位图的制作知识,并将透明位图在一个对话框中显示了出来.本文所使用的原始位图及程序编译运行后的界面效果如下图所示: 图一.原始位图 图二.对话框界面上透明显示位图 一.实现方法 绘制"透明"位图是指绘制某一位图中除指定颜色外的其余部分,我们称这种颜色为"透明色".通过将位图的背景色指定为"透明色"

javascript文字垂直滚动代码

javascript文字垂直滚动代码: 垂直滚动代码大多用于网站的新闻公告或者友情链接还有图片展示之类的功能结构,下面就介绍一个上下垂直滚动的新闻类的代码. 代码实例如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.51texiao.cn/" />

文字上下滚动效果

案例: 第一种:直接用<marquee></marquee>   最终效果可以实现,但是据说用户效果不好(我不知道原因) HTML代码: ◎ direction   表示滚动的方向,值可以是left,right,up,down,默认为left ◎ behavior   表示滚动的方式,值可以是scroll(连续滚动)slide(滑动一次)alternate(往返滚动) ◎ loop   表示循环的次数,值是正整数,默认为无限循环 ◎ scrollamount   表示运动速度,值是

Xslider演示8种滚动效果

Xslider演示8种滚动效果包括: 一.左右切换:每次移动固定距离 二.左右切换:最后一个显示在最右侧 三.自动切换 四.循环切换 五.文本的上下滚动 六.上下切换 七.上下自动循环切换 在线预览 下载地址 在线实例 <h2>七.上下自动循环切换</h2> <div class="newslistwraper"> <div class="newslist"> <ul> <li>日本通过防卫大纲