类可以把需要重复使用的代码封装到一起多次使用,

但这样的代码仍不能被不同的程序使用。

把自己常用的代码编到一起,打包成库的话,就能制成一套自用工具库作为基础设施。

这里常用的部分,首先就是界面控件。

我希望仿造出一套普通PLC编程软件自带的模拟面板功能中常见的控件:

  • 按钮
  • 文本框
  • 进度条

结构

  • 用类封装一个点。
  • 在点的基础上扩展一个方块。
  • 在方块的基础上扩展一个基本控件。
  • 在元素的基础上扩展出各个控件。
class Point{...}
class Rect extends Point{...}
...
class Element extends Rect{...}
...
class Button extends Element{...}
class Lamp extends Element{...}
class TextBox extends Element{...}
class Gauge extends Element{...}
...


点和方块

  • 点和方块的方法只负责改变坐标与尺寸数据,不负责描绘。
  • 方块可以对齐其他方块,可以根据其他方块调整自己的位置与尺寸。
class Point{int x, y;void setLocation(int _x, int _y){...}
}

class Rect extends Point{int w, h;void setSize(int _w, int _h){...}
}

  • 点和方块也可以有参考其他点和或方块来设定位置和尺寸的方法,更方便于对其。
...
void setLocation(Point _p){...}
void setLocation(Point _p, int _offsetX, int _offsetY){...}
void setSize(Rect _r){...}
void setSize(Rect _r, int _offsetW, int _offsetH){...}

方块可以提供一些基本的计算功能,比如告诉外界是否包含某个点,告诉外界自己的中心位置,告诉外界自己的边界位置。

...
int getCenterX(){...}
int getCenterY(){...}
int getEndX(){...}
int getEndY(){...}
...
boolean contains(int _x, int _y){...}
boolean contains(Point _p){...}


基本控件

  • 基本控件包含名称,显示字符,识别号等信息。
class Element extends Rect{int ID;String key, name, text;...
}

  • 基本控件可以被点亮,有一个布尔值记录它的状态。控件本身只记录是否被点亮时可亮部分显示的不同颜色。
...
color onColor, offColor, nameColor, textColor;
boolean isActivated, isEnabled, isVisible;
...

  • 基本控件可以被描绘。并提供一些基本的现实字符和名称的功能。描绘功能自然需要在窗口的主循环draw() 内调用,为方便起见可以标记为接口。
interface Updatable{void update();
}...class Element extends Rect implements Updatable{...@Override void update(){//draw code...}...
}

  • 基本控件可以被点击,可以判断是否被鼠标悬浮,但是不会做出反应,这一部分可以留到需要做出可点击效果的控件里实现。
...
public final boolean isMouseOver(){...}
...


按钮和灯控件

  • 基础控件本身就可以被点击和点亮所以仅决定如何描绘这个控件。
  • 控件样式可以简单通过构造方法配置。
class Button extends Element{public Button(...){super();setID(...);setName(...);setSize(...);setLocation(...);set...}@Override void update(){...}
}

class Lamp extends Element{public Lamp(...){super();set...}@Override void update(){...}
}


文本框和进度条控件

  • 文本框用一种特别的画法专门显示文本,提示值或者状态。
  • 文本框可以设计成背景颜色随控件本身的被点亮状态变化,另外可以设置文本颜色。
class TextBox extends Element{public TextBox(...) {super();set...}@Override void update() {drawBackground(...);drawActivatableParts(isActivated?onColor:offColor);drawText(textColor...);}...
}

  • 进度条保有一个现在值,将这个值用长度表现出来。
  • 为了能简便地使用掩码限制值,进度条的值范围设计为在整形0-127范围内变化。
class Gauge extends Element{int value;...@Override void update(){...rect(..., ...map(value,0,127,0,w),...);...}...
}

  • 但在设定时可以给出各种方便的设定方法,在设定是做转换。比如浮点 0.0 - 1.0 范围设定,整数0-100设定,给定最大值设定,等等。
...
void setValue(float _value){...}
void setValue(float _value, float _max){...}
void setValue(int _value){...}
void setValue(int _value, int _range){...}
...

  • 进度条可以设置方向(纵/横)和条颜色及是否带边框。
...
boolean hasStroke, isVertical;
color backColor,strokeColor;
...


容器

  • 上述控件可以单独在全局建立,挨个在主循环里刷新描绘,但数量增多后会变得混乱难以管理。如果有一个容器容纳控件并负责刷新描绘将会方便很多。
class BaseCoordinator{ArrayList<Element> elementList;...final void update(){...for(Element it:elementList){update();}...}...
}

  • 容器可以被单独添加控件,也可以被添加一组控件。
...
void addElement(Element _e){...}
void addElement(ArrayList<Element> _list){}
...

  • 容器知道当前被鼠标悬浮的控件的识别号,并能传达到外界,让其他部分在鼠标点击时决定应该做什么工作。
...
int mouseID;
...
final void update(){...mouseID=0;for(Element it:elementList){it.ccUpdate();if(it.isMouseOver()){mouseID=it.getID();}}...
}
...
int getMouseID(){...}
...

  • 容器可以不直接拥有控件的引用,通过在实际使用的窗口程序外部继承后使用。有些需要在之后修改属性读取状态的控件可以保有引用,而不需要的则可以直接添加。
class MyActualCoordinator extends BaseCoordinator{TextBox someBox;Gauge someGauge;EcElementCoordinator(){super();someBox = new TextBox(...);addElement(someBox);someGauge = new Gauge(...);someGauge.setLocation(someBox,HORIZON_GAP,VERT_GAP);addElement(someGauge);addElement(new EcButton("some_button", ... ));addElement(new EcLamp("some_lamp", ... ));...}
}

  • 继承后创建实例在在实际窗口程序内刷新使用。
...
MyActualCoordinator coordinator;
...void setup(){...coordinator=new MyActualCoordinator ();...
}void draw(){...coordinator.update();...
}void mousePressed(){switch(coordinator.getMouseID()){...case ......default: ... }
}


其他

  • 另外控件绘制比例和配色信息可以做成一些常量设置到别处,方便修改。
// pix
static final intBUTTON_STROKE = ...LAMP_STROKE = ......
;// color
static final intCOLOR_BUTTON_SHADOW  =  0xFF......COLOR_BUTTON_FILL_NORMAL  =  0xFF......COLOR_BUTTON_FILL_MOUSEOVER  =  0xFF......COLOR_BUTTON_FILL_CLICKED  =  0xFF......COLOR_LAMP_STROKE  =  0xFF.........
;



https://github.com/keyboard2769/nb-kosui/tree/master/src/kosui/ppplocalui​github.com

判断鼠标不在控件上_基础设施:一套基本控件相关推荐

  1. hs控什么意思_图文讲解传统双控、多控如何升级为米家智能家居的无限控

    小白中完全不懂电路,然后智能家居就更不懂的占比还挺多,问的问题怎么说呢,你还不知道该怎么三言两语回答他,好吧,写一篇如何把家里双控线路改造为智能家居无限控的详细讲解文章,为大家彻底解惑^_^ 如果想要 ...

  2. 显控一体机选型_一种船用显控一体机的制作方法

    本实用新型涉及船舶控制技术领域,具体为一种船用显控一体机. 背景技术: 船舶指各种船只的总称.船舶是能航行或停泊于水域进行运输或作业的交通工具,按不同的使用要求而具有不同的技术性能.装备和结构型式. ...

  3. C#之在PictureBox控件上画点

    C#之在PictureBox控件上画点 如何在PictureBox控件上实现鼠标每左击一次就会画一个点呢?这里总结了两种方法. 首先在窗体上插入PictureBox控件和一个Button按钮,当点击按 ...

  4. FMX探索之IMAGE控件上输出

    承上篇 话说直接在窗体上绘制有欠美观,那就画在IMAGE控件上吧.拖一个IMAGE控件出来,改下代码: procedure TForm1.Button2Click(Sender: TObject); ...

  5. MFC 内容显示到控件上

    SetDlgItemText (ID, str) // 文字显示到控件上 ID要显示的控件,str 显示在控件上的文字 GetDlgItemText (ID, str) // 提取控件上的文字 ID要 ...

  6. python socket tcp远控_Python3实现ICMP远控后门(上)

    这几天一直在研究远控木马的一些通信协议,比如TCP,UDP,ICMP,DNS,HTTP等等,对于TCP,UDP这两种就不讲解了,因为太常见了. 大家可能对采用ICMP,DNS的木马不是很熟悉,其实这两 ...

  7. qt获取窗口的右上角位置_如何获得 Qt窗口部件在主窗口中的位置--确定鼠标是否在某一控件上与在控件上的位置...

    用Qt Creator 设计程序时,最方便的就是ui设计器,可以很容易的得到想要的布局. 但是这样自动布局带来的后果是很难知道窗口中某一部件在主窗口中的相对位置. 在处理子窗口鼠标事件时变的很麻烦.主 ...

  8. 判断鼠标不在控件上_VB常用控件属性讲解单选按钮、复选框总结

    1 单选按钮.复选框做为VB编程中的选择性控件,在实际程序中有着广泛的应用,所以熟练掌握其特殊属性的用法就很重要了! 单选按钮.复选框的实际应用图 复选框(CheckBox)控件 属性 说明 Name ...

  9. C#中,当鼠标移动到控件上,动态显示提示内容 - 用代码操作ToolTip

    [背景] 写了个C#的小程序,其中在Settings窗体中有些配置参数,希望在鼠标移动到对应的配置选项上,动态显示相关的说明解释内容. [解决过程] 1.原先就已经知道,有些控件,是带ToolTipT ...

最新文章

  1. Feature Selection: A Data Perspective --阅读笔记1 特征选择的概述
  2. .Net面试题(3)
  3. Jmeter-基础篇
  4. first blog
  5. caddy 作为微服务的 API gateway
  6. IDEA git 切换分支注意事项
  7. [数据库]MySQL表分区
  8. dell服务器系统备份软件,使用 AlienRespawn 备份 Alienware 电脑的系统
  9. Leedcode 875. 爱吃香蕉的珂珂
  10. 过滤器实现用户访问记录日志记录
  11. 用USART接口代替SPI怎么做?
  12. POE供电 网线 电源 网络情况图
  13. 忍者必须死代码 免费
  14. eclipse介绍与使用
  15. Python - yamail - 进阶之路 - Day08
  16. 计算机主机安全属性包括,计算机安全属性包括哪些
  17. 20句黑客经典语录,一个黑客的内心独白
  18. php unix时间戳,php UNIX时间戳用法详解
  19. 【搞定Java并发编程】第24篇:Java中的并发工具类之CountDownLatch
  20. 资产定价Model——随机变量因子

热门文章

  1. linux下通过yum安装svn及配置
  2. uva 610(割边)
  3. 除了速度,5G还能带来什么?
  4. Go语言连接 zookeeper
  5. PHP解决约瑟夫环问题
  6. Android 设定横屏,禁止屏幕旋转,Activity重置 [更新视频播放器相关]
  7. ubuntu 13.04 gnome terminal打开默认最大化方法
  8. 获取AppStore上架后的应用版本号
  9. SAP 开发陷阱一箩筐(01)——创建了函数组却无法激活
  10. MySQL使用可重复读作为默认隔离级别的原因