精华内容
下载资源
问答
  • 前言前文介绍的是小说阅读器的设计和实现,本文作为补充对多种翻页模式做详细剖析。正文常见的阅读器翻页模式包括:平移、仿真、滑页和上下:平移:左右滑动;仿真:左右滑动;(纸质书翻页效果)滑页:左右滑动;...

    前言

    前文介绍的是小说阅读器的设计和实现,本文作为补充对多种翻页模式做详细剖析。

    正文

    常见的阅读器翻页模式包括:平移、仿真、滑页和上下:

    平移:左右滑动;

    0773b8c8437c

    仿真:左右滑动;(纸质书翻页效果)

    0773b8c8437c

    滑页:左右滑动;(覆盖效果)

    0773b8c8437c

    上下:上下滑动;

    0773b8c8437c

    1、平移

    UIKit提供UIPageViewController可以很方便实现平移的页面切换效果,使用流程:

    1、创建UIPageViewController;

    self.pageVC = [[UIPageViewController alloc]

    initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll

    navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal

    options:

    @{

    UIPageViewControllerOptionSpineLocationKey:@(UIPageViewControllerSpineLocationMin)

    }];

    self.pageVC.delegate = self;

    self.pageVC.dataSource = self;

    [self addChildViewController:self.pageVC];

    [self.view addSubview:self.pageVC.view];

    2、初始化首个界面;

    - (void)customInitFirstPage {

    UIViewController *vc = [self getRandomVCWithIndex:5];

    [self.pageVC setViewControllers:@[vc]

    direction:UIPageViewControllerNavigationDirectionReverse

    animated:NO

    completion:^(BOOL finished) {

    }];

    }

    3、滑动时返回相邻的界面;

    #pragma mark - UIPageViewControllerDelegate

    - (nullable UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {

    UIViewController *ret;

    UIViewController *vc = viewController;

    if (vc) {

    NSInteger index = vc.view.tag;

    if (index > 0) {

    ret = [self getRandomVCWithIndex:index - 1];

    }

    }

    return ret;

    }

    - (nullable UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {

    UIViewController *ret;

    UIViewController *vc = viewController;

    if (vc) {

    NSInteger index = vc.view.tag;

    if (index < 10) {

    ret = [self getRandomVCWithIndex:index + 1];

    }

    }

    return ret;

    }

    2、仿真

    相对安卓,iOS实现这个翻页效果非常方便——UIPageViewController同样支持这个翻页效果。

    使用流程和平移类似,但多了一些注意事项:

    initWithTransitionStyle:由UIPageViewControllerTransitionStyleScroll变为UIPageViewControllerTransitionStyleScroll;

    支持翻页的时候,对背面做一个自定义展示,需要打开self.pageVC.doubleSided = YES;;

    初始化界面的时候和平移一样,但是在使用过程中再调用-setViewControllers时,如果animated的参数为YES,则需要手动传入两个vc,如下:

    - (void)manualChangePage {

    UIViewController *vc = [self getRandomVCWithIndex:5];

    NSArray *arr;

    if (self.pageVC.doubleSided) {

    BackViewController *backVC = [[BackViewController alloc] init];

    [backVC updateWithViewController:vc];

    backVC.view.tag = vc.view.tag;

    arr = @[vc, backVC];

    }

    else {

    arr = @[vc];

    }

    [self.pageVC setViewControllers:arr

    direction:UIPageViewControllerNavigationDirectionReverse

    animated:YES

    completion:^(BOOL finished) {

    }];

    }

    设置doubleSided为YES之后,每次翻页会调用两次viewControllerAfterViewController或viewControllerBeforeViewController,需要特殊返回一个BackViewController作为背面的VC:

    - (nullable UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {

    UIViewController *ret;

    UIViewController *vc = viewController; // 注意这里不是pageViewController.viewControllers

    if (vc) {

    NSInteger index = vc.view.tag;

    if (index > 0) {

    if ([vc isKindOfClass:BackViewController.class]) {

    ret = [self getRandomVCWithIndex:index - 1];

    }

    else {

    BackViewController *backVC = [[BackViewController alloc] init];

    [backVC updateWithViewController:vc];

    backVC.view.tag = vc.view.tag;

    ret = backVC;

    }

    }

    }

    return ret;

    }

    背面的VC可以添加自定义的view,但通常采用的做法是作为当前界面的镜像(用截图的方式):

    - (UIImage *)captureView:(UIView *)view {

    if ([self checkNullRect:view]) {

    return nil;

    }

    CGRect rect = view.bounds;

    UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0.0f);

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGAffineTransform transform = CGAffineTransformMake(-1.0, 0.0, 0.0, 1.0, rect.size.width, 0.0);

    CGContextConcatCTM(context,transform);

    [view.layer renderInContext:context];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return image;

    }

    增加的-checkNullRect:方法是避免iOS9可能出现的frame为CGRectNull的crash。

    - (BOOL)checkNullRect:(UIView *)view {

    BOOL ret = CGRectIsNull(view.frame);

    for (UIView *subView in view.subviews) {

    ret = ret || [self checkNullRect:subView];

    }

    return ret;

    }

    3、滑页

    滑页没有系统库支持,需要手动实现。

    对前面两种翻页模式进行分析,我们可以发现一些共性,比如说以页(VC)为单位、实时获取界面VC和页面之间有先后顺序等。

    分解UI层的实现,整个动画可以用以下流程来表示:

    1、页面初始化,直接显示页面,监听用户pan手势;

    2、用户pan手势开始,根据方向确定左滑还是右滑,获取新的VC;

    3、处理用户左右滑动,视图跟随用户滑动;

    4、用户pan手势结束,根据动画完成程度确定是补齐动画还是回退;

    5、处理完动画相关,将状态重置为1,接受用户的pan手势;

    如果还要支持tap手势,则自动完成一次动画效果,再将状态重置为status_show(只有在此状态才响应tap的手势)。

    0773b8c8437c

    核心逻辑:

    pan手势开始时,记录点的位置:

    CGPoint point = [rec translationInView:self.view];

    static CGPoint startPoint;

    //手势开始

    if (rec.state == UIGestureRecognizerStateBegan) {

    startPoint = point;

    }

    pan手势触发过程中,先确定方向,再获取对应的VC;然后根据左右滑动,分别改变位置(showVC对应不不动的VC,moveVC跟着pan手势移动):

    //手势进行

    if (rec.state == UIGestureRecognizerStateChanged) {

    if (self.currentStatus == SSReaderPageEffectViewStatusDefault) { // 用户开始移动,此时判断是左移还是右移

    if (point.x >= startPoint.x) { // 右移

    self.currentStatus = SSReaderPageEffectViewStatusMovingToLastPage;

    }

    else {

    self.currentStatus = SSReaderPageEffectViewStatusMovingToNextPage;

    }

    if (self.delegate) {

    if (self.currentStatus == SSReaderPageEffectViewStatusMovingToLastPage) {

    UIViewController *lastVC = [self.delegate slideViewControllerGetLastVC:self];

    if (!lastVC) {

    [rec cancelCurrentGestureReccongizing];

    self.currentStatus = SSReaderPageEffectViewStatusDefault;

    SSLOG_INFO(@"info, reach last end");

    }

    else {

    [self addChildViewController:lastVC];

    [self.view insertSubview:lastVC.view aboveSubview:self.showVC.view];

    self.moveVC = lastVC;

    [self addMaskToVC:self.moveVC];

    }

    }

    else if (self.currentStatus == SSReaderPageEffectViewStatusMovingToNextPage) {

    UIViewController *nextVC = [self.delegate slideViewControllerGetNextVC:self];

    if (!nextVC) {

    [rec cancelCurrentGestureReccongizing];

    self.currentStatus = SSReaderPageEffectViewStatusDefault;

    SSLOG_INFO(@"info, reach next end");

    }

    else {

    [self addChildViewController:nextVC];

    [self.view insertSubview:nextVC.view belowSubview:self.showVC.view];

    self.moveVC = self.showVC;

    self.showVC = nextVC;

    [self addMaskToVC:self.moveVC];

    }

    }

    if (self.currentStatus == SSReaderPageEffectViewStatusMovingToLastPage) {

    [self.delegate slideViewController:self willTransitionToViewControllers:self.moveVC];

    }

    else if (self.currentStatus == SSReaderPageEffectViewStatusMovingToNextPage) {

    [self.delegate slideViewController:self willTransitionToViewControllers:self.showVC];

    }

    }

    }

    if (self.currentStatus == SSReaderPageEffectViewStatusMovingToNextPage) {

    self.moveVC.view.right = self.view.width * (1 - rate);

    }

    else if (self.currentStatus == SSReaderPageEffectViewStatusMovingToLastPage) {

    self.moveVC.view.right = self.view.width * rate;

    }

    }

    pan手势结束时,根据动画完成程度决定是否完成该动作(用animateWithDuration:的动画block来完成);

    注意事项:

    滑页效果通常都需要添加一个阴影效果,可以对showVC进行处理:

    - (void)addMaskToVC:(UIViewController *)vc {

    vc.view.layer.shadowColor = [UIColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:0.8].CGColor;

    vc.view.layer.shadowOffset = CGSizeMake(5, 5);

    vc.view.layer.shadowOpacity = 0.8;

    vc.view.layer.shadowRadius = 6;

    }

    在手势结束的时候,除了根据动画完成程度来判断是否完成该动作外,速度通常也会作为参考值:

    CGPoint speed = [rec velocityInView:rec.view];

    rate = (rate >= kCompleteRate || fabs(speed.x) > 200) ? 1 : 0; // 经验数值,多次尝试得出

    另外一个问题是手势在进行到一半时如果APP切入后台,动画出现暂停的情况。这是因为pan手势在切后台时会自动cancel,所以需要在手势处理增加对cancel状态的处理。

    4、上下滑动

    上下滑动同样没有系统库支持,需要手动实现。

    效果分解:

    1、当用户滑动的过程,视图要跟随手指的移动;

    2、当用户往上滑然后松开时,视图要带有加速度的往上滑动;(附加特性:在滑动过程中用户可以通过重复这个行为加速滑动)

    3、在视图滑动的过程中,用户可以通过简单的tap操作停止交互;

    用户的交互有3种touchBegin/touchMove/touchEnd,上述的三个效果实现如下:

    1、监听touchMove,计算手指的移动距离,换算成view的移动;

    2、touchEnd之后,根据pan手势的移动速度和原来的滑动速度,计算得到滑动的新初始速度;

    3、touchBegin开始,讲当前速度重置为0;

    上述的过程2的处理非常复杂,需要考虑原来的滑动速度,才能实现效果分解中的附加特性。

    通常iOS实现滑动会有两大选择:UIScrollView和UITableView;(UICollectionView和UITableView类似)

    UIScrollView存在一个较大的局限:上面的视图资源无法回收利用,当添加的view过多的时候会占用内存;

    UITableView用cell重复利用规避上面的局限,但是存在新的问题:当数据源(排版数据)变化时,需要频繁调用reloadData,造成性能瓶颈;同时reload会造成contentSize和contentOffset的改变,导致界面可能会出现闪烁,需要各类逻辑的特殊处理。

    综上的分析,这里提供一个基于UIScrollView的方案,避免去手动计算速度,也可以及时回收内存,并且contentSize一直保持不变。

    以下图为例,我们使得UIScrollView的contentSize为(view.width, 3*view.height),偏移contentOffsetY为view.height(初始状态相当于将窗口放置在中间):

    0773b8c8437c

    B是我们创建的第一个vc,大小和UIScrollView的size一样大;当我们向下滑动时,我们创建vcA放在B的上面;

    当我们上滑到vcA完全展示的时候,vcB已经滑动到屏幕外面(红色为窗口大小);此时我们回收vcB,然后将UIScrollView的Y偏移重新改为view.height,回到了初始化状态。

    同理,我们可以处理向上滑动的情况。至此,我们可以不依赖UITableView完成无限视图的滚动,同时避免各类touch事件处理和加速度计算。

    0773b8c8437c

    简单的实现效果

    上图的实现过程非常简短:

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    if (self.scrollView.contentOffset.y >= (self.scrollView.contentSize.height - self.height)) {

    UIView *firstView = [self.viewArr firstObject];

    [self.viewArr removeObjectAtIndex:0];

    firstView.top = self.scrollView.contentSize.height;

    [self.viewArr addObject:firstView];

    for (UIView *view in self.viewArr) {

    view.top -= self.height;

    }

    [self.scrollView setContentOffset:CGPointMake(0, self.scrollView.contentOffset.y - self.height)];

    }

    }

    基于出延伸出来我们的整体流程图:

    0773b8c8437c

    遇到的问题(Q&A):

    Q:如何实现UIScrollView改变offset,但是继承原来的速度?

    A:

    [self.scrollView setContentOffset:CGPointMake(0, self.view.height) animated:NO];

    [self.scrollView setContentOffset:CGPointMake(0, self.view.height);

    上面两个API均可以改变offset,但是-setContentOffset:animated:会使得当前的速度重置为0,使得跨页时滑动不流畅;使用-setContentOffset:可以解决这个问题,仅仅改变offset,并且继承原来的速度接着运动;

    Q: -scrollViewDidScroll:方法怎么会出现递归循环调用?

    A:

    在通过-setContentOffset:改变offset之后,仍会触发-scrollViewDidScroll:的回调,如果在此回调又触发了offset的改变,则进入了递归调用的坑,从下图的堆栈可以看到:

    0773b8c8437c

    解决办法是在设置偏移时,先把delegate取消,修改完成后再赋值回去:

    - (void)safeSetContentOffsetY:(CGFloat)y {

    self.scrollView.delegate = nil;

    [self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, y) animated:NO];

    self.scrollView.delegate = self;

    }

    Q: 滑动到最后一页的时候,没有再往下的VC(返回的nextVC为nil),如果用户没有中断手势继续滑动,如何避免触发再次获取nextVC?

    A:

    当滑动到最后一页的时候,此时没有nextVC,无法接着往下滑,但是因为手势还在,会频繁触发getNextVC的方法。对此可以新增手势取消的方法:

    - (void)cancelCurrentGestureReccongizing {

    // disabled gesture recognizers will not receive touches. when changed to NO the gesture recognizer will be cancelled if it's currently recognizing a gesture

    self.enabled = NO;

    self.enabled = YES;

    }

    Q:滑页效果,在进行到一半时切入后台,如何避免动画出现异常现象?

    A:

    这是因为pan手势在切后台时会自动cancel,所以需要在手势处理增加对cancel状态的处理;

    Q:如果初始化的时候,传进的VC.view不满一屏,该如何处理?

    A:

    手动填充到满屏幕。

    - (void)fullFillContent {

    CGFloat downFillY;

    if (self.viewControllers && self.viewControllers.count > 0) {

    UIViewController *vc = [self.viewControllers lastObject];

    downFillY = vc.view.bottom;

    }

    else {

    downFillY = self.scrollView.contentOffset.y;

    }

    while (downFillY < windowMaxY) {

    if (!self.delegate) {

    NSLog(@"error, empty delegate");

    break;

    }

    UIViewController *vc = [self.delegate scrollViewControllerGetNextVC:self];

    if (!vc) {

    NSLog(@"info, reach next end");

    break;

    }

    [self.vcArr addObject:vc];

    [self addChildViewController:vc];

    [self.scrollView addSubview:vc.view];

    vc.view.top = downFillY;

    downFillY = vc.view.bottom;

    NSLog(@"info, add next vc, frame:%@", NSStringFromCGRect(vc.view.frame));

    }

    }

    总结

    demo地址是在GitHub,包括四种翻页效果,其中的滑页和上下滑动都以参考UIPageViewController的接口做了调整,基本可以直接复制代码进行接入。

    上下滑动的代码不多,但是经过多次尝试再有的定论,中间也换过多次方案,最终优化得到的结论就是demo中的做法。

    阅读器的翻页模式多种多样,欢迎交流新的翻页模式或者其他实现方案。

    展开全文
  • css3实现翻页卡片

    2021-05-21 17:25:38
    The Swift Programming Language-官方教程精译Swift(6)控制流--Control Flow Swift提供了类似C语言的流程控制结构,包括可以多次执行任务的for和while循环,基于特定条件选择执行不同代码分支的if和switch语句,还有...

    Func

    Func, string> getStr = (list) => { var returnStr = ""; if (list.A ...

    socket编程相关的结构体和字节序转换、IP、PORT转换函数

    注意:结构体之间不能直接进行强制转换, 必须先转换成指针类型才可以进行结构体间的类型转换, 这里需要明确的定义就是什么才叫强制转换. 强制转换是将内存中一段代码以另一种不同类型的方式进行解读, 因此转 ...

    利用传感器&lpar;sensor&rpar;实现微信摇一摇动画

    所需要的权限:

    Key&sol;Value之王Memcached初探:二、Memcached在&period;Net中的基本操作 - Edison Chou

    一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...

    使用 AngularJS 和 ReactJS 的经验

    1. React 福音 当我们的团队开始寻找一个合适的前端框架的时候,我们考虑了许多选择,最后留下两个选项 —— Angular 和 React. Angular 是目前为止最成熟的方案:它拥有一个庞 ...

    The Swift Programming Language-官方教程精译Swift(6)控制流--Control Flow

    Swift提供了类似C语言的流程控制结构,包括可以多次执行任务的for和while循环,基于特定条件选择执行不同代码分支的if和switch语句,还有控制流程跳转到其他代码的break和continu ...

    hdu1664 bfs&plus;余数判重

    input n 不超过50个例子,n==0结束输入 Sample Input 7 15 16 101 0 output 最少个不同数字的n的倍数的x,若不同数字个数一样,输出最小的x Sample O ...

    swift UILabel多行显示时 计算UILable的高度(可用于UILable高度自适应)

    代码如下 func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{ let label:UILabel = ...

    【Alpha】第七次Daily Scrum Meeting

    GIT 一.今日站立式会议照片        二.会议内容 1.讨论送礼物的方法和对象,使功能更加完善. 2.对于程序还存在的问题提出自己的看法,尽量让功能更加的饱满. 三.燃尽图 四.遇到的困难 能 ...

    展开全文
  • 已结贴√问题点数:20回复次数:4 c语言编程系统,如何换页显示?case '4': {int n=0, flag; char ch[30]; FILE *fp, *fpIdx;SellTab t;// 定义课程表的结构体变量tSellIdxTab tIdx;// 定义课程索引表的结构体变量...

    已结贴√

    问题点数:20 回复次数:4

    ca56232b3bbedf9a539d07f37fffb99a.gif

    3144d8b7615c79d9f638db40d5689d26.gif

    a218af6549b45ee526caf607ebff1358.gif

    0f8df0e29816ae721419de940fb833d1.gif

    c语言编程系统,如何换页显示?

    case '4': {

    int n=0, flag;    char ch[30];    FILE *fp, *fpIdx;

    SellTab t;      // 定义课程表的结构体变量t

    SellIdxTab tIdx;      // 定义课程索引表的结构体变量tIdx

    if ((fp=fopen(".\\4806SPXX.dat", "rb"))==0) {

    printf("\n\nCannot open COURSE data file!\n");

    break;

    }

    if ((fpIdx=fopen(".\\4806SPXX.idx", "rb"))!=0) flag=1;    // 判断课程文件是否存在索引文件

    else flag=0;

    if (flag) {  // 选择是否利用索引文件进行逻辑排序显示

    do {

    printf("\n\n\n\t\t 逻辑使用索引文件?(y/n): ");

    gets(ch);

    } while (!(ch[0]=='y' || ch[0]=='n' || ch[0]=='Y' || ch[0]=='N'));

    if (ch[0]=='n' || ch[0]=='N') { fclose(fpIdx);  flag=0; }

    }

    system("cls");

    // 在屏幕上列表显示课程信息,首先显示表头信息

    printf("\n电影票编号   排片编号     退票标记   应付/应退金额    座位排    座位号\n");

    printf("\n===============================================================================\n\n");

    if (flag) {  // 存在课程索引文件时,则按课程索引文件中索引项的顺序进行显示——索引可实现逻辑排序

    fread(&tIdx, sizeof(SellIdxTab), 1, fpIdx);   // 从课程索引文件中读取一个课程索引项

    while (!feof(fpIdx)) {    // 列表方式按课程索引文件中索引项的顺序逐行显示课程记录

    fseek(fp, tIdx.offset, SEEK_SET);    // 根据索引项中的位移量在课程文件中定位课程记录

    fread(&t, sizeof(SellTab), 1, fp);   // 从课程文件中读取一个课程记录

    printf("%-11s    ", t.dypnum);

    printf("%-7s    ", t.ppnum);

    printf("  %1d    ", t.refund);

    printf("\t%-2d ", t.money);

    printf("\t\t%-2s  ", t.seatrow);

    printf("\t%-2s    ", t.seatnum); printf("\n");

    n++;

    fread(&tIdx, sizeof(SellIdxTab), 1, fpIdx);   // 从课程索引文件中读取一个课程索引项

    if (n%8==0 || feof(fpIdx)) {    // 换页或列表显示完毕的处理,每页显示20个课程记录

    gotoxy(0,21);

    printf("\n===============================================================================\n\n");

    printf("\t\t 按任意键继续. ");

    system("pause");    // 停下来,按任意键继续,让用户看清屏幕上的显示内容

    system("cls");    // 清屏后重新显示表头信息

    printf("\n电影票编号   排片编号     退票标记   应付/应退金额    座位排    座位号\n");

    printf("\n===============================================================================\n\n");

    }

    }  // 如果显示一屏之后不想继续往下查香,该如何处理?请同学们思考!

    } else {    // 不存在课程索引文件时,则按课程文件中课程记录的顺序进行显示

    fread(&t, sizeof(SellTab), 1, fp);   // 从课程文件中读取一个课程记录

    while (!feof(fp)) {    // 列表方式逐行显示从课程文件中读取的每一个课程记录

    printf("%-11s    ", t.dypnum);

    printf("%-7s    ", t.ppnum);

    printf("  %1d    ", t.refund);

    printf("\t%-2d ", t.money);

    printf("\t\t%-2s  ", t.seatrow);

    printf("\t%-2s    ", t.seatnum); printf("\n");

    n++;

    fread(&t, sizeof(SellTab), 1, fp);   // 从课程文件中读取下一个课程记录

    if (n%8==0 || feof(fp)) {    // 换页或列表显示完毕的处理,每页显示20个课程记录

    gotoxy(0,21);

    printf("\n===============================================================================\n\n");

    printf("\t\t 按任意键继续. ");

    system("pause");    // 停下来,按任意键继续,让用户看清屏幕上的显示内容

    system("cls");    // 清屏后重新显示表头信息

    printf("\n电影票编号   排片编号     退票标记   应付/应退金额    座位排    座位号\n");

    printf("\n===============================================================================\n\n");

    }

    }  // 如果显示一屏之后不想继续往下查香,该如何处理?请同学们思考!

    }

    if (n==0) { printf("\n\n\t\t 没有相关记录.");   system("pause"); }

    fclose(fp);

    if (flag) fclose(fpIdx);

    break;    // 跳出switch语句

    }

    展开全文
  • C语言鼠标操作方法及源码(转载)鼠标的操作是使用dos中断功能,中断号:33h下面给几个操作鼠标的示例,后面有更详细的中断功能说明及代码。 显示鼠标:union REGS regs;regs.x.ax=1;int86(0x33,&regs,&regs); ...

    C语言鼠标操作方法及源码(转载)  鼠标的操作是使用dos中断功能,中断号:33h  下面给几个操作鼠标的示例,后面有更详细的中断功能说明及代码。 显示鼠标:  union REGS regs;  regs.x.ax=1;   int86(0x33,&regs,&regs); 检查是否被按下:  union REGS regs;  regs.x.ax=6;   int86(0x33,&regs,&regs);  返回值在bx寄存器中;   在实际编程中一般要使用循环不断的检验是否被按下! 检验鼠标位置:union REGS regs;  regs.x.ax=3;   int86(0x33,&regs,&regs);  返回值:x坐标在regs.h.cx  y坐标在regs.h.dx  /*下面是各值对鼠标的设置功能*/ (1)、功能00H      功能描述: 初始化鼠标,该操作只需要执行一次   入口参数: AX=00H     出口参数: AX=0000H——不支持鼠标功能,FFFFH——支持鼠标功能 BX=鼠标按钮个数(在支持鼠标功能时)    在支持鼠标功能的情况下,鼠标还被设置如下参数: 1     、 鼠标指针放在屏幕中央  2     、 如果当前鼠标指针是显示的,则操作后,鼠标指针被隐藏 3   、 鼠标指针的显示页为0   4   — —   、 根据屏幕的显示模式显示鼠标指针:文本 反向显示矩形块,图形 尖头形状  5   、 水平象素比=8:8,垂直象素比=16:8   6     、 设置水平和垂直的显示边界为当前显示模式的最大边界 7     、 允许光笔仿真 8   、 双速门槛值=64  (2)、功能01H     功能描述: 显示鼠标指针,通常在鼠标初始化后,用此功能显示其指针  入口参数: AX=01H       出口参数: 无 (3)、功能02H      功能描述: 隐藏鼠标指针,一般在程序结束时,调用此功能   入口参数: AX=02H      出口参数: 无 (4)、功能03H      功能描述: 读取鼠标位置及其按钮状态

    入口参数: AX=03H     出口参数: BX   =按键状态: 位0=1——   按下左键 位1=1——   按下右键 位2=1——   按下中键  ——   其它位 保留,内部使用 CX   =水平位置 DX   =垂直位置 (5)、功能04H      功能描述: 设置鼠标指针位置    入口参数: AX=04H,CX=水平位置,DX   =垂直位置     出口参数: 无 (6)、功能05H      功能描述: 读取鼠标按键信息    入口参数: AX=05H,BX=指定的按键:0—左键,1—右键,2—   中键   出口参数: AX=按键状态,参见功能3H中BX的说明 BX=按键次数  CX=水平位置(最后按键时) DX=垂直位置(最后按键时)  (7)、功能06H      功能描述: 读取鼠标按钮释放信息    入口参数: AX=06H,BX=指定的按键:0—左键,1—右键,2—   中键   出口参数: AX=按键状态,参见功能3H中BX的说明 BX=释放的次数  CX=水平位置(最后释放时)  DX=垂直位置(最后释放时) (8)、功能07H     功能描述: 设置鼠标水平边界   入口参数: AX=07H CX=最小水平位置 DX   =最大水平位置      出口参数: 无,鼠标有可能因新区域变小而自动移进新区域内 (9)、功能08H      功能描述: 设置鼠标垂直边界   入口参数: AX=08H CX=最小垂直位置 DX   =最大垂直位置      出口参数: 无,鼠标有可能因新区域变小而自动移进新区域内 (10)、功能09H      功能描述: 设置图形鼠标形状   入口参数: AX=09H BX=指针的水平位置 CX=指针的垂直位置  ES:DX=16×16     位光标的映象地址 参数说明: (BX,CX)是鼠标的指针在16×16点阵中  的位置,(0,0)是左上角;

    ES:DX指向的存储单元内存放16×16点阵的位映象隐码,紧跟其后的是16×16点阵的光   标掩码。    “ ” 鼠标指针的显示方法: 位映象隐码 逻辑与 上屏幕显示区的内容,然后再用光标掩码内  “ ”   容 异或 前面运算的结果。     出口参数: 无 (11)、功能0AH       功能描述: 设置本文鼠标形状   入口参数: AX=0AH   BX   =光标类型: 0 — CX和DX   的各位含义如下: 位7~0    鼠标指针符号 位10~8    字符前景色 位11    亮度  位14~12    字符背景色 位15    闪烁  1 — CX   =光标的起始扫描线 DX   =光标的结束扫描线      出口参数: 无(12)、功能0BH      功能描述: 读取鼠标移动计数   入口参数: AX=0BH     出口参数: CX —— ——   =水平移动距离:正数 向右移,负数 向左移 DX —— ——   =垂直移动距离:正数 向下移,负数 向上移 (13)、功能0CH       功能描述: 为鼠标事件设置处理程序   入口参数: AX=0CH   CX   =中断掩码 位0=1 ——   鼠标指针位置发送变化 位1=1 ——   按下左按钮 位2=1 ——   释放左按钮 位3=1 ——   按下右按钮 位4=1 ——   释放右按钮 位5=1 ——   按下中间按钮 位6=1 ——   释放中间按钮 位7~15=0 ——   保留  ES:DX   =中断处理程序的地址    在进入中断处理程序时,有关寄存器的值含义: AX   =中断掩码 BX   =按键状态  CX   =鼠标指针的水平位置 DX   =鼠标指针的垂直位置 SI   =水平位置的变化量 DI   =垂直位置的变化量     出口参数: 无 (14)、功能0DH       功能描述: 允许光笔仿真   入口参数: AX=0DH

    .................................................................................

    ?

    6f83fddf9cb9ff6843fffd45e1807199.gif

    其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!

    展开全文
  • 翻页功能的实现

    千次阅读 2017-07-13 19:01:01
    分页条显示 function pageShow(current, totalPage,dataModel){ var start = current - 1; var end = current + 1; var overflow = end - totalPage; if (overflow > 0){ start = start - overflo
  • C语言万年历

    2018-09-25 21:36:23
    武汉某校某进才老师C语言期末考,键盘翻页万年历,非常实用
  • 求0-3000年的年历表 输入年份可打印出12个月的日历,据有翻页功能C语言编写。
  • 读书项目:阅读器翻页功能实现

    千次阅读 2019-03-27 19:19:20
    } else if (time ) { //滑动时间小于500ms 滑动距离大于40,向下翻页 this.nextPage(); } else { this.toggleTitleAndMenu(); } }); } }, mounted() { const fileName = this.$route.params.fileName.split...
  • 华为C语言编程规范(精华总结)

    万次阅读 多人点赞 2020-03-24 09:48:55
    目录 1、代码总体原则 2、头文件 2、函数 3、标识符命名与定义 4、变量 5、宏、常量... 延伸阅读材料: 业界普遍认为一个函数的代码行不要超过一个屏幕,避免来回翻页影响阅读;一般的代码度量工具建议都对此进行检查,...
  • 前言大多数项目都会有“数据列表“这样的功能,而数据量是不可控的,所以必须用页数来控制网页显示的数据量。注:分页的实现方法有很多,本文仅介绍了基础的一种。背景介绍一个最常见的数据列表,作为今天文章的模板...
  • C语言实现文本阅读器

    2012-08-19 15:19:35
    控制台形式的文本阅读器,包含窗体大小,字体、背景颜色(纯色)、阅读速度、书签等功能,通过快捷键来控制阅读状态。 压缩包中包含所有相关联的源代码、库文件、安装文件。 可以右键点击想要阅读的文件,选择使用此...
  • C语言火车自助售票系统,注册,登录,默认初始化管理员admin,密码123456,管理员可以站点增删改查,车次增删改查,途经添加删除,旅客可以车站查询,票价查询,...具有翻页,模糊查询功能。适合新手学习,有详细注释。
  • 推荐答案whoami1978来自团队: 快乐助人2020.04.06采纳率:84%等级:50已帮助:245万人你的这个与系统有关,在windows下可用以下程序#include #include int main(){int n1,n2;char c;c=getch();while(c!...
  • c语言输入esc

    千次阅读 2020-12-21 07:55:39
    C语言及程序设计》实践项目——敲了哪一个键?返回:贺老师课程教学链接【项目2-敲了哪一个键?】在应用中,常需要检测键盘上敲了哪一个键。每个输入的键都对应一个键值(我们熟悉的字母、数字等,键值就是其ASCII...
  • 本考试报名管理是用C语言编写的一款适用于大学生四六级网上报名的的程序。本程序有注册和登陆功能。其中登陆功能又分为普通用户登陆和管理员登陆,详情如下: (1) 普通用户登陆 ○1 用户查看本人信息功能 ○2 ...
  • C语言U1.ppt

    2021-05-23 08:15:02
    程序设计基础 C语言 课程要求 课前请做好预习保持课堂安静 头脑清醒 思维活跃认真 独立 按时完成并提交作业重视上机实践 有效利用宝贵的上机时间 为什么要学习C语言 语言功能强大 表达能力强 生成的目标程序效益高 ...
  • 万年历C语言设计

    2021-05-22 03:15:07
    《万年历C语言设计》由会员分享,可在线阅读,更多相关《万年历C语言设计(11页珍藏版)》请在人人文库网上搜索。1、标准万年历的设计:要求:模仿现实生活中的挂历,能够显示年历、月历、日历,并具备退出功能。当前页...
  • ,,,第一章 C语言概述,,1.1 C语言发展历史 程序设计语言的发展,CPU指令系统,由0、1序列构成的指令码组成 如:10000000 加 10010000 减,用助记符号描述的指令系统 如 ADD A, B,面向机器的语言,程序设计是数据被加工的...
  • C语言学生成绩管理系统详解

    千次阅读 2020-06-07 10:53:22
    引言:最近写了C语言的大作业,感觉做得还行,记录一下,给后人一些参考,给自己留更深印象方便后续改进! 不知道发了这篇博客会不会认为我抄袭…害怕.jpg 一、系统概述 使用单向链表和文件作为基本数据结构,设计一...
  • C语言课程设计

    千次阅读 多人点赞 2021-01-22 21:28:08
    C语言课程设计》任务书 课程设计名称:C语言课程设计(C Language Designing ) 课程设计学分:1学分 课程设计时间:第一学年第1学期 课程设计学时(周数):28学时(1周) 课程设计年级:大一 适用专业:计算机大...
  • C语言万年历设计报告

    2021-05-19 04:51:22
    C语言万年历设计报告》由会员分享,可在线阅读,更多相关《C语言万年历设计报告(14页珍藏版)》请在人人文库网上搜索。1、C 语言课程 设计报告 题目:编写万年历系统编写万年历系统 年级: 专业: 班级: 姓名: ...
  • 分页式存储(C语言实现)

    千次阅读 2020-11-30 19:18:29
    分页式存储(C语言实现) 分段允许进程的物理地址空间是非连续的。分页是提供这种优势的另一种内存管理方案。然而,分页避免了外部碎片和紧缩,而分段不可以。 不仅如此,分页还避免了将不同大小的内存块匹配到交换...
  • 满意答案gxzu71652014.12.21采纳率:42%等级:8已帮助:412人// aa.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #include #include #include void tiangan(int x) {char...
  • 学生管理系统(C语言版)

    千次阅读 多人点赞 2021-10-05 09:36:14
    这个是大一学习C语言的时候做的一个小项目,代码部分基本都是自己一人完成,没用到什么高大上的技术,在图形化方面用了EasyX(一个C++的图形库),其他都是C语言的基础内容。 项目介绍 项目总体功能概览 这个是项目...
  • 当用户按键后,执行相应功能 1.首先将main()函数中定义的一些变量提出来,作为全局变量 不然只有main()函数可以使用,别的函数使用不了 IMAGE background,role, roleY; 2.putimage(100, 500, 93,100,&roleY,0,200,...
  • 《在线考试系统-C语言课程设计》由会员分享,可在线阅读,更多相关《在线考试系统-C语言课程设计(21页珍藏版)》请在人人文库网上搜索。1、课 程 报告 课 程 名 称: 程序设计实践 专 业 班级: 计算机 1306 学 生 ...
  • C语言实现的ls命令源码分享ls 命令将每个由 Directory 参数指定的目录或者每个由 File 参数指定的名称写到标准输出,以及您所要求的和标志一起的其它信息。接下来是小编为大家收集的.C语言实现的ls命令源码分享,...
  • C语言万年历设计报告C语言课程设计报告题目:编写万年历系统第2章 需求分析第3章 概要设计第4章 源程序清单执行结果12)显示当前日月历3)显示具体日期信息第6章 程序问题调试与课程设计心得第1章设计目的设计目的...
  • 滚动条由滚动滑块以及两端的滚动箭头组成, 滚动条的作用是当需要显示的内容超过窗口客户区大小时提供上下/左右的翻页使用户能够完整的阅读显示信息Windows滚动条介绍滚动条由滚动滑块以及两端的滚动箭头组成,滚动条...
  • C语言 程序设计 节日查询和任务提醒系统-万年历参考程序设计报告( 2010 / 2011 学年 第 二 学期)题 目:节日查询和任务提醒系统专 业 光信息科学与技术学 生 姓 名 史明霞,陈苏华,毛胤,张春龙,赵梁班 级 学 号 B...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,532
精华内容 1,012
关键字:

c语言翻页功能

c语言 订阅