SOUI官方论坛

 找回密码
 立即注册
查看: 263|回复: 4

SOUI3.0 dpi缩放Demo

[复制链接]

该用户从未签到

21

主题

238

帖子

1033

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1033

突出贡献优秀版主

发表于 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。

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



该用户从未签到

10

主题

24

帖子

1337

积分

06:00合体期

Rank: 6Rank: 6

积分
1337

热心会员突出贡献

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

使用道具 举报

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

    [LV.3]偶尔看看II

    361

    主题

    803

    帖子

    7103

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

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

    [LV.3]偶尔看看II

    361

    主题

    803

    帖子

    7103

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

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

    该用户从未签到

    21

    主题

    238

    帖子

    1033

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1033

    突出贡献优秀版主

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

    你这个问题应该是需求问题。
    你的界面是依据1080P布局,这个布局允许缩放吗?如果允许,那直接将窗口大小设定为768P就解决问题了。
    如果不允许,你在768P显示器上就只能截断了。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2020-1-23 18:44

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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