[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[系统相关] 探讨:ECHO;TAB若干退格字符将光标多行回退与窗口列宽的关系

本帖最后由 aa77dd@163.com 于 2016-9-22 16:21 编辑

本论坛有一帖:
批处理将光标退回原点
http://www.bathome.net/redirect. ... ptid=7137&pid=71368

阐述了光标多行回退的一种方式, 并给出了一个回退行数和 退格字符 个数的公式

我在 简体中文 64位 win 7 系统测试, 发现:

1. 在某些列宽 [MODE 命令的 COLS 参数(系统默认值是 80)], 比如 一些对 8 余 1 的数  41, 49, 57, 65, 73, 81,.. 我用某种测试代码没有找到让光标多行回退的方法

2. batman 给出的公式并不适用于一些情况, 只是一些特定情形下可行.

采用
  1. echo;TAB若干退格
复制代码
方式 -- TAB 可以采用连续 2 个或者更多, 但此处暂时只研究 仅 1 个 TAB

当 COLS 对 8 的余数是 1 时, 此处采用的方式不能将光标回退到上面的行

"每多回退一行需退格数" 是一个和 缓冲 区宽度[即 mode 命令的 COLS 参数] 以及光标回退之前的水平坐标[一行的最左边为 0] 都相关的函数
这个函数是 [光标回退之前的水平坐标 对 8 余数] 的增函数;  光标回退之前的水平坐标 以一个半角字符为 1 单位, 全角汉字字符占 2 个单位


当回退之前光标的水平坐标是 0 时, 即在一行的最左边, 或者 水平坐标 对 8 余 0 时
"每多回退一行需退格数" 与 COLS 之间有如下公式:
  1. "每多回退一行需退格数" = ceil ( COLS / 8 )
复制代码
当回退之前光标的水平坐标对 8 不是余 0 时, "每多回退一行需退格数" 需要更大的数字, 计算方式暂不明确

根据上公式可计算得[当回退之前光标的水平坐标是 0 时, 即在一行的最左边, 或者 水平坐标 对 8 余 0 时]:
COLS 在 [82, 88] 范围时, "每多回退一行需退格数" 为 11
COLS 在 [74, 80] 范围时, "每多回退一行需退格数" 为 10
COLS 在 [66, 72] 范围时, "每多回退一行需退格数" 为 9
COLS 在 [58, 64] 范围时, "每多回退一行需退格数" 为 8
...
COLS 在 [18, 24] 范围时, "每多回退一行需退格数" 为 3
...

宽 COLS = 80 时

"回退行0" 指回退到 光标回退之前 的所在行水平坐标 0 位置
"回退行1" 指回退到 "回退行0" 的上 1 行水平坐标 0 位置
"回退行2" 指回退到 "回退行0" 的上 2 行水平坐标 0 位置
"回退行3" 指回退到 "回退行0" 的上 3 行水平坐标 0 位置
...

回退前光标水平坐标[最左位置为0,半角字符占1单位,汉字占两单位]"每多回退一行需退格数""回退行0""回退行1""回退行2""回退行3"
0102122232
1112132435
2132152841
3152173247
4193224160
5253285378
63754279116
774983157231
8103132333
9113142536
10133162942
11154193449
12195244362
13256315681
143794683120
15741791165239
16104142434
17114152637
18135183144
19155203550
20197264564
21259345984
2237135087124
23742599173247
24105152535
25115162738
26136193245
27157223752
28199284766
292511366186
3037175491128
317433107181255
1

评分人数

回复 1# aa77dd@163.com
非常给力啊。那个退格符的数量跟cols的值有密切关系,这个mod8的余数不好发现,我一般都是先上500个退格符直接回到原点,然后echo;下到需要的行去动态显示。或者用SetConsoleCursorPosition实现。
SetConsoleCursorPosition实现的cmd控制台动画最高达到了每秒900帧的更新,而tab+“退格符”实现的帧率也达到每秒100帧,这位控制台游戏的画质提供了极好的支持。

TOP

回复 2# happy886rr


当列宽是对 8 余 1 的数时, batman 给的方法不管用多少退格字符都不能把光标退回上面的行

每回退一行, 可以增加一个固定数量的退格符, 但这个固定的数量是列宽的增函数,

另外, 当前光标所在的位置也影响到 需要多少退格字符,  在行开头和在行中间的某个位置(set /p 可达到) 是不同的, 不能用同样参数计算所需退格符数量

我做了一些测试, 得到一些初步结果, 但想做更多的测试后再贴出来

TOP

返回列表