关于窗口show前设置DPI缩放

光庆 3月前 427

1、在dpi为100的情况下,在窗口show之前计算组件尺寸,运行以下代码:

import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=663)
mainForm.add(
edit={cls="edit";text="Edit";left=8;top=568;right=840;bottom=648;edge=1;multiline=1;z=3};
plus={cls="plus";text="我是按钮";left=8;top=464;right=840;bottom=552;bgcolor=8388736;font=LOGFONT(h=-32);z=2};
vlist={cls="vlistEx";left=10;top=10;right=840;bottom=456;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}
)
/*}}*/
var t = { fields={"序号","姓名","年龄","地址","身份证"} };
for(i=1;10;1){
    var tt={};
    tt["序号"]="[@rowindex]";  // 行序号标记是不允许编辑修改的
    tt["姓名"]="["+string.random(math.random(1,10))+"]";
    tt["年龄"]="["+string.random(math.random(1,20))+"]";
    tt["地址"]="["+string.random(math.random(1,30))+"]";
    tt["身份证"]="["+string.random(math.random(1,40))+"]";
    ..table.push(t,tt);
}
mainForm.vlist.setTable(t);

mainForm.vlist.setColWidthFit();
mainForm.plus.width = 500
mainForm.edit.width = 500

mainForm.show();

mainForm.edit.text = "plus宽度"++mainForm.edit.width
win.loopMessage();

结果是正常的:

2、在dpi不是100的情况下,如150,运行结果如下:

结果是错误的。

那是因为窗口的在show()时,初始化了dpi设置,导致show()之前设置的尺寸都不准确了。

3、解决方法:

计算组件尺寸前,先初始化窗口dpi:

mainForm.enableDpiScaling("init"); // 加入这句

import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=663)
mainForm.add(
edit={cls="edit";text="Edit";left=8;top=568;right=840;bottom=648;edge=1;multiline=1;z=3};
plus={cls="plus";text="我是按钮";left=8;top=464;right=840;bottom=552;bgcolor=8388736;font=LOGFONT(h=-32);z=2};
vlist={cls="vlistEx";left=10;top=10;right=840;bottom=456;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}
)
/*}}*/
var t = { fields={"序号","姓名","年龄","地址","身份证"} };
for(i=1;10;1){
    var tt={};
    tt["序号"]="[@rowindex]";  // 行序号标记是不允许编辑修改的
    tt["姓名"]="["+string.random(math.random(1,10))+"]";
    tt["年龄"]="["+string.random(math.random(1,20))+"]";
    tt["地址"]="["+string.random(math.random(1,30))+"]";
    tt["身份证"]="["+string.random(math.random(1,40))+"]";
    ..table.push(t,tt);
}
mainForm.vlist.setTable(t);

mainForm.enableDpiScaling("init"); // 加入这句
mainForm.vlist.setColWidthFit();
mainForm.plus.width = 500
mainForm.edit.width = 500

mainForm.show();

mainForm.edit.text = "plus宽度"++mainForm.edit.width
win.loopMessage();

4、虚表也顺便增加了一个函数引用,封装为 initDPI() 函数,或使用 窗口参数  initDPI=true 设置:

import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=663)
mainForm.add(
edit={cls="edit";text="Edit";left=8;top=568;right=840;bottom=648;edge=1;multiline=1;z=3};
plus={cls="plus";text="我是按钮";left=8;top=464;right=840;bottom=552;bgcolor=8388736;font=LOGFONT(h=-32);z=2};
vlist={cls="vlistEx";left=10;top=10;right=840;bottom=456;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1;initDPI=true}; //使用窗口参数
)
/*}}*/
var t = { fields={"序号","姓名","年龄","地址","身份证"} };
for(i=1;10;1){
    var tt={};
    tt["序号"]="[@rowindex]";  // 行序号标记是不允许编辑修改的
    tt["姓名"]="["+string.random(math.random(1,10))+"]";
    tt["年龄"]="["+string.random(math.random(1,20))+"]";
    tt["地址"]="["+string.random(math.random(1,30))+"]";
    tt["身份证"]="["+string.random(math.random(1,40))+"]";
    ..table.push(t,tt);
}
mainForm.vlist.setTable(t);

mainForm.vlist.initDPI();//使用内置函数
mainForm.vlist.setColWidthFit();
mainForm.plus.width = 500
mainForm.edit.width = 500

mainForm.show();

mainForm.edit.text = "plus宽度"++mainForm.edit.width
win.loopMessage();

5、建议:

对组件尺寸的操作,都放到窗口show函数之后进行。


最新回复 (1)
  • 近我者赤 3月前
    0 2
    前段时间正在纠结这个问题,这下好了。~\(≧▽≦)/~
返回