积累的VC编程小技巧之滚动条

简介: 1.设置滚动条的滚动大小 创建一个基于CScrollview的SDI Project(在第6步中选CScrollview) 若你已创建了,这步可以省略。 然后: 改为如 void CTestView::OnInitialUpdate() { CScrollView::OnInitialUpdate...

1.设置滚动条的滚动大小

创建一个基于CScrollview的SDI Project(在第6步中选CScrollview) 
若你已创建了,这步可以省略。 
然后: 
改为如 
void CTestView::OnInitialUpdate() 

CScrollView::OnInitialUpdate(); 

CSize sizeTotal; 
// TODO: calculate the total size of this view 
sizeTotal.cx = 1024;  //改这两个 
sizeTotal.cy = 768;   // 
SetScrollSizes(MM_TEXT, sizeTotal); 
}

 

2.滚动条的控制

BOOL CDiagramShowView::PreTranslateMessage(MSG* pMsg)

{

       CFileTreeDoc* pDoc = (CFileTreeDoc*)GetDocument();

       CPoint point = GetScrollPosition();

      

       if(pMsg->message == WM_KEYDOWN)

       {

              switch(pMsg->wParam)

              {

              case VK_LEFT:

                     if( point.x > 10)

                     {

                           EndPoint.x = EndPoint.x - 10;

                           EndPoint.y = EndPoint.y;

                     }

                     else

                     {

                           EndPoint.x = 0;

                           EndPoint.y = EndPoint.y;

                     }

                     ScrollToPosition(EndPoint);

                     InvalidateRect(NULL,TRUE);

                     break;

              case VK_RIGHT:

                     if( point.x < pDoc->intDiagramColumnCount * pDoc->intColumnWidth - 10 )

                     {

                           EndPoint.x = EndPoint.x + 10;

                           EndPoint.y = EndPoint.y;

                     }

                     else

                     {

                           EndPoint.y = pDoc->intDiagramColumnCount * pDoc->intColumnWidth;

                           EndPoint.x = EndPoint.x;

                     }

                     ScrollToPosition(EndPoint);

                     InvalidateRect(NULL,TRUE);

                     break;

              case VK_UP:

                     if( point.y > 10)

                     {

                           EndPoint.y = EndPoint.y - 10;

                           EndPoint.x = EndPoint.x;

                     }

                     else

                     {

                           EndPoint.y = 0;

                           EndPoint.x = EndPoint.x;

                     }

                     ScrollToPosition(EndPoint);

                     InvalidateRect(NULL,TRUE);

                     break;

              case VK_DOWN:

                     if( point.y < pDoc->intDiagramRowCount * pDoc->intRowHeight - 10 )

                     {

                           EndPoint.y = EndPoint.y + 10;

                           EndPoint.x = EndPoint.x;

                     }

                     else

                     {

                           EndPoint.y = pDoc->intDiagramRowCount * pDoc->intRowHeight;

                           EndPoint.x = EndPoint.x;

                     }

                     ScrollToPosition(EndPoint);

                     InvalidateRect(NULL,TRUE);

                     break;

              default:

                     break;

              }

       }

       return FALSE;

}

 

 

// 通过正负号判断是向上还是向下滚动

if(zDelta==120) 

向上滚动
if(zDelta==-120)
向下滚动

 

BOOL CDiagramShowView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)

{

       CFileTreeDoc* pDoc = (CFileTreeDoc*)GetDocument();

       CPoint point = GetScrollPosition();

      

       if(zDelta==120)

       {

              if( point.y >= 20 )

              {

                     EndPoint.x = point.x;

                     EndPoint.y = point.y;

                    

                     EndPoint.x = EndPoint.x;

                     EndPoint.y = EndPoint.y - 20;

              }

              else

              {

                     EndPoint.x = EndPoint.x;

                     EndPoint.y = 0;

              }

       }

      

       if(zDelta==-120)

       {

              if( point.y <= pDoc->intDiagramRowCount * pDoc->intRowHeight - 20 )

              {

                     EndPoint.x = point.x;

                     EndPoint.y = point.y;

                    

                     EndPoint.x = EndPoint.x;

                     EndPoint.y = EndPoint.y + 20;

              }

              else

              {

                     EndPoint.x = EndPoint.x;

                     EndPoint.y = EndPoint.y;

              }

       }

      

       ScrollToPosition(EndPoint);

       InvalidateRect(NULL,TRUE);

       return CScrollView::OnMouseWheel(nFlags, zDelta, pt);

}

 

3.给从CWnd派生的窗口添加滚动条

ModifyStyle(0,WS_VSCROLL);

 

4.如何用键盘滚动分割的视口

我的问题是当我用鼠标滚动分割窗口时,视口滚动都很正常,但用键盘时,却什么也没有发生.

在你的视图继承类中加入如下两个函数,假定该类为CScrollerView:

void CScrollerView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
        BOOL processed;
        for (unsigned int i=0;i< nRepCnt&&processed;i++)
                processed=KeyScroll(nChar);
        if (!processed)
           CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
}

BOOL CScrollerView::KeyScroll(UINT nChar)
{
        switch (nChar)
                {
                case VK_UP:
                        OnVScroll(SB_LINEUP,0,NULL);
                        break;
                case VK_DOWN:
                        OnVScroll(SB_LINEDOWN,0,NULL);
                        break;
                case VK_LEFT:
                        OnHScroll(SB_LINELEFT,0,NULL);
                        break;
                case VK_RIGHT:
                        OnHScroll(SB_LINERIGHT,0,NULL);
                        break;
                case VK_HOME:
                        OnHScroll(SB_LEFT,0,NULL);
                        break;
                case VK_END:
                        OnHScroll(SB_RIGHT,0,NULL);
                        break;
                case VK_PRIOR:
                        OnVScroll(SB_PAGEUP,0,NULL);
                        break;
                case VK_NEXT:
                        OnVScroll(SB_PAGEDOWN,0,NULL);
                        break;
                default:
                        return FALSE; // not for us
                             // and let the default class
                             // process it.
                }
   return TRUE;
}

 

目录
相关文章
|
人工智能 NoSQL atlas
生成式AI入门必读:基本概念、数据挑战与解决方案
许多企业正在选择MongoDB Atlas。其原生向量搜索功能,加上统一的 API 和灵活的文档模型,对于寻求通过 RAG 方法提取专有数据来增强 LLM 的企业来说,是一个有吸引力的选择。
3797 4
|
存储 Kubernetes 数据安全/隐私保护
k8s对接ceph集群的分布式文件系统CephFS
文章介绍了如何在Kubernetes集群中使用CephFS作为持久化存储,包括通过secretFile和secretRef两种方式进行认证和配置。
492 5
|
JavaScript iOS开发 开发者
pnpm的安装与配置(Windows/macOS)
pnpm的安装与配置(Windows/macOS)
3181 0
|
网络安全 开发工具 数据安全/隐私保护
如何把 ipa 文件 (iOS 安装包) 安装到 iPhone 手机上? 附方法汇总
如何把 ipa 文件 (iOS 安装包) 安装到 iPhone 手机上? 附方法汇总
|
自然语言处理 算法 搜索推荐
TF-IDF、TextRank关键字抽取排序算法
TF-IDF称为词频逆文本,结果严重依赖文本分词之后的效果。其公式又可以分成词频(Term Frequency,TF)的计算和逆文档概率(IDF)的计算。
378 0
|
SQL druid Java
Spring Boot 2.x基础教程:默认数据源Hikari的配置详解
Spring Boot 2.x基础教程:默认数据源Hikari的配置详解
3069 0
|
Kubernetes 网络协议 Docker
配置Pod的liveness和readiness探针
当你使用kuberentes的时候,有没有遇到过Pod在启动后一会就挂掉然后又重新启动这样的恶性循环?你有没有想过kubernetes是如何检测pod是否还存活?虽然容器已经启动,但是kubernetes如何知道容器的进程是否准备好对外提供服务了呢?让我们通过kuberentes官网的这篇文章Configure Liveness and Readiness Probes,来一探究竟。
2021 0
|
Android开发
Android APK 文件自动安装
1、权限   2、方法 Uri uri = Uri.fromFile(new File("/sdcard/temp.apk")); //这里是APK路径 Intent intent = new Intent(Intent.
815 0
|
1天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1063 0
|
10天前
|
人工智能 运维 安全