完善Readme

This commit is contained in:
2018-12-02 16:41:23 +08:00
parent 76f1c6ce9c
commit fbdaddde20
10 changed files with 244 additions and 144 deletions
+114
View File
@@ -0,0 +1,114 @@
#define _CRT_SECURE_NO_WARNINGS
#include "console_window.h"
#include "pannel.h"
#include "spliter.h"
#include "coding.h"
#include "conctrl.h"
//创建当前控制台窗口对应的控制窗口
ConsoleWindow* CreateConsoleWindow(int width, int height) {
if (width <= 5 || height <= 5 || width > 32767 || height > 32767)
return new(std::nothrow) ConsoleWindow();
else {
return new(std::nothrow) ConsoleWindow(width, height);
}
}
void DestroyConsoleWindow(ConsoleWindow* window) {
delete window;
}
//重新设置窗口和缓冲区大小
bool ResizeScreenBuffer(ConsoleWindow* window, int width, int height) {
if (width <= 5 || height <= 5 || width > 32767 || height > 32767)
return false;
return window->Resize({ (SHORT)width, (SHORT)height });
}
//设置控制台窗口标题
bool SetConsoleWindowTitle(char* _title, bool utf8) {
if (utf8) {
std::string title;
title = UTF8ToANSI(_title);
return SetConsoleTitle(title.c_str());
}
return SetConsoleTitle(_title);
}
//创建一个窗格
Pannel* CreatePannel(ConsoleWindow* window, int left, int top, int width, int height) {
if (left < 0 || top < 0
|| left > 32767 || top > 32767 || width > 32767 || height > 32767
) return NULL;
return window->NewPannel({ (SHORT)left, (SHORT)top, (SHORT)(left + width - 1), (SHORT)(top + height - 1) });
}
//删除窗格
void DestroyPannel(ConsoleWindow* window, Pannel* pannel) {
window->RemovePannel(pannel);
}
//设置Pannel行缓存大小
bool SetMaxLineCache(Pannel* pannel, int lineCount) {
if (lineCount < 0) return false;
pannel->maxLineCount = lineCount;
return true;
}
//向Pannel中添加文本
void AddPannelText(Pannel* pannel, const char* _text, bool focus, bool utf8, int attribute) {
std::string text;
if (utf8) text = UTF8ToANSI(_text);
else text = _text;
pannel->AddText(text, focus, attribute);
}
//向Pannel中添加行
void AddPannelLine(Pannel* pannel, const char* _text, bool focus, bool utf8, int attribute) {
std::string text;
if (utf8) text = UTF8ToANSI(_text);
else text = _text;
pannel->AddLine(text, focus, attribute);
}
//清空Pannel
void ClearPannel(Pannel* pannel) {
pannel->Clear();
}
//移动或改变Pannel大小
bool MovePannel(Pannel* pannel, int left, int top, int width, int height) {
if(left > 32767 || top > 32767 || width > 32767 || height > 32767) return false;
if (left < 0) left = pannel->area.Left;
if (top < 0) top = pannel->area.Top;
if (width <= 5) width = pannel->area.Right - pannel->area.Left + 1;
if (height <= 5) height = pannel->area.Bottom - pannel->area.Top+ 1;
pannel->Move({ (SHORT)left, (SHORT)top, (SHORT)(left + width - 1), (SHORT)(top + height - 1)});
return true;
}
//向前滚屏
bool ScrollPannelBackward(Pannel* pannel, int lineCount) {
return pannel->ScrollBackward(lineCount);
}
//向后滚屏
bool ScrollPannelForward(Pannel* pannel, int lineCount) {
return pannel->ScrollForward(lineCount);
}
//滚动到特定行
bool ScrollPannelTo(Pannel* pannel, int lineTo) {
return pannel->ScrollTo(lineTo);
}
//将光标设置到窗格的特定位置
bool FocusOnPannel(Pannel* pannel, int offsetLeft, int offsetTop) {
return pannel->Focus({ (SHORT)offsetLeft, (SHORT)offsetTop });
}
//创建一条分隔线。
Spliter* CreateSpliter(ConsoleWindow* window, int left, int top, int length, bool verticle, int attribute) {
if (length <= 0
|| left < 0 || left >= window->bufferSize.X
|| top < 0 || top >= window->bufferSize.Y
) return NULL;
return window->NewSpliter({ (SHORT)left, (SHORT)top}, length, verticle, attribute);
}
//删除分隔线
void DestroySpliter(ConsoleWindow* window, Spliter* spliter) {
window->RemoveSpliter(spliter);
}
//移动或重新设定分隔线长度
bool MoveSpliter(Spliter* spliter, int left, int top, int len) {
if (left < 0 || left > 32767 || top < 0 || top > 32767 || len < 0) return false;
spliter->Move({ (SHORT)left, (SHORT)top }, len);
return true;
}
Binary file not shown.
+106
View File
@@ -0,0 +1,106 @@
// ConsoleController
// 2018-11-28
// By Mattuy
#ifndef _HEAD_CONSOLE_CONTROLLER_
#define _HEAD_CONSOLE_CONTROLLER_
#ifdef __cplusplus //cpp
class ConsoleWindow;
class Pannel;
class Spliter;
#else //C
typedef void ConsoleWindow;
typedef void Pannel;
typedef void Spliter;
#endif
extern "C" {
/**
* 创建控制台控制器
* @return value, 指向当前控制台的控制台操作对象的指针,作为其他函数的参数,以通过它控制
* 控制台。失败返回0
* @param width, 屏幕缓冲区宽度,有效范围(5, 32767),默认80
* @param height, 屏幕缓冲区高度,有效范围(5, 32767),默认40
*/
ConsoleWindow* CreateConsoleWindow(int width = 80, int height = 40);
//还原控制台,销毁控制器
void DestroyConsoleWindow(ConsoleWindow* window);
//重新设置窗口和缓冲区大小
bool ResizeScreenBuffer(ConsoleWindow* window, int width, int height);
/**
* 设置控制台窗口标题
* @param window, 要设置标题的窗口
* @param title, 要设置的标题
* @param utf8, 是否utf8编码。UTF-8请设为非0,否则当作ANSI处理
*/
bool SetConsoleWindowTitle(char* title, bool utf8 = false);
/**
* 创建一个窗格。
* @return value, 指向一个窗格的指针
* @param window, 窗格所属窗口
* @param left, 窗格相对窗口的水平偏移,有效范围(5, 32767)
* @param top, 窗格相对窗口的竖直偏移,有效范围(5, 32767)
* @param width, 窗格的宽度,有效范围(5, 32767)
* @param height, 窗格的高度,有效范围(5, 32767)
*/
Pannel* CreatePannel(ConsoleWindow* window, int left, int top, int width, int height);
//删除窗格
void DestroyPannel(ConsoleWindow* window, Pannel* pannel);
//设置窗格行缓存大小(行数)
bool SetMaxLineCache(Pannel* pannel, int lineCount);
/**
* 向Pannel中添加文本。如果行缓冲区中上一行不是换行符结尾或调用【AddPannelLine】函数添加的,新
* 文本将合并到上一行。原文本属性也会被覆盖。
* @param window, 窗格所属窗口
* @param text, 要添加的字符串
* @param focus, 是否将光标移动到新添加的文本后
* @param utf8, 是否utf8编码。仅支持ANSI编码和UTF-8编码,并且UTF-8编码也将被转换为ANSI
* 编码。默认为false
* @param attribute, 行文本属性,由Windows定义的控制台常量,默认黑底白字
*/
void AddPannelText(Pannel* pannel, const char* text, bool focus, bool utf8 = false, int attribute = 7);
//与AddText唯一的不同是,如果字符串不是以换行符结尾,将自动插入换行符
void AddPannelLine(Pannel* pannel, const char* text, bool focus, bool utf8 = false, int attribute = 7);
//清空Pannel。这将同时清除pannel的行缓冲区
void ClearPannel(Pannel* pannel);
//移动或改变Pannel大小,参数同【CreatePannel】。如果参数分量无效,该分量将不会改变
bool MovePannel(Pannel* pannel, int left, int top, int width, int height);
/**
* 向前滚屏。
* @return value, 如果滚动前已触顶返回false,否则返回true
* @param pannel, 要滚动的窗格
* @param lineCount, 要滚动的行数,如果小于0滚动一屏(相对窗格)
*/
bool ScrollPannelBackward(Pannel* pannel, int lineCount);
//向后滚屏。
bool ScrollPannelForward(Pannel* pannel, int lineCount);
//滚动到特定行。如果行号小于0滚到最后,否则如果行号无效返回false
bool ScrollPannelTo(Pannel* pannel, int lineTo);
/**
* 将光标设置到窗格的特定位置。
* @return value, 如果offset超出窗格范围则设置失败
* @param pannel, 要设置光标所在的窗格
* @param offsetLeft, 光标相对窗格左上角的水平偏移,默认为0
* @param offsetTop, 光标相对窗格左上角的垂直偏移,默认为0
*/
bool FocusOnPannel(Pannel* pannel, int offsetLeft = 0, int offsetTop = 0);
/**
* 创建一条分隔线。
* @return value, 指向一条分隔线的指针
* @param window, 窗格所属的窗口
* @param left, 分隔线相对窗口的水平偏移,有效范围(5, 32767)
* @param top, 分隔线相对窗口的竖直偏移,有效范围(5, 32767)
* @param length, 分割线的长度或宽度。是前者还是后者取决于@param verticle
* @param verticle, 是水平分隔线还是竖直分隔线。0为水平,非0为竖直
* @param attribute, 分割线的文本属性,由Windows定义的控制台常量,默认黑底白字
*/
Spliter* CreateSpliter(ConsoleWindow* window, int left, int top, int length, bool verticle, int attribute = 7);
//删除分隔线
void DestroySpliter(ConsoleWindow* window, Spliter* spliter);
/**
* 移动或重新设定分隔线的长度
* @param left, 相对窗格的水平偏移,如果小于0则不改变
* @param top, 相对窗口的垂直偏移,如果小于0则不改变
* @param len, 新的长度/高度。如果小于0则不改变
*/
bool MoveSpliter(Spliter* spliter, int left, int top, int len);
}
#endif // !_HEAD_CONSOLE_CONTROLLER_
Binary file not shown.
+20
View File
@@ -0,0 +1,20 @@
#include <stdio.h>
#include <string.h>
#include <Windows.h>
#include "conctrl.h"
#pragma comment(lib, "conctrl.lib")
int main() {
ConsoleWindow* window = CreateConsoleWindow(80, 40);
Pannel* messagePannel = CreatePannel(window, 0, 0, 78, 25);
Pannel* writePannel = CreatePannel(window, 0, 26, 80, 40);
Spliter* spliter = CreateSpliter(window, 0, 25, 80, false, FOREGROUND_GREEN);
AddPannelText(messagePannel, "请在下方输入任意内容", true, true, 7);
FocusOnPannel(writePannel, 0, 0);
while (true) {
char text[1024];
gets(text);
AddPannelText(messagePannel, text, false, false, FOREGROUND_RED | FOREGROUND_GREEN);
ClearPannel(writePannel);
FocusOnPannel(writePannel, 0, 0);
}
}