掌上电脑:绘制控制位图 [英] Pocket PC: Draw control to bitmap

查看:189
本文介绍了掌上电脑:绘制控制位图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用C#,我试图绘制控件的一个实例,说面板或按钮,位图在我的Pocket PC应用程序。 .NET控件有漂亮的DrawToBitmap功能,但它不能在.NET Compact Framework的存在。

Using C#, I'm trying to draw an instance of a control, say a panel or button, to a bitmap in my Pocket PC application. .NET controls has the nifty DrawToBitmap function, but it does not exist in .NET Compact Framework.

我如何去画一个控件的图像中的Pocket PC应用程序?

How would I go about painting a control to an image in a Pocket PC application?

推荐答案

DrawToBitmap 在全框架的工作原理是发送的 WM_PRINT 消息控制,随着一个设备上下文位图打印。 Windows CE不包括 WM_PRINT ,所以这种技术将无法工作。

DrawToBitmap in the full framework works by sending the WM_PRINT message to the control, along with the device context of a bitmap to print to. Windows CE doesn't include WM_PRINT, so this technique won't work.

如果显示您的控件,您可以复制从屏幕控制的图像。下面code使用这种方法来兼容 DrawToBitmap 方法添加到控制

If your control is being displayed, you can copy the image of the control from the screen. The following code uses this approach to add a compatible DrawToBitmap method to 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);
        }
    }
}

这篇关于掌上电脑:绘制控制位图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆