SOUI官方论坛

 找回密码
 立即注册
查看: 3854|回复: 20

SOUI3.0 dpi缩放Demo

  [复制链接]
  • TA的每日心情
    开心
    2020-7-2 09:40
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    41

    主题

    428

    帖子

    2674

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2674

    突出贡献优秀版主

    发表于 2019-12-6 16:43:08 | 显示全部楼层 |阅读模式
    dpiaware.gif
    最近做启程输入法,在输入法皮肤中增加高分屏支持。
    原来启程输入法是计划不同dpi的屏幕就让用户切换到不同的皮肤,这样我的代码比较省事,但是增加了用户的学习成本,也增加了皮肤的配置复杂度(为了适配不同的屏幕需要为一个主题制作多款皮肤)。
    为此花了一天时间让一款皮肤支持多个DPI。
    SOUI原来就考虑好了皮肤资源在高分屏上的放大处理。也有一个demo: multilang_demo,那个demo最开始是演示多语言动态切换的,后来又加上了窗口放大(适配dpi)的演示。不过可能很多人并不知道,而且那个demo由于没有加上dpiaware的清单文件,在用户在高分屏下启用放大后,窗口会变模糊,也误导了部分小白。
    这里这个demo是专门演示怎么使用高分屏的,配置好了dpiaware的清单文件,windows系统不会放大我的窗口,但是当打开支持缩放的窗口时,窗口会根据当前的屏幕放大系数自动放大窗口,使窗口放大但界面不模糊。

    代码很简单,先看一下两个布局XML文件:
    1. <SOUI name="dlg_scale" title="@string/title" bigIcon="ICON_LOGO:32" smallIcon="ICON_LOGO:16" margin="5,5,5,5"  resizable="1"
    2. appWnd="1"
    3. translucent="1"
    4. >
    5.   <user autoScale="true"/>
    6.   <root skin="_skin.sys.wnd.bkgnd" cache="1"  width="300" height="200" layout="vbox">
    7.     <caption size="-2,30" font="adding:0">
    8.       <icon pos="10,8" src="ICON_LOGO:16"/>
    9.       <text pos="29,9">@string/title</text>
    10.       <imgbtn id="IDCANCEL" skin="_skin.sys.btn.close"    pos="-45,0" tip="close" animate="1"/>
    11.    </caption>
    12.     <window size="-2,0" weight="1" gravity="center" layout="hbox">
    13.       <text text="自动DPI缩放窗口" colorText="@color/green"/>
    14.     </window>
    15.   </root>
    16. </SOUI>
    复制代码
    1. <SOUI name="dlg_scale" title="@string/title" bigIcon="ICON_LOGO:32" smallIcon="ICON_LOGO:16" margin="5,5,5,5"  resizable="1"
    2. appWnd="1"
    3. translucent="1"
    4. >
    5.   <user autoScale="false"/>
    6.   <root skin="_skin.sys.wnd.bkgnd" cache="1"  width="300" height="200" layout="vbox">
    7.     <caption size="-2,30" font="adding:0">
    8.       <icon pos="10,8" src="ICON_LOGO:16"/>
    9.       <text pos="29,9">@string/title</text>
    10.       <imgbtn id="IDCANCEL" skin="_skin.sys.btn.close"    pos="-45,0" tip="close" animate="1"/>
    11.     </caption>
    12.     <window size="-2,0" weight="1" gravity="center" layout="hbox">
    13.       <text text="禁用自动DPI缩放窗口" colorText="@color/red"/>
    14.     </window>
    15.   </root>
    16. </SOUI>
    复制代码
    上面两个布局,最重要的区别是和root节点平行的user节点中的autoScale属性。
    user节点不是SOUI处理的布局节点,3.0.0.15碰到这些非布局节点会通过SHostWnd::onUserXmlNode虚方法传递到应用层。应用层实现该方法来处理XML中的特定配置信息。
    下面看一下主要的窗口类:

    1. class CScaleDlg : public SHostDialog, public SDpiHandler<CScaleDlg>
    2. {
    3.         bool m_bDpiAware;
    4. public:
    5.         CScaleDlg(LPCTSTR pszLayout);
    6.         ~CScaleDlg(void);

    7. protected:
    8.         void OnUserXmlNode(pugi::xml_node xmlUser) override;
    9.         bool IsDpiAware() const override;
    10.         

    11.         BEGIN_MSG_MAP_EX(CScaleDlg)
    12.                 CHAIN_MSG_MAP(SDpiHandler<CScaleDlg>)
    13.                 CHAIN_MSG_MAP(SHostDialog)
    14.         END_MSG_MAP()
    15. };

    16. CScaleDlg::CScaleDlg(LPCTSTR pszLayout):SHostDialog(pszLayout),m_bDpiAware(false)
    17. {
    18. }

    19. CScaleDlg::~CScaleDlg(void)
    20. {
    21. }

    22. void CScaleDlg::OnUserXmlNode(pugi::xml_node xmlUser)
    23. {
    24.         if(wcsicmp(xmlUser.name(),L"user")==0)
    25.         {
    26.                 m_bDpiAware = xmlUser.attribute(L"autoScale").as_bool();
    27.         }
    28. }

    29. bool CScaleDlg::IsDpiAware() const
    30. {
    31.         return m_bDpiAware;
    32. }
    复制代码
    dpi消息处理相关的代码已经包装到SDpiHandler这个模板中了,使用时继承它即可。
    SDpiHandler会调用IsDpiAware这个虚方法来判断窗口是否需要自动处理dpi。

    源代码如下:
    游客,如果您要查看本帖隐藏内容请回复



  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    15

    主题

    39

    帖子

    1849

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1849

    热心会员突出贡献

    发表于 2019-12-6 16:52:44 | 显示全部楼层
    沙发:lol:lol:lol:lol:lol:lol:lol:lol:lol:lol
    回复

    使用道具 举报

  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 131 天

    [LV.7]常住居民III

    439

    主题

    1029

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    11937
    发表于 2019-12-6 16:52:48 | 显示全部楼层
    谢谢老大分享,SOUI又进步了
  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 131 天

    [LV.7]常住居民III

    439

    主题

    1029

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    11937
    发表于 2019-12-9 17:15:18 | 显示全部楼层
    问个问题,若布局是依据1980*1080布局的全屏应用,在1366*768的屏幕上是如何显示的?之前是有一部分显示不出来
  • TA的每日心情
    开心
    2020-7-2 09:40
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    41

    主题

    428

    帖子

    2674

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2674

    突出贡献优秀版主

     楼主| 发表于 2019-12-9 22:46:42 | 显示全部楼层
    admin 发表于 2019-12-9 17:15
    问个问题,若布局是依据1980*1080布局的全屏应用,在1366*768的屏幕上是如何显示的?之前是有一部分显示不 ...

    你这个问题应该是需求问题。
    你的界面是依据1080P布局,这个布局允许缩放吗?如果允许,那直接将窗口大小设定为768P就解决问题了。
    如果不允许,你在768P显示器上就只能截断了。

    该用户从未签到

    3

    主题

    18

    帖子

    52

    积分

    24:00金丹期

    Rank: 2

    积分
    52
    发表于 2020-2-20 12:48:40 | 显示全部楼层
    非常谢,又学习了一招。

    该用户从未签到

    3

    主题

    9

    帖子

    69

    积分

    24:00金丹期

    Rank: 2

    积分
    69
    发表于 2020-3-11 10:08:45 | 显示全部楼层
    这个3.0版本才有吗?
  • TA的每日心情
    开心
    2020-7-2 09:40
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    41

    主题

    428

    帖子

    2674

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2674

    突出贡献优秀版主

     楼主| 发表于 2020-3-12 17:16:08 | 显示全部楼层
    lanzhiyu520 发表于 2020-3-11 10:08
    这个3.0版本才有吗?

    2.X也有,不过不完善。
  • TA的每日心情
    奋斗
    13 小时前
  • 签到天数: 102 天

    [LV.6]常住居民II

    13

    主题

    112

    帖子

    3367

    积分

    08:00大乘期

    Rank: 8Rank: 8

    积分
    3367
    发表于 2020-3-27 10:27:48 | 显示全部楼层
    不错 不错啊

    该用户从未签到

    8

    主题

    29

    帖子

    212

    积分

    02:00元婴期

    Rank: 3Rank: 3

    积分
    212
    发表于 2020-4-1 11:25:35 | 显示全部楼层
    谢谢大佬分享
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|SOUI官方论坛 ( 粤ICP备18103663号-2 )

    GMT+8, 2020-7-10 22:59

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表