本项目为指令行交互应用开发通用框架,旨在通过设计好的框架为用户提供基于指令行的开放接口,从而让用户可以便利的使用指令行来实现图形化的界面。
而此项目的API包括layout, listener, os, utils, view, widget六部分
- layout 主要设计了绝对布局,每个子layouts的位置都基于其左上角的位置。
- listener主要包括了对键盘,鼠标,计时器等等各项内容的监听和处理。
- os 用于定义context以及基于xml文件创建node节点
- utils 包括了canvas和util,canvas主要用于定义画布并绘制矩形线段字符等。util主要用于给绘制提供接口。
- view中包括了node,node可以与监听器,布局等各类进行绑定,同时也提供了每个节点的更新,绘制等接口。
- widget中包括了对背景,图案,字符的绘制。
本部分将主要讲解各个板块的API的使用方式以及内容格式。
使用本框架进行应用程序开发,如果有需要自定义组件,应当继承自nodeComponent。
- NodeComponent类作为一个基础类,用于给layouts,listeners等组件,以及用户需要的自定义组件提供node相关的回调函数接口。
virtual void OnBindCallback(Node&) = 0;
用于在有组件绑定时触发此回调,参数为本节点的引用
virtual void onChildrenLayoutCallback(Node&, Rect, Rect&, int) = 0;
用于在每个节点的子节点布局时触发回调,参数为子节点的引用以及节点位置还有每个子节点的索引
virtual void onDrawCallback(Node&, Canvas&) = 0;
在绘制节点时触发回调,参数为node本身的引用和他所对应的canvas
-
Node类用于交互应用程序所需要的视觉体现和交互,提供了节点的基础函数接口。
void update();更新当前节点的状态
void layout(Rect pos);用于决定node的布局位置,参数pos为期望放置的位置void draw(Canvas& canvas);用于绘制节点,参数canvas用于决定绘制的canvasNode(Context& context);用于将context传入进行node的构造template <class C>C* bind();用于将node组件绑定在当前的node上,C是组件的类型,返回值为组件实例的引用template <class C>Opt<C*> getComponent();用于获取节点某一组件的实例,返回值是需要获取的组件void include(Node* sub); 用于向当前节点添加子节点,参数sub为想要添加的子节点地址
bool hasSubnode();检查节点是否有至少一个的子节点void forEachSubnode(Fn<bool(Node&, int)> callback);用于遍历一个节点下的所有子节点,传入参数为对每个子节点的回调函数Opt<Node*> getSubnodeById(CStr id);用于按ID获取子节点,返回值为该子节点的地址Nodes getSubnodesByTag(CStr tag);用于按tag获取子节点,返回值为要找的组件template <CompTimeStr key>auto getParam();用于获取当前节点的一个param,返回值为该param的值Rect getRect();获得当前节点的窗体数据
canvas类提供了绘制节点所需的基本绘制函数。
void drawRect(int l, int t, int r, int b);
用于绘制矩形,参数l,t,r,b,分别为矩形的4个点的4个上下左右四界限。l、t为一点,l、b为一点,r、b为一点,r、t为一点。
`void drawLine(int l, int t, int r, int b);`
用于绘制线条,参数l、t为线的一端,r、b为另一端
void drawCricle(int l, int t, int r, int b);
用于绘制圆形,绘制圆形时基于矩形进行绘制,参数l、t、r、b决定四顶点,参考矩形的绘制方式。
void drawChar(char pchar, int l, int t, int r, int b);
用于绘制字符,pchar为将要绘制的字符,l、t、r、b决定字符的四个顶点
void drawPolygon(std::vector<UInt>& vt, int l, int t, int r, int b);
用于绘制多边形,参数vt为多边形边数,l、t、r、b决定多边形顶点
void start(UInt attr, char c);
用于开始绘制新图像,attr为字符颜色,c为填充字符
void pstart(UInt** attr, char** c, UInt length, UInt width);
用于开始绘制有长宽要求的新图像,attr为字符颜色,c为填充字符,length为长度,width为宽度
void finish();
用于结束当前图像的绘制。
整个图像绘制的流程应是start()..绘制..finish()
每个layouts和子layouts由传入的x和y决定他的绝对位置。
context主要用于从xml文件创建node,并定义了context类型,用于进行信息的传递。
Context(Str appName, Str authorName, UInt windowWidth, UInt windowHeight);为构造函数,其中:
Str appName;为应用名
Str authorName;为作者名
UInt windowHeight;为窗口高度
UInt windowWidth;为窗口宽度
void startApplication(void(*onCreateCallback)(Context*));
在编写好应用后,应当通过实例化context并调用此函数来创建应用程序。参数为一回调函数,在编写应用程序时应该编写一个用于回调的oncreate函数,并传入到startApplication函数中。
Inflater用于基于xml文件创建node。
要按照此框架开发一个应用程序
首先需要编写一个.xml文件
接着在头文件中引用
#include <ICmdDK/os/context.hpp>
#include <ICmdDK/view/params.hpp>
#include <ICmdDK/utils/util.hpp>
#include <ICmdDK/view/node.hpp>
#include <ICmdDK/widget/basics.hpp>
#include <ICmdDK/layout/layouts.hpp>
#include <ICmdDK/listener/listeners.hpp>
#include <ICmdDK/listener/listener.hpp>
#include <icmd.hpp>应当编写一条void onCreate(Context* ctx)用于回调。其中实例化inflater来基于xml文件创建node。
随后可以对各个节点进行各种组件的绑定调用以及定义。以及声明触发器。
在完成了onCreate的设计后,通过类似于下文的形式定义一个主函数,从而实现基础的应用程序编写。
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
Context c(/*应用名,作者名,窗体长,窗体宽*/);
c.startApplication(&onCreate);
return 0;
}