CSDN=>FAQ=>FAQ 展示
  • 问题内容:自己动手制作控制台定位函数
  • 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5129585
  • 所属论坛:C++ 语言     审核组:C/C++
  • 提问者:leilei821006     解决者:leilei821006
  • 感谢:
  • 关键字:函数 光标 C/C++ 变量 C++ 语言 控制台 输出 方框 定位 拐角 原形
  • 答案:

    搜了很多帖子都没有很详细的讲解,自己就写了个,如果有说明问题,希望大家指出

    ----------------------------------------------------------------------------------

    自己动手制作控制台定位函数

    大家一定都用过TC供给大家的光标定位,创建方框等函数,在我们眼里很神秘,现在我们就自己动手来制作。

    一. 光标定位

    首先我们通过MCDN可以找到这样一个函数SetConsoleCursorPosition(),这个就是VC++提供的光标的定位函数,它的原形为

    BOOL  SetConsoleCursorPosition(

      HANDLE  hConsoleOutput,  

    COORD  dwCursorPosition

    );

    BOOL :是一种类型(Boolean variable布尔变量),返回‘ 真 ’or‘ 假 ’;

    HANDLE  hConsoleOutput,  为输出设备的句柄,和int、char一样是一种类型

    COORD  dwCursorPosition,为光标的位置

    接下来我们所要做的就是获得输出设备的句柄和设置光标的位置。

    1. 获得输出设备的句柄

    要获得输出设备的句柄就要用到函数GetStdHandle(),它的原形为:

    HANDLE GetStdHandle(

      DWORD nStdHandle   // input, output, or error device

    );

    nStdHandle一共有3个值为STD_INPUT_HANDLE  输入设备句柄, STD_OUTPUT_HANDLE  输出设备句柄,STD_ERROR_HANDLE 错误句柄

    所以我们要获得输出设备的句柄就要先定义个句柄然后将获得的输出设备的句柄赋值给所定义的句柄。如:HANDLE   hCon   =   GetStdHandle(STD_OUTPUT_HANDLE); 

    2. 设置光标的位置

    COORD的原形为:

    typedef struct _COORD 

    { // coord. 

        SHORT X;      // horizontal coordinate 

        SHORT Y;      // vertical coordinate 

    } COORD;

    Typedef的含义就是把一种类型定义成另一种名字

    e.g

    typedef int zhengxing;

    zhengxing nA; //等同于int nA;

    从这里大家可以发现COORD为一个结构体类型,他含有X,Y两个元素,所以我们就应该先定义一个COORD的结构体变量,然后对其元素进行赋值就可以完成对光标的设置。

    这样一个完整的光标定位函数我们就可以写出来了。如下:

    void goxy(int nX, int nY)

    {

        HANDLE   hCon;//定义一个句柄

        hCon = GetStdHandle(STD_OUTPUT_HANDLE);   //获得输出设备的句柄

        COORD   setps; //定义结构体变量

        setps.X = nX;   

        setps.Y = nY; 

        SetConsoleCursorPosition(hCon,setps);  //定位

    }

    再调用时,我们只需输入他的坐标就可以进行光标的定位了。

    二.制作方框

    大家现在都可以打印一个任意边长的方框,只是无法将所打印的方框在屏幕的其他地方打印出来,我们现在有了光标的定位函数,只需在打印每个点的时候将光标定位到你想要的地方,就可以实现制作方框了。下面是我写的一个制作方框的函数,大家可以参考下:

    void frame(int x, int y, int width, int height)

    {

        for(int nI = 0; nI < height; nI++)  //行数

        {

            for(int nJ = 0; nJ < width*2; nJ += 2) //列数,width*2中文符号占两位

            {

                goxy(x + nJ, y + nI); //调用我们前面的函数进行光标的定位

                if(nI == 0 || nJ == width*2 - 2 || nJ == 0 || nI == height - 1) //只打印四个边

                {

                    if(nI == 0 && nJ == 0 ) //左上的拐角

                    {

                        printf("┏");

                    }

                    else if(nI == 0 && nJ == width * 2 - 2)

                    {

                            printf("┓");//右上的拐角

                    }

                    else if(nI == height - 1 && nJ == 0)

                    {

                        printf("┗");//左下的拐角

                    }

                    else if(nI == height - 1 && nJ == width*2 - 2)

                    {

                        printf("┛");//右下的拐角

                    }

                    else if(nI == 0 || nI == height - 1)

                    {

                        printf("━");   

                    }

                    else

                    {

                        printf("┃");

                    }

                }

            }

            printf("\n");

        }

    }

    如果大家还想在方框上打印出标题,只需要在方框打印结束后,调用光标定位,定位到适当的位置进行打印,将两个函数封装成一个函数就可以实现了。我们还可以通过函数的重载实现输入不同的参数打印不同的方框,如方框的颜色,文本的颜色等等;

     

    三.其他的设置

    1.文本颜色

    函数的原形

    BOOL SetConsoleTextAttribute(

      HANDLE hConsoleOutput,  // 控制台的句柄

      WORD wAttributes        //文本和背景的颜色(0--15)

    );

     

    e.g

    HANDLE   hCon   =   GetStdHandle(STD_OUTPUT_HANDLE);

    SetConsoleTextAttribute(hCon,   10);设置成绿色,一共有0--15种颜色

     

    2. 执行清屏命令

    这个函数比起书上的用空格来清除方框内容的方法要简单多了

    BOOL FillConsoleOutputCharacter(

      HANDLE hConsoleOutput,  // handle to screen buffer

      TCHAR cCharacter,       // character to write 要写入的字符

      DWORD nLength,          // number of character cells to write to写入多少个单元

      COORD dwWriteCoord,     // x- and y-coordinates of first cell 起始的单元

      LPDWORD lpNumberOfCharsWritten 

                              // pointer to number of cells written to

    );

     

    e.g

    DWORD   nBytesWrite; 

    CONSOLE_SCREEN_BUFFER_INFO   ConInfo;   //定义一个控制台的信息变量

    HANDLE   hCon   =   GetStdHandle(STD_OUTPUT_HANDLE); //获得输出设备的句柄

    GetConsoleScreenBufferInfo(hCon,   &

  • 评价: 有价值 给朵鲜花(5) 无价值 扔个鸡蛋(0)
相关FAQ
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo