GMS3 中对话框图形的部署是否发生了变化?

Has deployment of dialog graphics changed in GMS3?

我在 DM 对话中大量使用图形元素,主要用于视觉反馈。虽然我已经在 GMS1 和 GMS2 中成功地使用了这些,但我还没有让它们在 GMS3 中正常运行。我想知道我是否错误地部署了它们。下面的示例脚本说明了我的两个主要问题,图形元素的大小与其关联的位图之间的不匹配,以及位图值 240 或 RGB(240, 240, 240) 的奇怪对比度映射(到黑色):

    class ModelessDialogWithGraphic : UIFrame
    {
        Object Init(Object self)
        {
            TagGroup dialogSpec = DLGCreateDialog("");
            TagGroup dialogItems = dialogSpec.DLGGetItems();

            Number graphicW = 256;
            Number graphicH = graphicW / 4;
            Image graphicImage := RealImage("Graphic Image", 4, graphicW, graphicH);
            graphicImage = icol;

            // Add labeled box with graphic
            TagGroup boxSpec = DLGCreateBox("Graphic");
            TagGroup boxItems = boxSpec.DLGGetItems();
            TagGroup graphicSpec = DLGCreateGraphic(graphicW, graphicH);
            graphicSpec.DLGAddBitMap(graphicImage);
            boxItems.DLGAddElement(graphicSpec);
            dialogItems.DLGAddElement(boxSpec);

            return self.super.Init(dialogSpec);
        }
    }

    void main()
    {
        Object dialog = Alloc(ModelessDialogWithGraphic).Init();
        dialog.Display("Dialog Graphic Test");
    }

    main();

至少在 GMS 3.4 中,位图似乎只填充指定图形区域的左上四分之一。然而,这个问题很复杂,因为我观察到的行为似乎随着 Windows 显示缩放选项和 Windows 的特定版本而改变。目前,在 GMS 3.4 和最新的 Win10 更新中,我发现以下经过修改的 Init 方法提供了可维护(虽然丑陋)的解决方法:

        Object Init(Object self)
        {
            TagGroup dialogSpec = DLGCreateDialog("");
            TagGroup dialogItems = dialogSpec.DLGGetItems();

            Number graphicW = 256;
            Number graphicH = graphicW / 4;
            Image graphicImage := RealImage("Graphic Image", 4, graphicW, graphicH);
            graphicImage = icol;
            graphicImage = (graphicImage == 240) ? 241 : graphicImage

            // Add labeled box with graphic
            Number scaler = 0.5;
            TagGroup boxSpec = DLGCreateBox("Graphic");
            TagGroup boxItems = boxSpec.DLGGetItems();
            TagGroup graphicSpec = DLGCreateGraphic(scaler * graphicW, scaler * graphicH);
            graphicSpec.DLGAddBitMap(graphicImage);
            boxItems.DLGAddElement(graphicSpec);
            dialogItems.DLGAddElement(boxSpec);

            return self.super.Init(dialogSpec);
        }

不过,我担心这些解决方法可能会在未来的 GMS 版本中失效。有没有人找到在 GMS3 中部署对话框图形的更好或更正确的方法?

Windows10 应用程序的 dpi 缩放确实导致了很多错误绘制 UI 问题。其中一些需要在 dpi 更改后重新启动应用程序,但其中一些是 'permanent'.

我认为您提到的两个问题是应该在 Gatan software issue reporting 站点报告的错误。

您的静态 'scaling' 修复确实太脆弱了,因为需要针对不同的显示 dpi 设置确定比例的确切值。我不知道在这个阶段可以让您获得此信息的脚本命令。

至于颜色替换为透明:如果我不得不猜测的话,那么一直都是这样,但是确切的颜色代表了 GMS 2 中的背景色,而在 GMS 3 中则不再如此。所以它也可能是 GMS 3 版本的 oversight/bug,应该报告。