winforms Picturebox在将MetaFile分配给图像时抛出“参数无效”

xmakbtuz  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(134)

.Net 4.7.2. Winforms.
呈现充满文本和图形的复杂页面。我用的是位图。然后,我通过调整PictureBox的大小并将其放置到一个滚动面板中,在预览窗口中显示它。
它可以完美地工作到位图,当然除了它需要的2GB RAM。因此,现在我正试图去一个元文件,以保存RAM,并希望使一些可扩展的。然而,当我这样做时,预览代码在Width. GET上显示“参数无效”。这在ShowDialog上发生在“预览”窗口中。
我已验证图元文件未被意外释放。它仍然存在,并作为byref参数传入预览窗口。
下面是代码:

' In the button event handler to create the file
    Dim gr As Graphics = Me.CreateGraphics()
    Dim hdc As IntPtr = gr.GetHdc()
    ' [snip irrelevant code]
    Try
        ' [snip irrelevant code]
        ' [pagewidth and pageheight are paper size in inches * DPI chosen = pixels]
        _pedWMF = New Metafile(hdc, 
                               New Rectangle(0, 0, pageWidth, pageHeight), 
                               MetafileFrameUnit.Pixel)
        _PedigreeCanvas = Graphics.FromImage(_pedWMF)
        _PedigreeCanvas.PageUnit = GraphicsUnit.Pixel

    ' [snip irrelevant code]
    ' Text and images rendered in this call
    RenderPedigree(PedigreeCanvas)
    ' [snip irrelevant code]
    ' Call to preview window to show dialog.

下面是预览中的代码...

Private Sub LayoutPreviewImage()
    _iPageWidth = Convert.ToInt32(Me.DeviceDpi * (Convert.ToDouble(_drvPaperSize("PS_WIDTH")) / 100))
    _iPageHeight = Convert.ToInt32(Me.DeviceDpi * (Convert.ToDouble(_drvPaperSize("PS_HEIGHT")) / 100))
    SuspendLayout()
    Dim p As New PictureBox()
    p.Name = "pbPreview"
    p.Width = _iPageWidth
    p.Height = _iPageHeight
    '*** The _wmfPreview variable is properly initialized with the Metafile created above.
    If _wmfPreview IsNot Nothing Then p.Image = _wmfPreview
    p.SizeMode = PictureBoxSizeMode.Zoom
    pPagePreview.Controls.Add(p)
    pPagePreview.Location = New Point(0, 0)
    pPagePreview.Width = _iPageWidth + Convert.ToInt32(Math.Round(DeviceDpi * 0.5))
    pPagePreview.Height = _iPageHeight + Convert.ToInt32(Math.Round(DeviceDpi * 0.5))
    p.Left = Convert.ToInt32(Math.Round(DeviceDpi * 0.25))
    p.Top = Convert.ToInt32(Math.Round(DeviceDpi * 0.25))
    p.BackColor = Color.White
    ResumeLayout()
End Sub

然后当我showDialog()时,我得到了异常。
如果我查看调试器,MetaFile会抛出宽度和高度以及许多其他属性的异常。我知道我有一些可悲的不正确的编码,但我不知道是什么。我以前用 Delphi 很容易做到这一点。我错过了一些东西;请帮我找一下。
谢谢你的帮助

wmvff8tz

wmvff8tz1#

好吧,答案找到了。不是在MS文档中,而是在不同的堆栈溢出答案中。
无论何时完成对要绘制到图元文件中的Graphics对象的处理,都需要刷新和/或处置Graphics对象以将这些更改提交到图元文件中。就像这样:

RenderPedigree(PedigreeCanvas, PedigreeCanvas)
        PedigreeCanvas.Flush()
        PedigreeCanvas.Dispose()
        PedigreeCanvas = Nothing

这样就行了

相关问题