Pocket PC: Draw control to bitmap

前端 未结 1 769
臣服心动
臣服心动 2021-01-24 04:16

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

相关标签:
1条回答
  • 2021-01-24 04:40

    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.

    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);
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题