# layout **Repository Path**: thant/layout ## Basic Information - **Project Name**: layout - **Description**: 仿传统UI界面(左中右、上中下)的web布局器组件 - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-04-15 - **Last Updated**: 2022-06-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #ifndef _LAYOUTMGR_ #define _LAYOUTMGR_ //边 typedef enum { Left = 0, //左边 Top = 1, //上边 Right = 2, //右边 Bottom = 3 //下边 } enumSideDef; //布局策略(顺序/反序/居中 其实都可以定义为一种对齐方式) typedef enum { enumLayoutStrategy_sequence = 1, //(顺序) enumLayoutStrategy_reverse, //(反序) enumLayoutStrategy_center //(居中) //enumLayoutStrategy_fill //(填充,尺寸优先)如果没有可缩放的控件,会调整包含auto定义的控件大小或gap,以填充整个layout //(如果不是填充的方式,auto只会根据父控件的缩放等比缩放)? //取消,这个由子widget的SIZETYPE/SIZETYPE_Fill来进行控制 //arrang //这个不需要了 (平铺,间距优先)和fill不同的是,不是优先调整控件大小,而是优先间距距 } enumLayoutStrategy; /*//布局类型 取消:用classid+isWindow可以区分 typedef enum { HBOX = 1, //(水平) VBOX, //(垂直) Grid, //(表格) Tree //(树) //enumLayoutType_Box = 1, //Box布局 包含HBOX、VBOX、GRID enumLayoutType_Tree } enumLayoutType;*/ //位置定义 /*typedef enum _POSTYPE { // 暂时不要,过于复杂,允许在布局中固定某个widget的位置,从而影响后续widget的位置 //--取决于自身 POSTYPE_Pixel = 1, //固定值(像素:单位),不能改变 //--取决于父容器 POSTYPE_Percent, //值为百分比,不能改变 //--取决于子项 POSTYPE_Auto, //根据父容器的布局策略调整,只有此属性的元素接受父容器布局 //--自定义 POSTYPE_Custom //根据一个自定义的接口计算 } _POSTYPE;*/ //维度值(宽度/高度)定义 typedef enum _SIZETYPE { //--取决于自身 SIZETYPE_Pixel = 1, //固定值(像素:单位),不能改变 //--取决于父容器 SIZETYPE_Percent, //值为百分比,不能改变 //SIZETYPE_Scale, //值为比例,按比例缩放 按比例缩放和百分比是一样的处理,只是初始化过程不同,这一项可以去掉 SIZETYPE_Fill, //值为 填充剩余的空间 //--取决于子项 SIZETYPE_Auto, //根据子项的大小自适应,仅用于容器 //如果非容器应用此属性,则同于SIZETYPE_Pixel //问题是,对于容器,如果子项的大小全部都是取决于父容器的,则保持原状,什么都不变 //对一个有该属性的容器改变其大小,不会有任何反应 //子项值改变时,向父容器发送通知,进行重新布局 //--自定义 SIZETYPE_Custom //根据一个自定义的接口计算 } SIZETYPE; /*/位置 typedef struct _POS { int val; //值(逻辑),可能是坐标或长度 int phyval; //物理值,计算得到的实际设备坐标 //POSTYPE type; //值的类型 } POS;*/ //维度值(长度) typedef struct _DIM { int val; //值(逻辑),可能是坐标或长度 int phyval; //物理值,计算得到的实际设备坐标 SIZETYPE type; //值的类型 } DIM; //布局元件 typedef struct _BaseWidget { int classid; //继承自IPersist HWND handle; //窗口句柄/布局框句柄 BaseWidget *parent; DIM padding[4]; int/*POS*/ x, y; //位置是外部设置(isFree=1),或者自动计算(isFree=0),相对于父容器的坐标 DIM width, height; //大小 union { //int isWindow:1; //是否是窗口 可用handle是否为NULL代替 //int isFree:1; //显示方式:1自由设置|0由父容器策略设置 这个应该是布局容器的属性 int isVisible:1; //1显示/0隐藏 }; void (*GetRect)(BaseWidget *me, RECT *rt); void (*Move)(BaseWidget *me, int x, int y, int width, int height); //Move = Resize + OnResize int (*OnResize)(BaseWidget *me, int x, int y, int width, int height); } BaseWidget; //最大间隔数 #define MAXGAP 10 typedef struct _LayoutContainerBase { //RECT rt; //实际坐标 //enumLayoutType type; //void (*onSize)(LayoutContainer *me, int left, int top, int right, int bottom); int count; //子项长度 BaseWidget* pchildA[1]; //子项 } LayoutContainerBase; //布局元件 typedef struct _BlankWidget { BaseWidget *parent; } BlankWidget; //同步布局容器,和某个widget的大小,位置保持同步 typedef struct _SyncContainer { LayoutContainer layout; BaseWidget *sync_wgt; //同步的widget } SyncContainer; typedef struct _BoxLayoutContainer { BaseWidget widget; int gapnum; //间隔数 XY gap[MAXGAP]; //间隔,两个子项之间的距离,循环应用该数组 enumLayoutStrategy strategyH, strategyV; LayoutContainerBase layout; } BoxLayoutContainer; /*typedef struct _GridLayoutContainer { LayoutContainer layout; int colnum; XY padding[4]; XY gapH[MAXGAP], gapV[MAXGAP]; enumLayoutStrategy strategyH, strategyV; } GridLayoutContainer;*/ #endif