c语言光标移动



1.引入

作为一个C语言入门者,刚开始编写程序时,都使用控制台程序。在控制台中,完成了一个又一个程序。渐渐发现控制台不方便了。控制台貌似只能,从上到下,从左到右的进行输出。如果进行页面设计就会发现,想在光标所处位置的上方添加一些内容,该怎么办呢?


2.解决方案

能否解决这类问题呢?答案是当然的。
直接添加如下的自定义函数。然后再需要光标移动时,直接调用就可以实现光标的移动。

void goto_xy(int x, int y)//定位光标位置到指定坐标
{   
    HANDLE hOut;
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos = { x,y };
    SetConsoleCursorPosition(hOut, pos);
}

ps 1:添加这个自定义函数,必须要声明Windows.h的头文件
ps 2:使用时把它当做一个自定义函数,可以直接调用,传入的参数为相应的坐标
ps 3:使用这个函数时,不会清除屏幕中相关的内容
ps 4:光标移动后,再次输入时,如果原来位置有文字,会被覆盖掉


3.浅析光标移动函数的原理


a.句柄(HANDLE)

  • 在Windows程序中,有各种各样的资源(窗口、图标、光标等),系统在创建这些资源时会为它们分配内存,并返回标示这些资源的标示号,即句柄。
  • 句柄指的是一个对象在某一个进程中的唯一索引,而不是指针。由于地址空间的限制,句柄所标识的内容对进程是不可见的,只能由操作系统通过进程句柄列表来进行维护。

在示例程序中HANDLE就是句柄数据类型。可以把对象的句柄赋给它。


b.API函数

  • 操作系统除了协调应用程序的执行、内存分配、系统资源管理外,同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务是一个函数)。
  • 这些服务可以帮助应用程序达到开启视窗、描绘图形、使用周边设备的目的,由于这些函数服务的对象是应用程序(Application),所以称之为Application Programming Interface,简称API函数。

Ps :我们刚刚讲到过,句柄不是指针,对进程不可见,只能由操作系统来进行操作。而这种操作就要使用API函数。

  • 程序员想编写具有Windows风格的软件,必须借助API,API也因此被赋予至高无上的地位。但是,如若没有合适的Windows编程平台,那么Windows开发是一项很复杂的工作。程序员必须熟记一大堆常用的API函数,而且还得对WINDOWS操作系统有深入的了解。
  • 在可视化编程IDE出来之后,在WINDOWS平台上出现了很多优秀的可视化编程环境,程序员可以采用“所见即所得”的编程方式来开发具有精美用户界面和功能强大的应用程序。也就是说可视化编程IDE封装了的API函数的集合,并提供了大量的类库和各种控件,它们替代了API的神秘功能。
  • 虽然类库和控件使应用程序的开发简单的多,但它们只提供WINDOWS的一般功能,对于比较复杂和特殊的功能来说,使用类库和控件是非常难以实现的,这时就需要采用API函数来实现。

Ps :日常使用API的几率很小,所以API不用系统的去学,在需要的时候去查API帮助就足够了。

->在示例程序中GetStdHandle()就是一个API函数。
它的作用是从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄
这里的句柄也可以理解为指光标停留位置的信息。

含义
STD_INPUT_HANDLE 标准输入的句柄
STD_OUTPUT_HANDLE 标准输出的句柄
STD_ERROR_HANDLE 标准错误的句柄

GetStdHandle()的几种参数


c.COORD

COORD是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标。

typedef struct _COORD
{
    SHORT X; 
    SHORT Y; 
} COORD;

COORD是一个结构体,表示一个坐标。定义包含在Windows.h的头文件里。


d.SetConsoleCursorPosition()

SetConsoleCursorPosition是一个实现光标的位置控制的计算机函数。

它的两个参数为(光标句柄,COORD的结构体)
作用是将光标句柄,移动到COORD指向的位置。

你可能感兴趣的:(c语言,光标移动,控制台,api,操作系统)