LCUI

使用 C、XML 和 CSS 构建简单的跨平台桌面应用

快速上手 下载

当前版本:2.0.0   ·   发布时间:2020-03-03   ·   GitHub 仓库   ·   创建者:lc-soft
Hello, World!
<?xml version="1.0" encoding="UTF-8" ?>
<lcui-app>
  <resource type="text/css">
    #text-hello {
      color: #8cc63f;
      padding: 25px;
      margin: 25px;
      border: 1px solid #000;
      background-color: #fafafa;
    }
    #btn-hello, #input-hello {
      margin: 0 0 0 25px;
    }
  </resource>
  <ui>
    <widget id="text-hello" type="textview">Hello, World!</widget>
    <widget id="input-hello" type="textedit">Hello, World!</widget>
    <widget id="btn-hello" type="button">Submit</widget>
  </ui>
</lcui-app>

概述

LCUI 是一个用 C 编写的图形界面开发库,你可以用 C、XML 和 CSS 创建简单的桌面应用,包括传统的 Win32 桌面应用、Windows 通用应用,目前主要支持 Windows 系统,后续版本将会完善对 Linux 系统的支持。

如果你在熟悉 C 语言的基础上还具备网页开发经验,那么在使用 LCUI 时会更容易上手,因为 LCUI 对 XML、CSS 以及元素布局等的处理方式和浏览器有一些相似的地方,你可以参考左侧的示例代码了解大致效果。

C语言编写

适用于体积较小且主要使用C语言实现的应用程序,以及偏向使用C语言编写简单应用的开发者。

XML + CSS

支持使用 XML 和 CSS 描述界面布局及样式,节省界面开发时间和维护成本。

跨平台

支持 Windows 和 GNU/Linux 系统,可以编写 Windows 桌面应用和通用应用,以及 Linux 桌面应用。

快速上手

最简单方式是使用 lcui-cli 命令行工具创建一个 LCUI 项目,然后试着编译和运行它,看看 LCUI 是怎样运转的,但在使用 lcui-cli 之前你需要在计算机上安装以下工具:

仅仅一个示例应用还不够?可以试试专为 LCUI 打造的 LC Design 组件库。
# 安装 lcui-cli
npm install -g @lcui/cli

# 创建一个名为 myapp 的 LCUI 项目
lcui create myapp

# 进入项目目录
cd myapp

# 运行这个项目
npm run start

样例展示

一些 LCUI 应用程序的效果图

受到地球上的一些人和公司的喜爱

LCUI 解决了许多复杂的问题,得益于 XML 和 CSS 支持,大大的减少了应用程序的界面开发与维护成本,我只需要为界面编写一次代码就能让我的应用在多个平台上呈现一致的界面效果,这使得我能够轻松的为我的应用开发适用于 Windows 通用平台(UWP)的版本,不用再去另外学习 UWP 应用的界面开发技术。目前主要是支持 Windows 平台,期待以后增加其它平台的适配。

参与贡献

开源的意义在于大家都可以以各种形式帮助项目发展

默默点赞

访问 GitHub 上的 LCUI 代码库主页并为 LCUI 贡献一颗星,虽然这样做看上去没多大作用,但或许在以后能够为作者的职业生涯和 LCUI 的发展提供无形的帮助。

反馈问题

测试是最容易参与项目开发活动的一种方式,帮助作者测试现有功能和相关应用程序,以便作者及早发现缺陷并处理它。

关注进展

你可以在 GitHub 上关注 LCUI 项目,每当项目有新的动态都能够及时收到通知,如果你是开发者,或许能够帮助审查新提交的代码、发现潜在的 BUG,或者也可以帮助其他用户解决常见问题。

贡献代码

项目在开发过程中会有很多新的功能需求,每次代码改动都有可能留下新的 BUG,如果你发现某个功能需求或 BUG 是你能够轻松解决的,可以向 LCUI 贡献你的解决方案。

完善文档

现有的 LCUI 相关文档还很少,你可以通过撰写新内容、帮助完善已有内容,或者将现有的文档翻译为新语种以完善 LCUI 的文档。

资金支持

如果你有一些开发需求并愿意支付一定报酬,可以选择在 BeerpayIssueHunt 上为其设置悬赏,这样能够吸引更多的贡献者参与进来,以提高项目的活跃度。

授权与定价

以另一种方式让 LCUI 得到更积极的维护和更新

社区版

免费

适用于普通小项目

查看许可协议

  • 社区支持
  • 允许在闭源软件中使用
  • 提供官方技术支持
  • 提升已反馈的 BUG 的可见度和优先级
  • 提供 BUG 修复或临时解决方案
  • 在文档和网站中展示你的信息

商业版

   2,560 /人/月

适用于需要可靠技术支持的项目

购 买

  • 社区支持
  • 允许在闭源软件中使用
  • 提供官方技术支持
  • 提升已反馈的 BUG 的可见度和优先级
  • 提供 BUG 修复或临时解决方案*
  • 在文档和网站中展示你的信息

* 在合理努力的情况下,并不是每个 BUG 都可以作为技术支持中的一部分来解决

贡献者激励计划

本计划旨在为 LCUI 中的一些待办任务提供初始赏金来吸引志同道合的开发者成为贡献者以加快 LCUI 的更新速度

LCUI 3.x 版本更新计划
6
重构
参考主流开源项目,重新制定 LCUI 的编码风格、源码目录结构、API 设计风格。
问题 简单
500
基础工具库
参考 glib、tboox 等库,设计一个工具库,提供常用数据结构的操作函数、字符串处理函数。
项目 简单
500
布局引擎
参考 yoga 等布局引擎的设计,结合 LCUI 现有的布局需求,重构 LCUI 的布局引擎,使其变得更简单易用。
项目 困难
2000
文本排版引擎
重新设计文本层(TextLayer)模块,基于新的布局引擎实现文本排版,使其更简单易用高效。
项目 中等
500
2D 图形库
参考 cario、skia 等图形库的设计,设计一套简单易用的图形接口并重构 LCUI 现有的图形处理模块。
项目 简单
500
字体库
重构字体模块,使其具备更低的内存占用和更高的性能。
项目 简单
500
其它待办任务
9
重构定时器模块
改用面向对象模式代替单例模式,不再全局共用同一个定时器列表,允许开发者基于定时器接口实现一个定时器线程,以此摆脱 LCUI 主循环对定时器精度的影响。
项目 简单
100
支持编译为 WebAssembly 在浏览器中运行
参考 Qt、ImGui 等同类项目的 WebAssembly 支持方案,为 LCUI 添加相关的构建配置和支持模块,使得 LCUI 应用程序能够编译编译为 WebAssembly 在浏览器中运行。
问题 中等
1000
改进组件增量更新机制
为了应对数十万量级的组件更新,保证界面的流畅度,现有的做法是统计组件的更新耗时然后为每帧更新的组件总量设置一个合适的限制,这种做法并不是最优的,可参考 React 的 Fiber reconciler 的架构,重新设计 LCUI 的组件增量更新机制。
问题 中等
1000
Android 平台适配
为 LCUI 添加适用于 Android 的驱动代码和编译构建脚本。
问题 中等
3000
为 LCUI CLI 添加 XML 编译器
LCUI 的 xml 文件解析功能是由 libxml 库提供支持的,为了缩减 LCUI 的库文件体积、提升用户界面的加载速度,我们可以在编译阶段将 xml 文件预先转换为 C 代码来使用。
问题 简单
200
为 LCUI CLI 添加 CSS 编译器
集成 SASS 预处理器,支持对多个 scss 或 css 文件进行处理、合并和编译,其中的编译只是简单的将处理后的结果转换成 C 中的字符串代码,无需生成 LCUI_StyleSheet 对象的构造代码。
问题 简单
200
添加表格布局支持
基于新的布局引擎添加表格布局支持,每列单元格等宽,每行单元格等高。
问题 简单
500
重写 Trad 编译器
采用 JavaScript 编写,参考 babel、llvm 等同类项目来设计 Trad 编译器的架构。
项目 困难
2000
CSS 引擎
参考主流的 CSS 库的设计,采用更严谨的标识符命名、更健壮可靠的架构,重构 LCUI 的 CSS 数据库和解析器。
项目 困难
2000

常见问题

在看到这激励计划时你可能会有疑问:有能力解决这些问题的开发者哪会浪费时间去搞这个?把时间用在睡觉、健身、学习、娱乐、陪家人、赚加班费等事情上不香吗?的确,有很多有意义有价值的事情需要我们去做,而对于有兴趣参与开源项目并分享自己技术的人而言,参与激励计划也是一件有意义的事情。
  • 因刷腻了算法题而想找点有技术含量、有挑战性且现实项目中存在的问题来解决的算法爱好者
  • 想通过参与项目来锻炼编程能力顺便赚点零花钱的学生。积累的项目经历对他们完成课设或毕设也有帮助。
  • 想参与或开发一个有亮点、有技术含量的项目来提升自己的开源影响力和就业竞争力的初中级开发者。常常能看到有人吐槽程序员内卷很严重,只会在简历中吹牛和熟练背诵面试题的话可能还不足以体现出优势,如果有“参与或开发开源项目”这一加分项的话应该会好很多。
  • 想将自己积累的技术通过开源项目与他人分享的资深开发者
  • 想参与开源项目并与他人进行技术交流的编程爱好者

流程如下:

  1. 挑选任务:在上方的任务列表或文档中的待办事项列表中挑选你感兴趣的任务。
  2. 确认任务有效:在 LCUI 的 GitHub 代码库主页里搜索相关的 issue 和 Pull Request,检查该任务是否被他人认领。
  3. 发起需求讨论:在 LCUI 的 GitHub Discussions新建讨论帖,表明你想认领的任务和想要了解的内容,通过与我们交流让需求更明确。
  4. 确定正式的开发任务:在需求讨论明确后,我们会整理全部需求然后作为新的 issue 提交。
  5. 开始开发:在 LCUI 的 GitHub 代码库主页 Fork 一份副本到你的名下,然后克隆代码库到本地,在新的分支中展开你的工作。
  6. 提交验收请求:工作完成后在 GitHub 上向 LCUI 提交拉取请求(Pull Request),等待我们审查。
  7. 解决验收问题:审查期间我们可能会提交一些审查意见,你需要针对这些意见做相应的改动。
  8. 验收完毕:审查完后我们会接受你的拉取请求,从你的分支拉取你所做的改动并合入主干分支。
  9. 接收赏金:你将会通过悬赏平台或转账的形式收到赏金。
这意味着贡献者可以将用于完成该悬赏任务的代码作为他的个人开源项目来维护,在以解决 LCUI 新版本中的功能需求为前提下,我们可以支持他们打造一个靠谱的开源项目,以此实现双赢。

主要理由如下:

  • 给其他开发者一个打造或推广开源项目的机会。
  • 寻找合适的解决方案。因悬赏任务而开发的项目,会优先考虑我们的需求并给出合适的解决方案,能让我们快速上手并将之应用到 LCUI 中。
  • 促进技术交流和合作。都是国人开发的开源项目,交流和合作比较方便一些,而且由于项目的依赖关系,还有机会为对方的项目反馈问题和建议以及贡献代码。
  • 合理利用现有资源,节约成本。在用其他开源项目前需要花大量时间找文档学习,遇到问题时不容易找到方法,如果用的项目是国人开发的且他有空给你提供技术支持,那就简单多了。
  • 让更多的人参与进来。开源的意义在于大家都可以参与推动项目的发展,而让大家参与的前提是他们知道这个项目是什么、打算做什么以及他们能提供哪些帮助,如果所有工作都让我们自己独自承当的话,那这个项目就会一直停留在自娱自乐的水平。

相信你会习惯性的将悬赏任务当成正式工作然后按照自己当前的薪资来评估它的成本,但受限于经济条件,我们提供的赏金非常有限,现阶段你只能将它当成是刷题网站上的一些带有小额现金奖励的高难算法题。不过也有很多解决办法,例如:

  • 利用你的影响力、人脉或写作能力来推广此项目,知道的人多了自然就会有人愿意给感兴趣的悬赏任务增加赏金。
  • 使用合法手段让作者实现财富自由,这样就能大幅提升赏金数额。

开源软件供应链点亮计划-暑期 2021

开源软件供应链点亮计划 - 暑期 2021 是由中国科学院软件研究所openEuler 社区共同举办的一项面向高校学生的暑期活动,旨在鼓励在校学生积极参与开源软件的开发维护,促进优秀开源软件社区的蓬勃发展。

报名申请项目
summer2021

项目列表

LCUI 的布局引擎支持正常流布局和弹性盒子布局,它的工作流程是根据于每个 UI 组件中的样式和布局参数计算它们的几何属性,与 UI 组件模块有着较强的依赖关系。由于依赖关系的存在使得它不利于做单元测试,对其做单元测试必须先初始化 UI 组件模块,而且按照模块化设计思想,布局引擎应该设计成包含布局元素定义、布局参数定义和相关接口的独立模块,被 UI 组件模块单向依赖,UI 组件模块只需要负责将布局元素附加在 UI 组件上并管理好布局元素之间的关系和布局参数即可。出于这些问题的考虑,我们希望开发一个独立于 LCUI 项目的布局引擎来解决它们。

难度:

导师:刘超

产出要求:

  • 调研 LCUI 源码中的布局引擎的功能需求和实现方式,完成需求分析报告文档
  • 调研 yoga、SnapKit 等开源的布局引擎,收集它们的特点、用法、设计风格等信息,整理成调研报告文档
  • 结合需求文档和调研报告文档,完成项目的 API 设计规范文档
  • 参考主流开源项目的 README.md 文档的写法,完成项目的自述文档
  • 添加单元测试,测试覆盖率达到 80% 以上,无内存访问越界、内存泄露等问题
  • 完成全部 API 的实现,代码编译无警告
  • 将 LCUI 的布局引擎替换为该布局引擎,通过 LCUI 的所有测试,无布局错乱等问题
  • 提供性能测试程序

技术要求:

  • 熟悉 C 或 C++ 编程语言
  • 熟悉在 Linux 和 Windows 系统环境中开发
  • 熟悉常见数据结构和算法
  • 了解 Git 的基本用法
LCUI 的图形处理模块只支持绘制矩形、边框、盒形阴影以及透明度混合,考虑到以后的硬件加速支持、对接其它图形库、扩展更多图形绘制能力等需求,以及历史遗留代码较多、代码设计不严谨、扩展性较差等问题,我们希望开发一个独立于 LCUI 项目的 2D 图形库来解决它们。

难度:

导师:刘超

产出要求:

  • 调研 LCUI 源码中的图形处理类函数的使用情况和需求,完成需求分析报告文档
  • 调研 cario、skia、OpenCV 等主流图形库,收集这些库的特点、用法、设计风格等信息,整理成调研报告文档
  • 结合需求文档和调研报告文档,完成项目的 API 设计规范文档
  • 参考主流开源项目的 README.md 文档的写法,完成项目的自述文档
  • 为每个功能模块添加单元测试,测试覆盖率达到 80% 以上,无内存访问越界、内存泄露等问题
  • 完成全部 API 的实现,代码编译无警告
  • 用该 2D 图形库代替 LCUI 原有图形模块,通过 LCUI 的所有测试,无渲染内容异常等问题
  • 提供性能测试程序,渲染性能不低于 LCUI 原有的图形模块

技术要求:

  • 熟悉 C 或 C++ 编程语言
  • 熟悉在 Linux 和 Windows 系统环境中开发
  • 了解计算机图形学
  • 了解常见数据结构和算法
  • 了解 Git 的基本用法
LCUI 项目中包含了数据结构、字符串、日志、时间、定时器、字符编码等实用类的函数,它们的设计风格和用法不统一,与 LCUI 头文件有较强的依赖,因此我们希望将这些函数分离到独立的项目中作为函数库来维护。

难度:

导师:刘超

产出要求:

  • 调研 LCUI 源码中的基础工具类函数的使用情况和需求,完成需求分析报告文档
  • 调研 tbox、glib 常见开源工具类库,收集这些库的特点、用法、设计风格等信息,整理成调研报告文档
  • 结合需求文档和调研报告文档,完成项目的 API 设计规范文档
  • 参考主流开源项目的 README.md 文档的写法,完成项目的自述文档
  • 为每个功能模块添加单元测试,测试覆盖率达到 80% 以上,无内存访问越界、内存泄露等问题
  • 完成全部 API 的实现,代码编译无警告
  • 将 LCUI 内的工具类函数替换为该函数库的函数,通过 LCUI 的所有测试

技术要求:

  • 熟悉在 Linux 和 Windows 系统环境中开发
  • 熟悉 C 或 C++ 编程语言
  • 了解常见数据结构和算法
  • 具备良好的文字表达能力
  • 了解 Git 的基本用法

导师联系方式

Liu
刘超
LCUI 项目核心开发者、Web 前端开发工程师、业余 C 编程爱好者

邮箱:lc-soft@live.cn

GitHub:https://github.com/lc-soft

Gitee:https://gitee.com/lc-soft

备注:你也可以在 LCUI 代码库的 Issues 页面中沟通