【问题标题】:how to save win form as image/pdf?如何将获胜表格保存为图像/pdf?
【发布时间】:2010-02-08 06:43:16
【问题描述】:

大家好, 我确实有一个中奖表格,它有点像售票机。 我有一个页面,我将在其中获取所有用户信息,然后单击一个名为 Generate Bill 的按钮将显示一个带有一些图像作为 ht 背景(例如公司徽标名称等)的 winform,其中放置了标签控件,它将显示以前表格中的信息。如何保存新的表格(票)?

我该怎么做?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    我的CC.Utilities 为Control 类添加了一个DrawToImage() 扩展方法,可能会对您有所帮助。稍后我会发布一些代码 sn-ps。

    辅助方法:

    /// <summary>
    /// Captures an <see cref="Image"/> of the specified window
    /// </summary>
    /// <param name="handle">The handle of the window to capture</param>
    /// <returns>An <see cref="Image"/> of the specified window</returns>
    public static Image CaptureWindow(IntPtr handle)
    {
    
        IntPtr hdcSrc = User32.GetWindowDC(handle);
    
        RECT windowRect = new RECT();
        User32.GetWindowRect(handle, windowRect);
    
        int width = windowRect.right - windowRect.left;
        int height = windowRect.bottom - windowRect.top;
    
        IntPtr hdcDest = Gdi32.CreateCompatibleDC(hdcSrc);
        IntPtr hBitmap = Gdi32.CreateCompatibleBitmap(hdcSrc, width, height);
    
        IntPtr hOld = Gdi32.SelectObject(hdcDest, hBitmap);
        Gdi32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, InteropConstants.SRCCOPY);
        Gdi32.SelectObject(hdcDest, hOld);
        Gdi32.DeleteDC(hdcDest);
        User32.ReleaseDC(handle, hdcSrc);
    
        Image image = Image.FromHbitmap(hBitmap);
        Gdi32.DeleteObject(hBitmap);
    
        return image;
    }
    

    P/调用:

    [DllImport("user32.dll")]
    public static extern IntPtr GetWindowDC(IntPtr hWnd);
    
    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr GetWindowRect(IntPtr hWnd, [Out] RECT rect);
    
    [DllImport("gdi32.dll")]
    public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hObjectSource, int nXSrc, int nYSrc, int dwRop);
    
    [DllImport("gdi32.dll")]
    public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth, int nHeight);
    
    [DllImport("gdi32.dll")]
    public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
    
    [DllImport("gdi32.dll")]
    public static extern bool DeleteDC(IntPtr hDC);
    
    [DllImport("gdi32.dll")]
    public static extern bool DeleteObject(IntPtr hObject);
    
    [DllImport("gdi32.dll")]
    public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
    
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Auto)]
    public class RECT
    {
        public int left;
        public int top;
        public int right;
        public int bottom;
    }
    

    扩展方法:

    /// <summary>
    /// Draws the <see cref="Control"/> to an <see cref="Image"/>
    /// </summary>
    /// <param name="control">The <see cref="Control"/> to draw.</param>
    /// <returns>An <see cref="Image"/> of the <see cref="Control"/></returns>
    public static Image DrawToImage(this Control control)
    {
        return Utilities.CaptureWindow(control.Handle);
    }
    

    命名空间在复制/粘贴时有点混乱,但如果您需要更多,您可以查看完整的项目,或者这可能足以为您指明正确的方向。

    【讨论】:

    • 听起来不错。请注意,Control 有一个 DrawToBitmap() 方法也可能对您有用。我为该方法被破坏的情况编写了此代码,例如在WebBrowser 控件上,该控件始终从DrawToBitmap()返回纯白色图像
    • +1 不错的答案。如果需要,可以使用 iTextSharp 或类似工具将图像添加到 PDF 文档中。
    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    相关资源
    最近更新 更多