登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 >> 主题: [golang/govcl/lazarus/delphi/lcl]golang 下 govcl 在 windows 中判断是否处于高分屏模式 [还含有一些等宽字体知识]     [回主站]     [分站链接]
标题
[golang/govcl/lazarus/delphi/lcl]golang 下 govcl 在 windows 中判断是否处于高分屏模式 [还含有一些等宽字体知识]
clq
浏览(329) + 2023-07-27 11:43:03 发表 编辑

关键字:

[2023-07-27 17:04:20 最后更新]
[golang/govcl/lazarus/delphi/lcl]golang 下 govcl 在 windows 中判断是否处于高分屏模式

用过 windows 高分屏的网友应该都知道默认的程序都会变模糊,这个时候要调整参数才能清晰。
但清晰界面对于大多数开发工具做出来的程序来说都会让界面变小,这时候就需要将界面自己手工放大一下(宽高成倍其实就可以了,并不复杂)。
过程其实并不难,关键是如何判断是否要放大宽高。实测 govcl 自带的方式是不行的。

以下是一种简单的方式,特别提醒 macos 下是不需要任何处理的,所以说 winodws 还是得努力啊,ui 渲染上它比苹果还是差得有点远。

不同的配置处理方式是不同的,以下处理方式基于几个前提:

1.
在 Initialize 之前调用了 SetScaled

vcl.Application.SetScaled(true); //似乎没什么用。来自 https://gitee.com/ying32/govcl/wikis/pages?sort_id=2242686&doc_id=102420
vcl.Application.Initialize();

2.
在 exe 同名的 .manifest 文件中有以下内容。
    <!-- DPI Aware -->
    <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
            <dpiAware>True/PM</dpiAware>
            <!--//两者有什么区别//<dpiAware>true</dpiAware>-->
            <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
        </asmv3:windowsSettings>
    </asmv3:application>

3.
最后修改代码之前出来的效果应该是: 界面已经清晰化,但被缩小,而字体显示是自动正常了的。

4.
原理其实就是因为字段已经正常了,所以取字体的像素高度与正常值对比就可知放大倍数了(一般是1.25 到 2.5)。

5.
macos 下不需要处理,不过一般的放大倍数是 2.0 效果其实还可以的。

//--------------------------------------------------------
//以下为示例代码,还含有一些等宽字体知识

//放大系数 //可以修改,一般高分屏设置为 2 就可以了,但是有 1.5 这样的情况
var g_ui_scale float64 = 1; //2;
//var g_ui_scale float64 = UI_View_GetScale(); //1; //2;

//自动判断 //还是手工调用比较好,因为有可能一些东西没初始化好
func UI_View_GetScale() float64 {

    if ("windows" == runtime.GOOS) {

        //这个也可以,不过要在 vcl.Application.CreateForm(&mainForm); 之后才行
        // h := vcl.Application.MainForm().Canvas().TextHeight("A");
        // vcl.ShowMessage(IntToStr(int64(h)));

        //h 默认一般是 17 ,高分下就是 31 。所以确实可以用来做简单的判断
        bmp := vcl.NewBitmap();
        //bmp.Canvas().Font().SetName("宋体"); //ok 16,33
        // bmp.Canvas().Font().SetName("simsun"); //ok 16,33
        bmp.Canvas().Font().SetName("arial");  //ok 18, 36    //似乎用这个更准确一点
        bmp.Canvas().Font().SetSize(12);

        //--------------------------------------------------------
        // Courier New 是 Windows 的缺省等宽字体
        // Courier 是一个等宽字体的粗衬线字体,主要是依据打字机所打印出来的字型来设计,于1955年由 Howard "Bud" Kettler 设计完成。
        // 原来的 Courier 字体是 IBM 公司在1950年代设计给打印机使用的字体,但是并未维护他们的专利,使得这个字型成为整个打字机制造业的标准。
        // 在现今的电子时代,此字体也常被使用,因为其等宽的特性可以轻易地对齐字段的左右边界,也成为脚本和程式设计中源代码的常用字体。
        // 12pt的 Courier New 字体曾是美国国务院的公文标准字体,但于2004年1月停用,改使用14pt 的 Times New Roman,因为其具“现代性”和“易读性”。
        //----
        //《华盛顿邮报》获得的一份2023年1月17日发出的电报显示,Times New Roman等衬线字体不利于光学字符识别技术(OCR),改用Calibri字体将使存在视觉或阅读障碍的人士更容易阅读部门通信。
        // 不过 Calibri 字体是无衬线(笔画等宽)字体,在高分屏下没有衬线字体漂亮。
        //--------------------------------------------------------

        h2 := bmp.Canvas().TextHeight("A");
        vcl.ShowMessage("bmp: " + IntToStr(int64(h2)));  //结果是 16 (原始的情况) 或者 33 (两倍的情况), 所以确实可以用来大致计算缩放的比例

if (h2 > 0){
g_ui_scale = math.Round(float64(h2) / float64(16)); //math.Round 取最接近的整数

return g_ui_scale;
}//if 2

        return 2;

    }else{
        return 1;
    }

}//

//func View_SetRect(view vcl.IWinControl, rect crect) { //* vcl.TPanel){
func View_SetRect(view vcl.IControl, rect crect) { //* vcl.TPanel){

//放大系数
var scale float64 = g_ui_scale; //2;

var left int32 = int32(float64(rect.left) * scale);
var top int32 = int32(float64(rect.top) * scale);
var w int32 = int32(float64(rect.width) * scale);
var h int32 = int32(float64(rect.height) * scale);

//不行,目前直接操作 vcl.IControl 会失败 //不是,还是可以的
//view.SetBounds(left, top, left + w, top + h);
view.SetBounds(left, top, w, h);

// p, err := view.(*vcl.TPanel);

// fmt.Println("View_SetRect() error:", err);
// if (p != nil) {
// p.SetBounds(left, top, left + w, top + h);
// }

}//





总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1