如何在 dm 脚本中获取可用的屏幕尺寸

How to get the available screen size in dm script

我有一个包含很多字段的对话框,因此对话框变得非常大。当我切换到屏幕分辨率较低(较小的屏幕)的计算机时,我最终并没有显示所有内容。特别是 "OK" 按钮无法访问,这使得我的脚本不再可用。

我现在的解决方案是检查屏幕尺寸并估计我可以显示多少输入。其他输入将进入其他选项卡。 但是如何获取屏幕尺寸?(注意只有在没有其他可能性的情况下才应该使用选项卡解决方案。由于各种原因我并不总是想要显示选项卡。 )


我尝试使用 GetMaximalDocumentWindowRect()。当我使用 1 作为第一个参数时,我得到了 window 的当前大小。如果没有其他解决方案,我会坚持下去。但是当 window 没有全屏时,我得到的可用 space 比我可以使用的要小很多。

当我将 0 用于 GetMaximalDocumentWindowRect() 时,我得到 (-16384/-16384) 用于 (left/top) 和 (16383/16383) 用于 (right/bottom) 这是(15 位 (???) 有符号整数的最大值和)显然不是我的屏幕尺寸。

还有对话框函数GetFrameBounds(),但这returns只有当前对话框的尺寸。 WindowGetFrameBounds()函数用于windows,但我没有找到获取应用程序window的方法。此外,这也只提供了我并不真正想要的应用程序的当前大小。


另一个解决方案是使用可滚动的内容。但是我在文档中没有找到任何关于 scrollable 的信息。如果有可能,我更喜欢这种方式而不是创建标签。

以下脚本输出应用程序的一般屏幕信息。使用的命令官方文档中没有,不知道是不是所有GMS版本都有效

ClearResults()
number nScreens = CountScreens()
Result("System info on screens and application window.\n")
Result("**********************************************\n")
Result("\n Number of Screens: " + nScreens )
for( number i=0; i<nScreens; i++ )
{
    string name = ScreenGetName(i)
    Result("\n\n\t Screen #"+i+": "+name)

    number st,sl,sb,sr
    ScreenGetBounds(i,st,sl,sb,sr)
    Result("\n\t\t Bounds:    ["+st+";"+sl+";"+sb+";"+sr+"]")

    number wt,wl,wb,wr
    ScreenGetWorkArea(i,wt,wl,wb,wr)
    Result("\n\t\t Work area: ["+wt+";"+wl+";"+wb+";"+wr+"]")
}

Result("\n\n GMS Application window:\n")
number ap_global_x,ap_global_y
ApplicationGetOrigin(ap_global_x,ap_global_y)
result("\n\t Origin(global coordinates): "+ap_global_x+"/"+ap_global_y)

number ap_t, ap_l, ap_b, ap_r
ApplicationGetBounds(ap_t, ap_l, ap_b, ap_r)
Result("\n\t Main area (application coordiantes): ["+ap_t+";"+ap_l+";"+ap_b+";"+ap_r+"]")

要找出作品的哪些区域space 可以实际用于图像,您可以使用 GetMaximalDocumentWindowRect() 命令。

The options parameter is a number that specifies various flags in its binary form.

  • INSIDE_APPLICATION = 0x00000001 // 1
  • EXCLUDE_FRAME = 0x00000002 // 2
  • EXCLUDE_DOCKED_FLOATING_WINDOWS = 0x000000F0 // 240 (Sum 16+32+64+128)

e.g. Get area which is limited on all four sides by the docked windows but ignore frames:
OPTION = 1+16+32+64+128 = 241

由于任何文档都可能部分或完全位于 visible workspace 区域之外,因此使用不带 INSIDE_APPLICATION 标志的此命令可提供完整的可用 'virtual' space 文档 windows.

您可以使用以下脚本:

void Output( number OPTION , number DRAW)
{
    Number T,L,B,R  // coordinates
    GetMaximalDocumentWindowRect(OPTION,t,l,b,r)
    string z = "000000000000"
    Result("\n ("+left( z, 10-len(Binary(OPTION))) + Binary(OPTION)+")")
    Result("\t Coordintates: ["+Format(t,"%6d")+","+Format(l,"%6d")+","+Format(b,"%6d")+","+Format(r,"%6d")+"]")
    if (DRAW) 
        NewScriptWindow("Test area ("+OPTION+")",t,l,b,r)
}

number DRAWIT = !TwoButtonDialog( "Output current maximum size to results.", "OK", "Also draw windows")
Output(1+2,DRAWIT)      ; result("\t Maximum window, exclude frame")
Output(1+2+240,DRAWIT)  ; result("\t Maximum window, limited by docked, exclude frame")