VBA用户表单图像的大小不同或计算机之间的保真度下降

时间:2019-06-27 10:11:09

标签: vba powerpoint powerpoint-vba

我将图像用作VBA用户窗体上的按钮。在一台计算机上可以正常工作,但是当我在另一台计算机上查看相同的用户窗体时,图像无法正确显示。

如果我将图像的PictureSizeMode设置为fmPictureSizeModeClip,则对于第二台计算机上的图像区域来说太大了-图像将被剪切。如果将PictureSizeMode设置为fmPictureSizeModeZoom,它可以在第二台计算机上针对图像区域正确缩放,但会损失很多保真度(看起来很糟糕)。在这两种情况下,第一台计算机上的图像都很好。

图像的原始图像格式为jpg。

我曾尝试在开发代码的计算机和第二台出现问题的计算机上更改屏幕分辨率。我无法以这种方式在第一台计算机上重现该问题(我还连接了一个古老的显示器,并且也可以正常显示)。通过这样做,我无法使问题在第二台计算机上消失。

这些是在VBE中选择的图像的屏幕截图:

在所有都能正确显示的第一台计算机上(无论设置为剪辑模式还是缩放模式,其外观都相同): http://code.commtap.org/vba/userform-images/no-problems-computer1.png

在第二台计算机上-PictureSizeMode设置为fmPictureSizeModeClip: http://code.commtap.org/vba/userform-images/clipped-computer2.png 并将PictureSizeMode设置为fmPictureSizeModeZoom: http://code.commtap.org/vba/userform-images/scaled-loss-of-fidelity-computer2.png

1 个答案:

答案 0 :(得分:0)

我发现无法令人满意地调整图片的大小,以使它们始终在不同的机器上看起来正确,因此我想出的解决方案是围绕图片调整其余表格的大小。

为此:

  • 将图像的PictureSizeMode设置为fmPictureSizeModeClip。

  • 在看起来正确的机器上以表格形式获取一幅图像的高度或宽度的度量值(以磅为单位)。

  • 根据此图像的尺寸更改设置表单和控件的尺寸。

    Private Sub AdjustFormSize()

      Dim dblDefaultRefImageHeight As Double
      ' This is the height of the reference image as computed on the
      ' machine where it looks right:
      dblDefaultRefImageHeight = 1947

      Dim dblActualRefImageHeight As Double
      dblActualRefImageHeight = Me.ImgRefImage.Picture.Height

      Dim dblSizeFactor As Double
      dblSizeFactor = dblActualRefImageHeight / dblDefaultRefImageHeight

      Me.Height = Me.Height * dblSizeFactor
      Me.Width = Me.Width * dblSizeFactor

      Dim ctlControl As Control

      For Each ctlControl In Me.Controls
        ctlControl.Top = ctlControl.Top * dblSizeFactor
        ctlControl.Left = ctlControl.Left * dblSizeFactor

        ctlControl.Height = ctlControl.Height * dblSizeFactor
        ctlControl.Width = ctlControl.Width * dblSizeFactor

        If TypeName(ctlControl) = "Label" Then
          ctlControl.Font.Size = ctlControl.Font.Size * dblSizeFactor
        End If
      Next ctlControl

    End Sub

将其放在用户窗体中,并在创建窗体时调用它-例如从UserForm_Initialize()。