Files
msime-windows/ui

msimeui

msimeui 是一个基于 Win32 的 C++ GUI 工程,渲染层使用 Direct2D / DirectWrite,文本输入使用 TSF。

  • 常规界面元素使用 Direct2D / DirectWrite 渲染
  • 使用原生 Win32 窗口作为宿主
  • 文本输入控件内置 TSF 实现
  • 界面结构基于控件树和布局系统

当前内容

当前仓库包含:

  • msimeui 静态库
  • msimeui-demo 示例程序
  • D2D/DWrite 设备资源管理
  • 基础布局和控件树
  • 共享布局属性:margin / padding / 显式尺寸 / min-max 约束 / 对齐
  • StackPanel / HorizontalStackPanel / WrapPanel / ScrollViewer / Grid
  • 通用单子元素容器:Container / Border
  • TextBlock / Button / CheckBox / ProgressBar / Slider / Separator / ListView / TreeView / TabControl / Accordion
  • Card
  • TextBox 输入控件

最近新增

  • demo 页面支持滚轮滚动,便于测试长页面和底部控件
  • 基础控件首帧文字测量修复,按钮初始宽度不会再异常撑满
  • 窗口图标已接入 assets/msimeui.ico
  • 所有 Visual 现支持共享布局属性: margin、padding、width/height、min/max width/height、水平/垂直对齐
  • StackPanel 和 HorizontalStackPanel 现支持内容级对齐
  • 新增通用 Container / Border,可以在不依赖 Card 的情况下组织带内边距和边框的单子元素区域
  • 新增 Grid 布局,支持 Auto / Pixel / Star 三种轨道尺寸模式,适合表单、设置页和双栏内容区
  • ScrollViewer 现支持可见纵向滚动条,并可通过滚轮和拖拽滚动条滑块进行滚动
  • 新增基础 ListView,支持垂直列表项绘制、选中态和点击切换,适合导航列表和设置摘要区
  • 新增基础 TreeView,支持层级节点、展开折叠、选中态和点击切换,适合导航树和模块浏览区
  • 新增基础 TabControl,支持页签头、选中态和内容区切换,适合设置页、工具面板和分组工作区
  • 新增基础 Accordion,支持折叠分组、展开收起和单开/多开模式,适合长设置页和分组内容区
  • 修复了 TabControl / TreeView / Accordion 这类会改变内容结构的控件在切换后未及时重新布局而导致的稳定性问题
  • 修复了单行 TextBox(如 demo 中的 Search Box)输入光标和文本区域未垂直居中的问题
  • 修复了单行 TextBox 在垂直居中后输入法候选框未同步跟随文本区域下移的问题
  • 新增一版场景级 invalidation 机制:控件现可通过 InvalidateMeasure / InvalidateArrange / InvalidateVisual 统一声明布局或重绘失效,Scene / Window 会在下一次绘制前自动补做布局,减少到处手动 Relayout() 的耦合
  • 补充了控件树父子关系和冒泡式失效传播:容器在收养子控件时会建立 parent 链,子控件的布局/重绘失效会先沿控件树向上汇聚,再交给根场景统一处理,为后续做局部布局优化打基础

构建

如果已经配置好本机的 vcpkg 路径,可以直接使用 preset:

cmake --preset vcpkg-debug
cmake --build --preset debug

如果要编译 Release:

cmake --preset vcpkg-release
cmake --build --preset release

也可以继续使用普通 CMake 命令:

cmake -S . -B build
cmake --build build --config Debug

如果本机的 vcpkg 不在 C:/Users/SonnyCalcr/scoop/apps/vcpkg/current,先按自己的环境修改 CMakeUserPresets.json 里的 VCPKG_ROOT 和 CMAKE_TOOLCHAIN_FILE。

也可以直接使用 scripts/ 里的 PowerShell 脚本:

./scripts/configure.ps1
./scripts/build.ps1
./scripts/run-demo.ps1
./scripts/launch-demo.ps1

指定 Release:

./scripts/build.ps1 -Configuration Release
./scripts/run-demo.ps1 -Configuration Release
./scripts/launch-demo.ps1 -Configuration Release

如果切换过 CMake generator、Visual Studio 版本或者 preset,可以加 -Fresh 重新生成构建目录:

./scripts/build.ps1 -Fresh
./scripts/launch-demo.ps1 -Fresh

生成程序默认位于:

build/bin/Debug/msimeui-demo.exe

目录

  • include/msimeui:新框架公开头文件
  • src:框架实现
  • demos/msimeui-demo:demo 入口和示例场景
  • src/tsf:内置 TSF 文本输入实现

后续工作

  • 继续把场景级 invalidation 细化为局部布局和局部重绘,减少全树重排成本
  • 基于现有 parent 链继续引入更细粒度的 subtree dirty 标记和可缓存测量结果
  • 继续完善 TextBox 的输入、样式和布局能力
  • 增加菜单、弹出层、overlay 和更完整的命中/焦点管理
  • 引入资源字典、主题和声明式界面描述