光标控

GetStdHandle

  函数声明如下

  HANDLE GetStdHandle(

  DWORD nStdHandle

  );

  GetStdHandle()返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄。

  其参数nStdHandle的值为下面几种类型的一种:

  值 含义

  STD_INPUT_HANDLE 标准输入的句柄

  STD_OUTPUT_HANDLE 标准输出的句柄

  STD_ERROR_HANDLE 标准错误的句柄

  实例程序:

  实现一个彩色的Hello World

  #include <windows.h>

  //GetStdHandleSetConsoleTextAttribute在头文件windows.h

  #include <iostream>

  using namespace std;

  void SetColor(unsigned short ForeColor=3,unsigned short BackGroundColor=0)

  //给参数默认值,使它 

  //可以接受0/1/2个参数

  {

  HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //本例以输出为例

  SetConsoleTextAttribute(hCon,ForeColor|BackGroundColor);

  }

  int main()

  {

  SetColor();

  std::cout<<"Hello world!"<<endl;

  SetColor(40,30);

  std::cout<<"Hello world!"<<endl;

  std::cout<<"Hello world!"<<endl;

  return 0;

}

 

 

VC++ 控制台光标的相关操作

 

——————— 转载请保留 ———————

 

作者:Defanive

博客:Console.Dec.CnHi.Baidu.Com/Console_App

 

——————— 谢谢合作 ———————

 

 

类型:原创

时间:09.03.21

测试环境:VC++ 6.0

 

 

命令行的光标(ConsoleCursor)其实就是一个另类的插入符(Caret)。插入符是什么呢?当你在记事本打字的时候,那个一闪一闪的竖线就叫做插入符。插入符的作用有多大呢?没有了插入符,假如你正在输入第二十个字,突然发现第一个字打错了,那么你得把正确的十九个字和错误的第一个字全删了,再把所有东西重新打一遍。然而,系统没有给任何命令是可以操作命令行光标的,光标的存在实在是名存实亡,完全不能发挥光标的真正用途。本教程的目的,就是让大家学会在命令行程序中控制光标。

 

 

一、CONSOLE_CURSOR_INFO 结构体

 

CONSOLE_CURSOR_INFO 结构体中包含了关于命令行光标的一些信息,是否显示和光标大小两个信息。通过更改这个结构体,再赋给命令行,就可以实现想要的一些效果了。

 

基本思路:

 

首先先读取命令行现在的 CONSOLE_CURSOR_INFO 结构体信息,需要用到API函数GetConsoleCursorInfoGetConsoleCursorInfo 需要用到输出句柄,可以通过API函数GetStdHandle获得。

 

然后改变结构体信息,再使用API函数SetConsoleCursorInfo

 

例:

 

隐藏光标:

 

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

CONSOLE_CURSOR_INFO cci;

GetConsoleCursorInfo(hOut,&cci);

cci.bVisible=false;

SetConsoleCursorInfo(hOut,&cci);

 

 

 

 

二、控制台光标的位置

 

现在能够控制光标的样式了,但对于批处理来说还远远不够。大部分强大的第三方工具都有设置和获得光标位置的功能,这节我们就来讨论如何实现。

 

设置光标位置需要用到API函数SetConsoleCursorPosition,需要的参数还是输出句柄,和欲设置的坐标。坐标用COORD结构体就可以了。

 

例:

 

将光标移动到(5,3)

 

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

COORD pos;

pos.X=5;

pos.Y=3;

SetConsoleCursorPosition(hOut,pos);

 

获取光标的位置,没有专用的API函数。我们需要通过另一个API函数GetConsoleScreenBufferInfo来获取。其中,GetConsoleScreenBufferInfo的参数分别为输出句柄以及CONSOLE_SCREEN_BUFFER_INFO结构体的指针。CONSOLE_SCREEN_BUFFER_INFO结构体中包含了许多控制台缓冲区的属性,其中我们需要的是一个名为dwCursorPositionCOORD结构体,包含了光标的位置。

 

例:

 

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

CONSOLE_SCREEN_BUFFER_INFO bInfo;

GetConsoleScreenBufferInfo(hOut, &bInfo);

 

上面的例子,bInfo.dwCursorPosition就是当前的坐标

 

范例下载地址:

http://www.qupan.com/down/defanive_3031870.html

 

——————— 转载请保留 ———————

 

作者:Defanive

博客:Console.Dec.CnHi.Baidu.Com/Console_App

 

——————— 谢谢合作 ———————

 

 

另更多资料参考( 上面的不一样,有所屏蔽,未下载)

http://wenku.baidu.com/view/f73b1df3f90f76c661371aeb.html

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值