代码之家  ›  专栏  ›  技术社区  ›  Patrick angularsen

Pocket PC:将控件绘制到位图

  •  1
  • Patrick angularsen  · 技术社区  · 14 年前

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

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

    1 回复  |  直到 14 年前
        1
  •  5
  •   Phil Ross Matt Johnson-Pint    14 年前

    DrawToBitmap 在整个框架中,通过发送 WM_PRINT 发送给控件的消息,以及要打印到的位图的设备上下文。Windows CE不包括 WMX打印 所以这项技术不起作用。

    如果显示控件,则可以从屏幕复制控件的图像。以下代码使用此方法添加兼容的 绘制位图 方法到 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);
            }
        }
    }