【一套C语言控制台的输出框代码】
效果演示
可以生成一个输出框
首先
要创建输出框,设置输出框风格,可以设置的元素包括:
左上角符号,右上角符号,左下角符号,右下角符号,以及上下左右边界线符号,理论上,只要你电脑能显示的符号,都可以支持
该套代码在:
宽字符下工作
再次
你需要加载字符串,此函数可以多次调用,可以向输出框中添加内容
之后
show输出框 此时完成自动分页,外边框也将显示出来
最后
可调用函数输出指定页的内容
所有文字不会越出输出框,自动换行。
以下是代码
cwguser.h
#include<tchar.h>
#include<string.h>
#include <locale>
#include <conio.h>
#ifndef _CWGUSER_H_
#define _CWGUSER_H_
#include "cwgtype.h"
#include "output.h" #endif
cwgtype.h
#ifndef _CWG_TYPE_H_
#define _CWG_TYPE_H_
typedef int CWG_COLOR;
typedef int CWG_HANDLE; #endif
output.h
#ifndef _CWG_OUTPUT_H_
#define _CWG_OUTPUT_H_
#include<tchar.h>
#include "cwgtype.h"
#include <malloc.h>
#define SC(x) L##x
typedef struct _outputbox
{
int xbox;
int ybox; //起始坐标
int xWidth;
int yHeight; //范围
CWG_COLOR box_color; //边框颜色 TCHAR* pBoxUpLineCh;
int nBoxUpLineCh;
TCHAR* pBoxDownLineCh;
int nBoxDownLineCh;
TCHAR* pBoxLeftLineCh;
int nBoxLeftLineCh;
TCHAR* pBoxRightLineCh; //边线符号
int nBoxRightLineCh; //符号占位
TCHAR* pLeUpCh;
int nLeUpCh;
TCHAR* pRiUpCh;
int nRiUpCh;
TCHAR* pLeDoCh;
int nLeDoCh;
TCHAR* pRiDoCh; //四个角的符号
int nRiDoCh;
}OUTPUTBOX;
//移动光标
void gotoxy(int x, int y);
//输出相关
//----------------------------------------------------------------------------------------------------------
//功能:
//创建一个用于展示字符串的区域 (这是逻辑的 不显示)
//参数:
//输出框结构-包括输出框大小,位置,颜色(颜色宏),边框字符数组(8个字符构成,分别是上边框,下边框,左边框,右边框,左上角,右上角,左下角,右下角)
// -不被赋值的成员将会采用DEFAULTSET中的设置.
//字符串指针-输出框的标题,输入NULL表明无标题,最大长度为10个汉字,超出则返回 OE_CAPTIONERROR
//内容大小 -表示要输出的最大字节数,如果输入的内容多于一个输出框的最大容量,输出框会自动增加翻页功能.
//返回值 输出框句柄
//----------------------------------------------------------------------------------------------------------
CWG_HANDLE OutPutBox(OUTPUTBOX outputbox, const TCHAR * caption, int text_count_max);
//----------------------------------------------------------------------------------------------------------
//功能:
//载入字符串,将字符串写入到逻辑的输出框中
//参数:
//输入框句柄
//字符串指针
//字符串大小
//字符串颜色
//返回值 成功返回0 如果数量超限则返回 OE_TEXTERROR
//输入函数
int LoadStringToBox(CWG_HANDLE handle, const TCHAR * test, int count, CWG_COLOR color);
//功能
//显示输出框
//参数
//输出框句柄
void showOutPutBox(CWG_HANDLE handle);
//该函数由showOutPutBox调用
//功能:
//画出边框
//参数
//输出框结构
//返回值
//一行所占的空格位(包含边框)
int showBoxSide(OUTPUTBOX outputbox);
//分页
//内容指针 分页数组的数组名 一行空格位 一页总空格位
void makePage(TCHAR *p,int line_s_count, int maxcount);
//显示指定页的内容 分页数组名 页数()
void showPage(int n); #endif
cwguser.cpp(vs .c不方便 若.c出现问题可以自行更改)
#include"cwguser.h"
#include<stdio.h>
CWG_HANDLE OutPutBox(OUTPUTBOX outputbox, const TCHAR * caption, int text_count_max)
{
static CWG_HANDLE ihandle = ;
extern OUTPUTBOX outputbox_save;
extern CWG_HANDLE handle;
extern TCHAR CAPTION[];
extern int text_count_max_save;
handle = ihandle++; outputbox_save.xbox = outputbox.xbox ;
outputbox_save.ybox = outputbox.ybox ;
outputbox_save.xWidth = outputbox.xWidth;
outputbox_save.yHeight = outputbox.yHeight;
outputbox_save.box_color = outputbox.box_color; outputbox_save.pBoxUpLineCh = outputbox.pBoxUpLineCh;
outputbox_save.nBoxUpLineCh = outputbox.nBoxUpLineCh; outputbox_save.pBoxDownLineCh = outputbox.pBoxDownLineCh;
outputbox_save.nBoxDownLineCh = outputbox.nBoxDownLineCh; outputbox_save.pBoxLeftLineCh = outputbox.pBoxLeftLineCh;
outputbox_save.nBoxLeftLineCh = outputbox.nBoxLeftLineCh; outputbox_save.pBoxRightLineCh = outputbox.pBoxRightLineCh;
outputbox_save.nBoxRightLineCh = outputbox.nBoxRightLineCh; outputbox_save.pLeDoCh = outputbox.pLeDoCh;
outputbox_save.nLeDoCh = outputbox.nLeDoCh; outputbox_save.pLeUpCh = outputbox.pLeUpCh;
outputbox_save.nLeUpCh = outputbox.nLeUpCh; outputbox_save.pRiDoCh = outputbox.pRiDoCh;
outputbox_save.nRiDoCh = outputbox.nRiDoCh; outputbox_save.pRiUpCh = outputbox.pRiUpCh;
outputbox_save.nRiUpCh = outputbox.nRiUpCh; wcscpy_s(CAPTION,wcslen(caption)+,caption);
text_count_max_save = text_count_max; return handle;
}
int LoadStringToBox(CWG_HANDLE handle, const TCHAR * text,int count, CWG_COLOR color)
{
//句柄这时候只是装逼用的 还没有什么卵用 这个位置先留给它
extern int text_count_max_save;
extern int text_count_now_save;
extern TCHAR * pText;
if (text_count_now_save == )//如果是第一次加载string 准备好pText
{
pText = (TCHAR *)malloc(sizeof(TCHAR)*);
pText = (TCHAR *)memset(pText,(TCHAR)'\0', );
text_count_now_save = ;
}
if (text_count_now_save > text_count_max_save)
{
//超出范围
}
else
{
//现在的数据 = 新增的数据 + 原来的数据包含\0
text_count_now_save = wcslen(text)*sizeof(TCHAR) + text_count_now_save;
//申请更大的容量
TCHAR * temp = (TCHAR *)malloc(text_count_now_save);
int temp_n = ;//temp指针的偏移变量
int text_n = ;//text的偏移变量
int p_n = ;//pText的偏移变量 //将pText的内容复制到temp中
while ((temp[temp_n++] = pText[p_n++]) != '\0');
//将text拼接到temp中
temp_n = ;//temp指针的偏移变量 置零
text_n = ;//text的偏移变量 置零
while ()
{
if (temp[temp_n] == '\0')
{
while ()
{
temp[temp_n++] = text[text_n++];
if (text[text_n - ] == '\0')
{
goto BREAKLOOP;
}
}
}
temp_n++;
}
BREAKLOOP:
free(pText);
pText = temp;
} return ;
}
int showBoxSide(OUTPUTBOX outputbox)
{
int sum = ;//计算一行有多少个空格位(包含边框)
int i, j;
int line = outputbox.ybox;
int row = outputbox.xbox;
for (i = ; i < outputbox.yHeight; i++)
{
if (i == )//第一行
{
gotoxy(row, line++);
for (j = ; j < outputbox.xWidth; j++)//列循环
{
if (j == )//第一列
{
wprintf(L"%s", outputbox.pLeUpCh);
sum += outputbox.nLeUpCh;
}
else if (j == outputbox.xWidth - )//最后一列
{
wprintf(L"%s", outputbox.pRiUpCh);
sum += outputbox.nRiUpCh;
}
else//中间列
{
wprintf(L"%s", outputbox.pBoxUpLineCh);
sum += outputbox.nBoxUpLineCh;
}
}
}
else if (i == outputbox.yHeight - )//最后一行
{
gotoxy(row, line++);
wprintf(L"%s", outputbox.pLeDoCh);
for (j = ; j < (sum - outputbox.nLeUpCh - outputbox.nRiUpCh) / outputbox.nBoxDownLineCh; j++)
{
wprintf(L"%s", outputbox.pBoxDownLineCh);
}
wprintf(L"%s", outputbox.pRiDoCh);
}
else//中间行
{
gotoxy(row, line++);
wprintf(L"%s", outputbox.pBoxLeftLineCh);
for (j = ; j < sum - outputbox.nLeUpCh - outputbox.nRiUpCh; j++)
{
wprintf(L" ");
}
wprintf(L"%s", outputbox.pBoxRightLineCh);
}
}
return sum;
}
void makePage(TCHAR *p, int line_s_count, int maxcount)
{
int space;//当前行剩余空格位
int count;//当前页剩余空格位
int n = ;//记录页数
extern TCHAR ** page_add_save;
space = line_s_count;
count = maxcount;
page_add_save[] = p;
while ()
{
const int isSingle = ( <= *p&&*p <= 0X2C77);//是否只占一个空格位
if (*p != (TCHAR)'\n')//若不是\n
{
space -= isSingle ? : ;
count -= isSingle ? : ;//减去对应的量
p++;
}
else
{
count -= space; //一回车 一下子用了好多空格位
space = line_s_count; //本行剩余空格位重设
p++; //定位到下一个字符
}
if (space == )
{
space = line_s_count;//本行剩余空格位重设 }
//如果一页使用完毕
if (count == )
{
n++;
page_add_save[n] = p;//更新页数
count = maxcount; }
if (*p == '\0')
{
return;
}
}
}
void showPage(int n)
{
extern TCHAR ** page_add_save;
extern OUTPUTBOX outputbox_save;
TCHAR ** page_add = page_add_save;
TCHAR *p;
int space;
int count;
int line;
int row;
//开始清空本页
int i, j;
line = outputbox_save.ybox + ;
row = outputbox_save.xbox + outputbox_save.nLeUpCh;
gotoxy(row, line);//移动坐标到输入点
for (i = ; i < outputbox_save.yHeight - ; i++)
{
for (j = ; j < (outputbox_save.xWidth - )*outputbox_save.nBoxUpLineCh; j++)
{
wprintf(L" ");
}
line++;
gotoxy(row, line);
}
p = page_add[n];//当前页数重新设置
space = outputbox_save.nBoxUpLineCh*(outputbox_save.xWidth - );
count = space * (outputbox_save.yHeight - );
line = outputbox_save.ybox + ;
row = outputbox_save.xbox + outputbox_save.nLeUpCh;
gotoxy(row, line);//移动坐标到输入点
while ()
{
const int isSingle = ( <= *p&&*p <= 0X2C77);//是否只占一个空格位
if (*p != (TCHAR)'\n')//若不是\n
{
printf("%lc", *p);
space -= isSingle ? : ;
count -= isSingle ? : ;//减去对应的量
p++;
}
else
{
count -= space;//一回车 一下子用了好多空格位
space = outputbox_save.nBoxUpLineCh*(outputbox_save.xWidth - );//本行剩余空格位重设
line++;
gotoxy(row, line);
p++; //定位到下一个字符
}
if (*p == '\0')
{
getchar();
exit();
}
if (space == )
{
line++;
gotoxy(row, line);
space = outputbox_save.nBoxUpLineCh*(outputbox_save.xWidth - );//本行剩余空格位重设
}
if (count == )
{
break;
}
}//end 读取一页 while(1)
}
void showOutPutBox(CWG_HANDLE handle)
{
extern OUTPUTBOX outputbox_save;
int sum= ; //计算一行有多少个空格位
//以下打印输出框
sum = showBoxSide(outputbox_save);
//获取输出文字的大小
extern int text_count_now_save;
int textcount = text_count_now_save;
int maxcount = ((sum - outputbox_save.nBoxLeftLineCh * ))*(outputbox_save.yHeight - );//计算输出框一页最大容量
int n_max = text_count_now_save / maxcount;//最大页数
extern TCHAR * pText;
int line_s_count = maxcount/ (outputbox_save.yHeight - );//计算一行的空格位
//申请页 地址的储存空间
extern TCHAR** page_add_save;
page_add_save = (TCHAR**)malloc(sizeof(TCHAR*)*n_max);
makePage(pText,line_s_count,maxcount);//将每一页的首地址放在page_add中
}
gotoxy.cpp
#include<windows.h>
void gotoxy(int x, int y)
{
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
outputdate.cpp
#include "output.h" OUTPUTBOX outputbox_save; //输出框结构
CWG_HANDLE handle; //储存句柄
TCHAR CAPTION[]; //标题数组
int text_count_max_save = ; //最大内容字节数
int text_count_now_save = ; //当前内容字节数
TCHAR *pText; //指向内容的指针
TCHAR ** page_add_save; //分页
以下是对本套代码的使用示例
#include"cwguser.h"
int main()
{
setlocale(LC_ALL, "chs");
OUTPUTBOX outputbox;
outputbox.box_color = ;
outputbox.xbox = ;
outputbox.ybox = ;
outputbox.yHeight = ;
outputbox.xWidth = ; outputbox.pLeUpCh = SC("小");
outputbox.nLeUpCh = ; outputbox.pLeDoCh = SC("┗");
outputbox.nLeDoCh = ; outputbox.pRiUpCh = SC("呆");
outputbox.nRiUpCh = ; outputbox.pRiDoCh = SC("┛");
outputbox.nRiDoCh = ; outputbox.pBoxUpLineCh = SC("━");
outputbox.nBoxUpLineCh = ; outputbox.pBoxDownLineCh = SC("呵");
outputbox.nBoxDownLineCh = ; outputbox.pBoxLeftLineCh = SC("<<");
outputbox.nBoxLeftLineCh = ; outputbox.pBoxRightLineCh = SC("┃");
outputbox.nBoxRightLineCh = ; OutPutBox(outputbox,L"这是输出框标题", *sizeof(TCHAR));
LoadStringToBox(,_T("--.-.--.-.-...---.-.-.\n摩尔斯电码你怕不怕\n"),wcslen(_T("这是测试字符串")),);
LoadStringToBox(, _T("1001110101001110101010\n二进制你怕不怕\n-1001101-10011-10-1-11\n三进制你怕不怕,\n你怕不怕我不知道,\n反正我是怕了\n!!!!!!省略号\n大坏蛋!!!!!"), wcslen(_T("这是测试字符串")), );
LoadStringToBox(,_T("aaaaaa\n\naaa亮闪闪\n的中文aaaa\n"),wcslen(_T("这是测试字符串")),);
LoadStringToBox(, _T("bbb\nbbbb\nbbb飞哥你好.000000000000.0.0.0.0.0.0.0.0.0.0.0.0.0.000.0.0.2333\n"), wcslen(_T("这是测试字符串")),);
LoadStringToBox(, _T("新的一页\n"), wcslen(_T("这是测试字符串")), );
showOutPutBox();
//打印指定页的内容
showPage();
getchar();
showPage();
getchar();
showPage();
getchar();//其实你 可以在这里实现上下翻页 getchar();
return ;
}
注意:
代码并不是完善的,因此可以看到许多参数是"废物",先无视就好啦,随便写个什么也可以...........
【一套C语言控制台的输出框代码】的更多相关文章
- [转]C语言文件输入/输出ACM改进版(freopen函数)
C语言文件输入/输出ACM改进版(freopen函数) 2009年5月27日 10:379,457 浏览数发表评论阅读评论 文章作者:姜南(Slyar) 文章来源:Slyar Home (www. ...
- sublime text 调出结果输出框
sublime是一个非常好用的代码编辑器,同时可以build program 但是在执行代码的过程中,如果进行了查找等操作,下面原来显示输出框的地方被查找界面替代,而程序结果输出框就会"消失 ...
- Eclipse \ MyEclipse \Scala IDEA for Eclipse里如何将控制台console输出的过程记录全程保存到指定的文本文件(图文详解)
不多说,直接上干货! 问题详情 运行Java程序的时候,控制台输出过多,或者同时运行多个Java程序,输出结果一闪而过的时候,可以考虑将将控制台输出,改为输出到文本文件.无须修改Java代码,引入流这 ...
- Go 语言控制台输入&生成随机数
Go 语言控制台输入&生成随机数 1. 不同基础类型之间的转化对于不同的基础类型之间的转化,Go 提供了 strconv包.它实现了字符串与其他基本数据类型之间的转化.其中最常用的数值转化函数 ...
- python--ulipad控制台中文输出乱码
ulipad用起来顺手,而不尽人意的地方时,它不能正确输出中文.而且有人指出这和文件的编码没关系,所以将”设置“选项里”缺省文档编码“修改为”utf-8“也无济于事.为了解决这个问题,我在网上搜了搜, ...
- C语言中格式化输出的转换说明的fldwidth和precision解析
首先说什么是C语言的格式化输出,就是printf和它的几个变种(grep -E "v?(sn|s|f)printf").像这些函数都有一个参数format,format中可以加点转 ...
- ios中判断控制台Log输出控制,是否是iphone5,自动调整尺寸
// 控制台Log输出控制,此确保在release版本下无Log输出 #ifdef DEBUG #define CMBLOG NSLog #else #define CMBLOG ...
- R语言—统计结果输出至本地文件方法总结
1.sink()在代码开始前加一行:sink(“output.txt”),就会自动把结果全部输出到工作文件夹下的output.txt文本文档.这时在R控制台的输出窗口中是看不到输出结果的.代码结束时用 ...
- 将windows控制台内容输出到文件中
将windows控制台内容输出到文件中 dir>c:/file.txt 2>&1 对应的java class >c:/file.txt 2>&1 ...
随机推荐
- Delphi与Windows 7下的用户账户控制(UAC)机制 及 禁用兼容性助手
WIN7, Vista提供的UAC机制,它的主要目的是防止对于操作系统本身的恶意修改.对于Delphi程序的影响,UAC主要在于以下几点:1.由于UAC机制,Delphi对于系统的操作可能无声的失败, ...
- parseInt方法——将字符串解析为int值
parseXxx()方法 语法:static int parseInt(String s) 返回字符串的十进制整数形式 static int parseInt(String s, int rad ...
- biweb添加新的模块
1.例如添加一个新闻模块,首先去纯净的项目的根目录复制出一个news文件夹到项目外 2.打开dreamweaver, 编辑 ->查找和替换 例如 新模块 叫 我的新闻,英文名叫mynews,则进 ...
- SSM框架学习之高并发秒杀业务--笔记5-- 并发优化
前几节终于实现了这个高并发秒杀业务,现在问题是如何优化这个业务使其能扛住一定程度的并发量. 一. 优化分析 对于整个业务来说,首先是分析哪些地方会出现高并发,以及哪些地方会影响到了业务的性能.可能会出 ...
- Python实践所遇问题记录
1.在cmd中直接输入'python'提示:'python'不是内部或外部命令,也不是可运行的程序或批处理文件. 原因:没有为Python设置环境变量. 解法:控制面板->系统->高级系统 ...
- CentOS 6.7 中安装Emacs 24.5
Emacs 版本:http://mirror.bjtu.edu.cn/gnu/emacs/emacs-24.5.tar.gz CentOS 内核版本:2.6.32-573.el6.x86_64 参考资 ...
- PHPExcel读取Excel文件的实现代码
<?php require_once 'PHPExcel.php'; /**对excel里的日期进行格式转化*/ function GetData($val){ $jd = GregorianT ...
- Java学习之多态
多态的概念 多态==晚绑定. 不要把函数重载理解为多态. 因为多态是一种运行期的行为,不是编译期的行为. 多态:父类型的引用可以指向子类型的对象. 比如 Parent p = new Child(); ...
- 编程key note
一些日常发现的code better的要点.不断更新. * #include <assert.h> 使用断言* 每个模块(文件)应该有一个唯一的一个前缀,模块导出的所有全局名字都应以此前缀 ...
- asp.net 5 中应用程序根目录及物理文件根目录的获取方式 此文已过期,不再适应rc1以后的版本
之前看了asp.net5,小弟就试着用了用,做了个小网站练习一下,有一个小模块需要上传图片到wwwroot下的images文件夹,但是aspnet5 发生了翻天复地变化,之前获取网站根目录的的方法不再 ...