【一套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 ...
随机推荐
- jQuery刷新包含的<jsp:include>页面
jQuery刷新包含页面 JQuery刷新包含页面,以下两种形式均可: <%@include file="../include/header.jsp" %> < ...
- bootstrap中如何让响应式图片(img-responsive)水平居中
我们在用bootstrap排版内容的时候,有的时候在内容中需要图片水平居中对齐. 一般情况下,我们的图片都使用了 .img-responsive 类来实现响应式图片.如果需要实现响应式图片水平居中,那 ...
- Java循环删除集合多个元素的正确打开方式
首先说下不正确的打开方式: 第一:使用for循环删除集合的元素,示例代码如下 ArrayList<String> list = new ArrayList<String>(Ar ...
- Python:循环语句
while 在某种条件下,执行某段程序 >>> w=0 >>> while w<5: ... print 'w :',w ... w=w+1 ... w : ...
- UVA 11624 Fire!
题目大意: F代表火焰 J代表人 一个人想在火焰烧到自己之前逃出着火地区 . 为路,人可以走,火可以燃烧(当然如果火先烧到就不能走了) #为墙,不可走 如果能逃出,输出时间,不能,输出IMPOSSIB ...
- EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(完)
前言 这一篇是本系列的最后一篇,虽然示例讲到这里就停止呢,但对于这些技术的学习远不能停止.虽然本示例讲的比较基础,但是正如我第一篇说到的,这个系列的目的不是说一些高端的架构设计,而是作为一个入门级,对 ...
- hdoj 5124lines
题意:给你n条线段,求被最多的线段覆盖的点被覆盖的次数 解法:我们可以将一条线段[xi,yi]分为两个端点xi和(yi)+1,在xi时该点会新加入一条线段,同样的,在(yi)+1时该点会减少一条线段, ...
- iOS开发_MVC设计模式
MVC,是一种主流的设计模式,本博文总结一下自己对MVC的看法和理解,浅知拙见,难登大雅之堂,如有欠缺遗漏,还望各位指正. MVC是Model-View-Controller 的缩写,Model 是指 ...
- Tomcat服务器配置
安装好jdk以后,首先到apache官网(http://tomcat.apache.org/)下载tomcat,安装到F盘,本人下载的版本为:apache-tomcat-7.0.55 修改环境变量 找 ...
- SET-UID程序漏洞实验
一.实验描述 Set-UID 是Unix系统中的一个重要的安全机制.当一个Set-UID程序运行的时候,它被假设为具有拥有者的权限.例如,如果程序的拥有者是root,那么任何人运行这个程序时都会获得程 ...