将窗口调节和选择菜单封装成类

这是我目前为止觉得自己写的最好的一段c++了,虽然还是挺烂的吧。

//转载请注明Author : liutianchenHANDLE console_handle = GetStdHandle(STD_OUTPUT_HANDLE);

const int width = 100, height = 30;

const int marginleft = 3, margintop = 2;

class window_set
{
private:
    char *title;
    int Lbg_color, Lfg_color;

    const int main_list_marginleft = 4 * marginleft;
    const int main_list_margintop = margintop * 2;
    const int main_list_width = width - 2 * main_list_marginleft - 4;
    const int main_list_height = height - 2 * main_list_margintop;

    void goto_xy(const int x, const int y)
    {
        COORD coord;
        coord.X = x;
        coord.Y = y;
        SetConsoleCursorPosition(console_handle, coord);
    }

    void set_color(const int bg_color, const int fg_color)
    {
        SetConsoleTextAttribute(console_handle, bg_color * 16 + fg_color);
    }
public:
    window_set(const char * title,const int bg_color,const int fg_color)
    {
        char window_info[50];
        char window_color[50];
        sprintf(window_info, "mode con cols=%d lines=%d", width, height);
        system(window_info);
        sprintf(window_color, "color %X%X", bg_color, fg_color);
        system(window_color);
        Lbg_color = bg_color;
        Lfg_color = fg_color;
        SetConsoleTitle(title);
    }
    COORD get_pos()
    {
        COORD pos = { (short)main_list_marginleft,(short)main_list_margintop };
        return pos;
    }
    COORD get_size()
    {
        COORD size = { (short)main_list_width,(short)main_list_height };
        return size;
    }
    COORD get_color()
    {
        COORD color = { (short)Lbg_color,(short)Lfg_color };
        return color;
    }
};

class _list
{
private:
    char **lplist;
    int Lbg_color = 0, Lfg_color = 7;

    COORD Lpos = { 0,0 };
    COORD Lsize = { 100,30 };
    int selected_toll_gate;

    void clear_line()
    {
        CONSOLE_SCREEN_BUFFER_INFO buffer_info;
        GetConsoleScreenBufferInfo(console_handle, &buffer_info);
        COORD cur_pos = buffer_info.dwCursorPosition;
        DWORD length;
        FillConsoleOutputAttribute(console_handle, Lbg_color * 16 + Lfg_color, Lsize.X, cur_pos, &length);
        FillConsoleOutputCharacter(console_handle, ‘ ‘, Lsize.X, cur_pos, &length);
    }

    void goto_xy(const int x, const int y)
    {
        COORD coord;
        coord.X = x;
        coord.Y = y;
        SetConsoleCursorPosition(console_handle, coord);
    }
    void set_color(const int bg_color, const int fg_color)
    {
        SetConsoleTextAttribute(console_handle, bg_color * 16 + fg_color);
    }

    void highlight(const char **list, const int i, const int j, const int list_marginleft, const int list_margintop)
    {
        goto_xy(list_marginleft, list_margintop + j);
        set_color(7, 0);
        clear_line();
        printf(list[i]);
        set_color(Lbg_color, Lfg_color);
    }

    void select_list(const char  **list, const int height, const int list_marginleft, const int list_margintop, int *selected_toll_gate);
    void dual_outline_border(const int marginleft, const int margintop, const int border_width, const int border_height);
    void print_list(const char **list, const int start, const int selected, const int height, const int list_marginleft, const int list_margintop);

public:

    void get_pos_size(COORD pos, COORD size)
    {
        Lpos = pos;
        Lsize = size;
    }

    void make_str(char ***list)
    {
        int i;
        *list = new char *[101];
        for (i = 0;i < 100;i++) {
            (*list)[i] = new char[8];
            sprintf((*list)[i], "关卡%03d", i + 1);
        }
        (*list)[100] = NULL;
    }

    int start_(COORD color)
    {
        Lbg_color = color.X;
        Lfg_color = color.Y;
        dual_outline_border(Lpos.X - 2, Lpos.Y - 1, Lsize.X / 2 + 1, Lsize.Y + 2);
        select_list((const char **)lplist, Lsize.Y, Lpos.X, Lpos.Y, &selected_toll_gate);
        return selected_toll_gate;
    }
    _list(char *** list)
    {
        make_str(&lplist);
        *list = lplist;
    }
    ~_list()
    {
        int i;
        for (i = 0;i < 100;i++)
            delete lplist[i];
        delete[] lplist;
    }
};

void _list::dual_outline_border(const int marginleft, const int margintop, const int border_width, const int border_height)
{
    int i;
    goto_xy(marginleft, margintop);
    for (i = 0;i < border_width;i++)
    {
        goto_xy(marginleft + i * 2, margintop + border_height);
        cout << "═";
        goto_xy(marginleft + i * 2, margintop);
        cout << "═";
    }
    for (i = 0;i < border_height;i++)
    {
        goto_xy(marginleft, margintop + i);
        cout << "║";
        goto_xy(marginleft + border_width * 2, margintop + i);
        cout << "║";
    }
    goto_xy(marginleft, margintop);
    cout << "╔";
    goto_xy(marginleft + border_width * 2, margintop);
    cout << "╗";
    goto_xy(marginleft + border_width * 2, margintop + border_height);
    cout << "╝";
    goto_xy(marginleft, margintop + border_height);
    cout << "╚";
    goto_xy(marginleft, margintop + border_height + 3);
}

void _list::print_list(const char **list, const int start, const int selected, const int height, const int list_marginleft, const int list_margintop)
{
    int i, j;
    for (i = start, j = 0;j <= height&&list[i] != NULL;i++, j++) {
        goto_xy(list_marginleft, list_margintop + j);
        if (j == selected) {
            set_color(7, 0);
            clear_line();
            printf(list[i]);
            set_color(Lbg_color, Lfg_color);
        }
        else {
            clear_line();
            printf(list[i]);
        }
    }
}
void _list::select_list(const char  **list, const int height, const int list_marginleft, const int list_margintop, int *selected_toll_gate)
{
    char t1, t2;
    int i = 0, j = 0;
    print_list(list, 0, 0, height, list_marginleft, list_margintop);
    if (i < height)
        while (1) {
            t1 = _getch();
            if (t1 == -32) {
                t2 = _getch();
                if (t2 == 72) {
                    if (j > 0) {
                        goto_xy(list_marginleft, list_margintop + j);
                        set_color(Lbg_color, Lfg_color);
                        clear_line();
                        printf(list[i]);
                        j--;
                        i--;
                        highlight(list, i, j, list_marginleft, list_margintop);
                    }
                    else if (j == 0)
                        if (i > 0) {
                            i--;
                            print_list(list, i - j, j, height, list_marginleft, list_margintop);
                        }
                }
                else if (t2 == 80) {
                    if (j < height) {
                        goto_xy(list_marginleft, list_margintop + j);
                        set_color(Lbg_color, Lfg_color);
                        clear_line();
                        printf(list[i]);
                        j++;
                        i++;
                        highlight(list, i, j, list_marginleft, list_margintop);

                    }
                    else if (j == height)
                        if (list[i + 1] != NULL) {
                            i++;
                            print_list(list, i - j, j, height, list_marginleft, list_margintop);
                        }
                }
            }
            else if (t1 == 13) {
                system("cls");
                *selected_toll_gate = i;
                return;
            }
        }
}

为什么为什么为什么少于150字》》凸

算上代码这都多少字了??

好吧我其实注意到了两个问题

第一个,传参如果和private成员重名了会是一件很麻烦的事情,所以我的private成全统统改名Lvalue

第二个,尽量让一个类完成一个功能,我一开始把两个合在一起写,乱的个我啊

第三个,Console Function其实没有那么难,一些数据类型都是正常向数据类型的封装(huangemingzi——)用的时候直接查msdn就行

但是要注意一下,很多自动转换的数据类型(比如LPSTR-》char*)在其他严格的编译器下是过不去的,所以稍稍谨慎一下

我到现在才知道COORD的x和y都是short

翻滚屏幕刷新闪屏严重的话有这么几个办法

第一个,把cout换成printf

第二个,把清屏换成FillConsoleOutputCharactor

写过的函数最好具有普适性

比如我写的clear_line()

从一开始我就没打算把现在的位置传参,而是直接读

就是因为我想让这个函数在哪里都能用而不是限定在这个地方

好了,够150了吗?

时间: 2024-10-08 17:39:51

将窗口调节和选择菜单封装成类的相关文章

EasyUI 日期选择插件封装成选择到月份的插件

将普通的日期选择插件封装成选择到月份的插件:                     var nowMonth = new Date();                    var month = nowMonth.getMonth()+1;                    month = month < 10 ?"0"+month:month;                    var fmdate =nowMonth.getFullYear()+"-&

Directx11学习笔记【二】 将HelloWin封装成类

我们把上一个教程的代码封装到一个类中来方便以后的使用. 首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面 MyWindow.h文件 1 /************************************************************************ 2 Directx11学习笔记[2] 将HelloWin封装成类 3 2016.01 by zhangbaochong 4 /

php使用GD库实现图片水印和缩略图——封装成类

学完了如何使用GD库来实现对图片的各种处理,那么我们可以发现,不管哪种方法,都有相似之处,如果我们把这些相似的地方和不相似的地方都封装成类,这样就可以提升代码的速度,而且节省了很多时间,废话不多说,来人,上代码! 首先,先创建一个PHP文件:class.php(自定义) 我们知道,在 在原始图片中添加文字水印:http://www.cnblogs.com/finalanddistance/p/7243346.html 在原始图片中添加图片水印:http://www.cnblogs.com/fin

structs2 jsp页面参数封装成类传递到action

中途切入一个系统的维护,而我又是菜鸟. 系统要实现从前端jsp页面输入查询条件,传入后台action进行处理.根据原来的系统本身的代码大概明白是jsp里ognl表达式传参数过去,但是一直不成功.百度各种办法,找到下面方法都试过,好像都不行.找耳挠腮搞半天才发现,我ognl表达式里的值得大小写和action里的类实例名不一致,真是不能更二咯-.- 对齐了jsp里的ognl表达式和action里的类实例名后,问题解决了.把我搜到的structs2 jsp传参数到后台action的方法记录下来,抄一遍

把ajax封装成类,用着方便

一直以来喜欢使用AJAX做一些方便的页面小功能,但是每次都写教案觉很费劲,于是封装了个简单的ajax类.毕竟不是精通js,还望各位指点一二~~ 不废话了,贴代码~~ function ajax() { this.request; this.header="/home/";//ajax初学最容易遇到的问题之一,路径问题,,一定要从域名后就开始写~~不是相对路径也不是绝对路径哈 this.createRequest=function() { var requests; if(window.

JavaScript封装成类

JavaScript在WEB编程中能起到很大的作用,将一些常用的功能写成JavaScript类库. 将下面代码保存为Common.js 类库功能: 1.Trim(str)--去除字符串两边的空格 2.XMLEncode(str)--对字符串进行XML编码 3.ShowLabel(str,str)--鼠标提示功能(显示字符,提示字符) 可以设置显示的提示的文字的字体.颜色.大小以及提示的背景颜色.边框等 4.IsEmpty(obj)--验证输入框是否为空 5.IsInt(objStr,sign,z

Ajax以及封装成类

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

c#操作数据库,试着封装成类 - 求误入指点.

Mysql操作 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; using MySql.Data.MySqlClient; using System.Text.RegularExpressions; namespace importTxtToMysql { class oMySq

php文件下载(解决文件下载后多几个字节的问题) 与封装成类的例子

php文件下载比较常见,网上的资料比较多,在此不再强调怎么去实现(因为也是网上看的).下面主要说明的是下载代码的注意点. php下载文件主要是把文件以字节流直接输出,也就是echo fread($file, filesize($file_name));,这里要注意的是如果你在代码之前(或之后)有输出,也可能被写入下载的文件中,解决的方法是使用 ob_start();和ob_end_clean();来清除前面的输出,后面的输出直接使用@fclose($file);exit(0);来解决. 代码如下