• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2022-05-30 22:04 Aet 隐藏边栏 |   抢沙发  13 
文章评分 2 次,平均分 5.0

消息通讯

真窗口

  1. ::SendMessage

SOUI控件

  1. SOUI中可以使用SWindow::SSendMessage来向一个目标窗口发送一个消息来通讯,但不支持PostMessage,目标窗口在SOUI窗口的消息映射表中响应发送过来的消息。

SOUI事件机制

  1. 每一个事件对应一个EventArg类,事件在控件中使用FireEvent启动事件路由,应用程序可以在事件响应映射表中对各种事件统一处理,也可以使用subscribeEvent来直接订阅特定SOUI窗口的一个事件,直接将事件与事件处理函数关联起来。

Offset和Pos2type

  1. 当窗口大小不确定时,SOUI提供了pos2typeoffset来处理相对位置。
  2. offset属性是SOUI在通过pos属性完成坐标定位后再将坐标进行偏移的属性。和pos中一般使用象素为单位不同,offset是以控件最后的大小为单位进行平移。
pos2type offset
center -0.5,-0.5
lefttop 0,0
leftmid 0,-0.5
leftbottom 0,-1
midtop -0.5,0
midbottom -0.5,-1
righttop -1,0
rightmid -1,-0.5
rightbottom -1,-1

cache

问题

  1. 一般子窗口会比父窗口小,子窗口请求重绘时,要执行父窗口的绘制函数,如果父窗口没有根据当前的裁剪范围来确定自己的绘制范围,那么尽管有裁剪区简直了不会绘制超出边界,在实际执行过程中,超出裁剪区的绘制行为也可能极大的影响UI的性能。

方案

  1. 让每个窗口的绘制方法都实现只绘制在裁剪区的那部分。
    1. 实现起来比较麻烦,裁剪区的计算算法可能是一个瓶颈。
  2. 让每个窗口都保持背景窗口的内容,当窗口需要刷新时,直接把背景内容拿过来在上面画。
  3. SOUI中,使用了cache的机制。
    1. 当cache为0时,窗口的绘制和之前提到的流程是一致的,如果窗口比较大,需要一时半会的区域比较小,就会比较慢。
    2. 当cache为1时,窗口绘制的内容会被保存到一张缓存图上,当其他窗口刷新并导致该窗口重绘时,直接从缓存中复制出来。

PreTranslateMessage

  1. 在SOUI中实现PreTranslateMessage,我们首先需要实现一个接口:

  1. 向当前的MessageLoop注册该IMessageFilter

  1. 获取当前消息循环
    1. 在SHostWnd 或者SHostDialog中可以调用SHostWnd::GetMsgLoop()方法获得
    2. 在SWindow中,则可以调用SWindow::GetContainer()->GetMsgLoop()获得

提供SOUI应用程序渲染性能

更高效的渲染引擎

  1. gdi
  2. gdi+
  3. skia

绘制缓存

  1. cache缓存机制

非背景混合技术

  1. bkgndBlend
    1. 1代表刷新时使用背景混合
    2. 0代表窗口刷新时直接刷新自己,而不请求父窗口刷新背景。

分层窗口

  1. SOUI采用XML定义UI,要定义分层窗口只需要一个layeredWindow="1"的属性即可

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享