掌上电脑:将控件绘制到位图

时间:2010-02-18 21:38:26

标签: c# .net windows-mobile compact-framework windows-ce

使用C#,我正在尝试将一个控件实例(比如一个面板或按钮)绘制到我的Pocket PC应用程序中的位图。 .NET控件具有漂亮的DrawToBitmap函数,但在.NET Compact Framework中不存在。

如何在Pocket PC应用程序中将控件绘制到图像上?

1 个答案:

答案 0 :(得分:5)

完整框架中的

DrawToBitmap通过向控件发送WM_PRINT消息以及要打印到的位图的设备上下文来工作。 Windows CE不包含WM_PRINT,因此该技术不起作用。

如果正在显示您的控件,您可以从屏幕复制控件的图像。以下代码使用此方法向DrawToBitmap添加兼容的Control方法:

public static class ControlExtensions
{        
    [DllImport("coredll.dll")]
    private static extern IntPtr GetWindowDC(IntPtr hWnd);

    [DllImport("coredll.dll")]
    private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

    [DllImport("coredll.dll")]
    private static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, 
                                      int nWidth, int nHeight, IntPtr hdcSrc, 
                                      int nXSrc, int nYSrc, uint dwRop);

    private const uint SRCCOPY = 0xCC0020;

    public static void DrawToBitmap(this Control control, Bitmap bitmap, 
                                    Rectangle targetBounds)
    {
        var width = Math.Min(control.Width, targetBounds.Width);
        var height = Math.Min(control.Height, targetBounds.Height);

        var hdcControl = GetWindowDC(control.Handle);

        if (hdcControl == IntPtr.Zero)
        {
            throw new InvalidOperationException(
                "Could not get a device context for the control.");
        }

        try
        {
            using (var graphics = Graphics.FromImage(bitmap))
            {
                var hdc = graphics.GetHdc();
                try
                {
                    BitBlt(hdc, targetBounds.Left, targetBounds.Top, 
                           width, height, hdcControl, 0, 0, SRCCOPY);
                }
                finally
                {
                    graphics.ReleaseHdc(hdc);
                }
            }
        }
        finally
        {
            ReleaseDC(control.Handle, hdcControl);
        }
    }
}