看似简单的输入控件,工作量巨大

最近正在撰写、开发的小工具,我决定所有的控件都自己实现,例如最简单的“文本输入框”,看似简单,其实内部机制很多,开发起来工作量是巨大的。 这个控件不仅要完成文字的录入,还要有“焦点”和“光标”的概念,当然要有,如果没有焦点,APP又如何知道当前是否处于输入状态、输入内容要交给页面上的哪一个控件处理呢? 光标是“焦点”的外在表现形式,当前页面上的“可聚焦”控件,谁处于“焦点”状态,谁就是拥有闪烁光标的。并且光标还要可以左移、右移、移至行首、移至行尾、上翻页、下翻页,甚至还可以跨单词移动……这些对光标的控制就已经是一个小的子功能模块了。 只有焦点和光标,只能说是完成了基本的文字录入功能,但还欠缺对“中文输入法”这样的IME输入的支持。和ascii输入不同,IME输入是有两套输入文字的,一套是预输入文字、一套是正选提交文字,两套文字要同时显示在输入框中,并且预选输入文字是会实时变化、并且可能出现在正式提交文字的任何中间区域的。这就给渲染文字带来了更复杂的逻辑,想正确实现也不是几行、几十行代码就能实现的。 简单和鼠标的控制也要考虑到,因为输入框内的文字是可以通过键盘或鼠标进行“框选”的,框选部分文字会“反色”以示意为选中状态。 单纯的“选中”是不够的,还要支持对选中的文字进行复制、剪贴,或者对光标所处位置进行文字的粘贴操作。这就又涉及到对系统粘贴板的操作。 有了复制、粘贴等功能,自然而然想到的就是这个输入框实际是有上下文菜单的,鼠标点击右键或通过键盘操作,可以唤出上下文菜单,并通过菜单进行撤销、全选、复制、粘贴、剪贴等操作。 除了上面这些功能之外,输入框内的输入内容如果是网址,可能还要做蓝色渲染和鼠标可直接点击打开等操作,这就更细化,更繁琐了。 如上,像完成一个基本的input text control,看似简单,内部机制非常繁杂。

自己动手写个小应用

一、放弃wxWidgets 之前尝试用wxWidgets框架写应用,后来越写越不顺手,所以当代码到达3000行的时候,我就动摇了。想了2-3天,不断地摇摆,最终决定放弃使用wxWidgets,自己实现。而且不借助已有的GUI框架,自己实现用到的UI组件。 因为我想实现的应用程序本身并不复杂,用到的UI组件也不会很多,所以实现难度估计应该不大。实际上经过这几天的初步尝试,感觉也还是非常良好的。 自己实现组件,主要就是对渲染和交互的控制,而且我只需要不到10个基础组件,所以现在代码量2000行左右,已经有了一个大概的模样,预计再有一周左右就可以粗糙的实现出来了。 自己动手实现这些组件更大的好处是控制权限更高,例如事件的传递机制,我可以按照自己的想法进行链式的、广播式的、或者就是定向的传递,十分的灵活。当然这种灵活的前提是建立在良好的封装的基础上的,否则一旦没有及时的进行归纳和封装,就有可能将代码写乱、写花,所以每一个新机能的增加,都要对所有已实现的部分进行一边重构、归纳,这是比较花时间的事情。 不过这样做也有好处,就是一旦当前的小工具实现完毕,就拥有了一个简陋的Simple GUI,这样可以为今后再实现其他软件进行复用,持续做下去,不仅能够丰富自己的基础代码库,也能令后期的开发越来越便捷。 如此看来,现在经历的“枯燥”也许是有价值的,只不过它需要时间去验证、还需要一定的坚持才能见到回报。 二、初步的实现和初步的想法 既然已经决定自己从底层一点点慢慢写起,我也就不急于将最终的工具实现出来了,至少不基于做出一个“公众版”出来,只要自己能先用起来也就可以了。 而且自己实现就意味着要在一张画布上自己实现每一个控件和事件,也就无所谓用什么引擎。基本上能用的窗口管理器+图像引擎都可以拿来使用。这样想来,OpenGL应该是首选、其次SDL2、再次DirectX12。既然无所谓,所以我索性就三种引擎都试一试,都写了一写,最终哪一套的实现效果好并且开发难度小,最终的“公众版本”就基于哪一套继续开发就好了。 至于这个工具的目标平台,其实最初我考虑就是做在Windows系统上,虽然当初选择wxWidgets也有一定的跨平台考虑,但并不迫切。可既然如今决定“在一张白纸上”实现自己的基础控件,也就是说理论上它的跨平台移植能力应该也是有的,所以等到做公众版的时候,可以考虑多平台一起实现出来。 不过上面这些也只是初步的想法、幻想。我甚至这样做的工作量将是巨大的,没有3、5个月,估计连个影子都看不到。所以还是要坚持每天写上一写,才有可能将这个美好的“幻想”尽可能想着“现实”实现出来。

Install Ubuntu on My PC

There is an old PC computer in my home, more than 3 years never used it. Last day, I decided reuse it and install Ubuntu on it….