Skip to content

Latest commit

 

History

History
172 lines (110 loc) · 6.29 KB

File metadata and controls

172 lines (110 loc) · 6.29 KB

1.概述

本项目为指令行交互应用开发通用框架,旨在通过设计好的框架为用户提供基于指令行的开放接口,从而让用户可以便利的使用指令行来实现图形化的界面。

而此项目的API包括layout, listener, os, utils, view, widget六部分

  • layout 主要设计了绝对布局,每个子layouts的位置都基于其左上角的位置。
  • listener主要包括了对键盘,鼠标,计时器等等各项内容的监听和处理。
  • os 用于定义context以及基于xml文件创建node节点
  • utils 包括了canvas和util,canvas主要用于定义画布并绘制矩形线段字符等。util主要用于给绘制提供接口。
  • view中包括了node,node可以与监听器,布局等各类进行绑定,同时也提供了每个节点的更新,绘制等接口。
  • widget中包括了对背景,图案,字符的绘制。

2.教程

本部分将主要讲解各个板块的API的使用方式以及内容格式。

使用本框架进行应用程序开发,如果有需要自定义组件,应当继承自nodeComponent。

1.view-node

  • 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用于决定绘制的canvas

    Node(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(); 获得当前节点的窗体数据

2.canvas

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()

3.layouts

​ 每个layouts和子layouts由传入的x和y决定他的绝对位置。

4.os-context

​ 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。

3.例子

要按照此框架开发一个应用程序

首先需要编写一个.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;
}